【发布时间】:2021-09-12 18:05:31
【问题描述】:
我有一个如下所示的数据集:
data.table(x=c(11:30),y=rnorm(20))
我想计算最后 10 项的滚动回归系数和 rsquared:
dtset[,coefficient:=rollapply(1:20,width=10,FUN=function(a) {
subdtset <- dtset[a]
reg <- lm.fit(matrix(data=c(subdtset$x, rep(1,nrow(subdtset))), nrow=nrow(subdtset), ncol=2), subdtset$y)
return(coef(reg)[1])
},align="right",fill=NA)]
dtset[,rsquare:=rollapply(1:20,width=10,FUN=function(a) {
subdtset <- dtset[a]
reg <- lm.fit(matrix(data=c(subdtset$x, rep(1,nrow(subdtset))), nrow=nrow(subdtset), ncol=2), subdtset$y)
return(1 - sum((subdtset$y - reg$fitted.values)^2) / sum((subdtset$y - mean(subdtset$y, na.rm=TRUE))^2))
},align="right",fill=NA)]
上面的代码实现了这一点,但我的数据集有数百万行,并且我有多个列,我想在其中进行这些计算,因此需要很长时间。我希望有一种方法可以加快速度:
- 有没有更好的方法来捕获 rollapply 中的最后 10 个项目,而不是将行号作为变量 a 传递,然后执行 subdtset
- 有没有办法从一个 rollapply 语句中返回 2 个值?如果我只需要进行一次回归,然后从中获取系数并计算 R 方,我认为我可以节省大量时间。两次执行相同的计算是非常低效的。
感谢您的帮助!
【问题讨论】:
-
(2) 返回一个
list(并用asplit(.,2)包裹)并赋值给两个值,例如dtset[, c("a","b") := asplit(rollapply(..., FUN=function(a) { ...; list(1, 2);}),2)]。 -
谢谢你!我不知道 asplit 函数。