首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rollapply返回系数和RSquare

使用Rollapply返回系数和RSquare
EN

Stack Overflow用户
提问于 2021-09-12 18:05:31
回答 1查看 119关注 0票数 1

我有一个如下所示的数据集:

代码语言:javascript
复制
data.table(x=c(11:30),y=rnorm(20))

我想计算一下过去10项的滚动回归系数和平方:

代码语言:javascript
复制
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)]

上面的代码实现了这一点,但是我的数据集有数百万行,而且我有多个列,我想在其中进行这些计算,因此需要很长时间。我希望有一种方法可以加快速度:

  1. 是否有更好的方法来捕获rollapply中的最后10个项,而不是将行号作为变量a传递,然后执行subdtset <- dtseta?我试着使用.SD和.SDcols,但没能让它起作用。我只知道如何获得rollapply以接受一个列或向量作为输入,而不是两个columns/vectors.
  2. Is有一种方法从一个rollapply语句返回2个值?我想我可以节省大量的时间,如果我只需要做一次回归,然后从这取系数,并计算RSquare。两次同样的计算效率很低。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-12 18:44:38

使用by.column = FALSE将两列传递给函数。在函数中,直接计算斜率和r平方,以避免lm.fit的开销。请注意,rollapply可以返回一个向量,并且rollapplyr的末尾有一个r,并对齐。如果dtset由单个x列和多个y列组成,这同样有效,如下面使用内置anscombe数据框架的示例所示。

代码语言:javascript
复制
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数据框架检查公式.

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69154039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档