1

这个问题建立在上一个问题的基础上,在这里我得到了很好的回答。

R:使用 rollapply 和 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

我不确定这个错误来自哪里,因为我已经展示了两者elapsed并且O2sat是数字,所以我没有回归因素。但是,如果我在上面的函数中强制它们都是数字rolled,就像这样。

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

我不再收到错误,但是,我不知道为什么这会解决错误。此外,由此产生的回归似乎是可疑的,因为截距项似乎太小了。

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

谢谢

4

1 回答 1

2

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

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

添加

另一种方法是对行索引而不是数据框本身执行滚动应用。在此示例中,我们还添加了条件变量作为额外的输出列:

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))
于 2015-02-04T23:05:18.950 回答