这个问题建立在前一个问题的基础之上,这个问题在这里得到了很好的回答。
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
的函数,但是按因子trial
和vial
对回归进行分组。
以下代码来自我之前的问题的答案(仅针对完整数据集而非实践数据进行修改)
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
的原因似乎消除了错误(如果可能仍然提供不适当的回归条款)?
谢谢
答案 0 :(得分:2)
rollapply
将矩阵传递给函数,因此只传递数字列。使用我之前回答中的rolled
和该问题中的设置:
do.call("rbind", by(dat[c("x", "y")], dat[c("w", "z")], rolled))
<强>加强>
另一种方法是在行索引上而不是在数据帧本身上执行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))