我有一个如下所示的数据集:
data.table(x=c(11:30),y=rnorm(20))我想计算一下过去10项的滚动回归系数和平方:
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)]上面的代码实现了这一点,但是我的数据集有数百万行,而且我有多个列,我想在其中进行这些计算,因此需要很长时间。我希望有一种方法可以加快速度:
谢谢你的帮助!
发布于 2021-09-12 18:44:38
使用by.column = FALSE将两列传递给函数。在函数中,直接计算斜率和r平方,以避免lm.fit的开销。请注意,rollapply可以返回一个向量,并且rollapplyr的末尾有一个r,并对齐。如果dtset由单个x列和多个y列组成,这同样有效,如下面使用内置anscombe数据框架的示例所示。
library(data.table)
library(zoo)
stats <- function(X, x = X[, 1], y = X[, -1]) {
c(slope = cov(x, y) / var(x), rsq = cor(x, y)^2)
}
rollapplyr(dtset, 10, stats, by.column = FALSE, fill = NA)
a <- anscombe[c("x3", "y1", "y2", "y3")]
rollapplyr(a, 3, stats, by.column = FALSE, fill = NA)检查
我们使用内置的BOD数据框架检查公式.
fm <- lm(demand ~ Time, BOD)
c(coef(fm)[[2]], summary(fm)$r.squared)
## [1] 1.7214286 0.6449202
stats(BOD)
## slope rsq
## 1.7214286 0.6449202 https://stackoverflow.com/questions/69154039
复制相似问题