首页 文章

R:分组滚动窗口线性回归与rollapply和ddply

提问于
浏览
1

我有一个包含多个分组变量的数据集,我想在其上运行滚动窗口线性回归 . 最终目标是提取具有最低斜率的10个线性回归并将它们平均在一起以提供平均最小变化率 . 我找到了使用rollapply来计算滚动窗口线性回归的示例,但是我有一个额外的复杂性,我想将这些线性回归应用于数据集中的组 .

这是一个示例数据集和我当前的代码,它很接近并且不太起作用 .

dat<-data.frame(w=c(rep(1,27), rep(2,27),rep(3,27)), z=c(rep(c(1,2,3),27)), 
x=c(rep(seq(1,27),3)), y=c(rnorm(27,10,3), rnorm(27,3,2.2), rnorm(27, 6,1.3)))

其中w和z是两个分组变量,x和y是回归项 .

从我的互联网搜索这里是一个基本滚动窗口线性回归代码,其中窗口大小为6,连续回归由3个数据点分隔,我只提取斜率coef(lm ...)[2]

library(zoo)    
slopeData<-rollapply(zoo(dat), width=6, function(Z) { 
coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
}, by = 3, by.column=FALSE, align="right")

现在我希望将此滚动窗口回归应用于由两个分组变量w和z指定的组 . 所以我尝试使用plyr包中的ddply这样的东西 . 首先,我尝试将上面的代码重写为函数 .

rolled<-function(df) {
    rollapply(zoo(df), width=6, function(Z) { 
    coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
    }, by = 3, by.column=FALSE, align="right")
}

然后使用ddply运行应用该功能

groupedSlope <- ddply(dat, .(w,z), function(d) rolled(d))

但是,这不起作用,因为我收到一系列警告和错误 . 我想,一些错误可能与动物园格式和数据框的组合有关,这变得过于复杂 . 这是我到目前为止所做的工作,但有没有人知道一种获得分组滚动窗口线性回归的方法,可能比这种方法更简单?

谢谢你的帮助,Nate

1 回答

  • 2

    1) rollapply 也适用于数据帧,所以没有必要将 df 转换为动物园 .

    2) lm 使用 na.action ,而不是 na.rm ,它的默认值是 na.omit 所以我们可以放弃这个参数 .

    3) rollapplyr 是一种更简洁的方式来编写 rollapply(..., align = "right") .

    假设 rolled 否则执行您想要的操作并将这些更改合并到 rolled 中,问题中的 ddply 语句应该有效,或者我们可以使用R的基数 by ,我们将在下面显示:

    rolled <- function(df) {
        rollapplyr(df, width = 6, function(m) { 
              coef(lm(formula = y ~ x, data = as.data.frame(m)))[2]
           }, by = 3, by.column = FALSE
       )
    }
    do.call("rbind", by(dat, dat[c("w", "z")], rolled))
    

相关问题