首页 文章

R:rollapplyr和lm因子错误:rollapplyr是否更改了变量类?

提问于
浏览
1

这个问题 Build 在前一个问题的基础之上,这个问题对我很有帮助 .

R: Grouped rolling window linear regression with rollapply and ddply

难道你不知道代码在扩展到真实数据而不是示例数据时不能正常工作吗?

我有一个有点大的数据集,具有以下特征 .

str(T0_satData_reduced)
'data.frame':   45537 obs. of  5 variables:
 $ date   : POSIXct, format: "2014-11-17 08:47:35" "2014-11-17 08:47:36" "2014-11-17 08:47:37" ...
 $ trial  : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ vial   : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ O2sat  : num  95.1 95.1 95.1 95.1 95 95.1 95.1 95.2 95.1 95 ...
 $ elapsed: num  20 20 20.1 20.1 20.1 ...

上一个问题涉及将 O2sat 的滚动回归应用为 elapsed 的函数的愿望,但将回归分类为因子 trialvial .

以下代码是从我之前的问题的答案中得出的(只是为完整的数据集而不是实践数据而修改)

rolled <- function(df) {
   rollapplyr(df, width = 600, function(m) { 
   coef(lm(formula = O2sat ~ elapsed, data = as.data.frame(m)))
   }, by = 60, by.column = FALSE)
 }

T0_slopes <- ddply(T0_satData_reduced, .(trial,vial), function(d) rolled(d))

但是,当我运行此代码时,我会收到一系列错误或警告(前两个) .

Warning messages:
1: In model.response(mf, "numeric") :
using type = "numeric" with a factor response will be ignored
2: In Ops.factor(y, z$residuals) : - not meaningful for factors

我不确定这个错误来自哪里,因为我已经显示 elapsedO2sat 都是数字,所以我没有回归因素 . 但是,如果我强制它们在上面的 rolled 函数中都是数字,就像这样 .

...
coef(lm(formula = as.numeric(O2sat) ~ as.numeric(elapsed), data = as.data.frame(m)))
...

我不再得到错误,但是,我不知道为什么这会解决错误 . 此外,由此产生的回归看起来很可疑,因为拦截术语似乎不合适 .

有关为什么我收到这些错误以及为什么使用 as.numeric 的想法似乎消除了错误(如果可能仍然提供不适当的回归条款)?

谢谢

1 回答

  • 2

    rollapply 将矩阵传递给函数,因此只传递数字列 . 使用我之前的答案中的 rolled 和该问题中的设置:

    do.call("rbind", by(dat[c("x", "y")], dat[c("w", "z")], rolled))
    

    Added

    另一种方法是在行索引上而不是在数据帧本身上执行rollapply . 在这个例子中,我们还将条件变量添加为额外输出列:

    rolli <- function(ix) {
       data.frame(coef = rollapplyr(ix, width = 6, function(ix) { 
             coef(lm(y ~ x, data = dat, subset = ix))[2]
          }, by = 3), w = dat$w[ix][1], z = dat$z[ix][1])
    }
    do.call("rbind", by(1:nrow(dat), dat[c("w", "z")], rolli))
    

相关问题