【问题标题】:Using Rollapply to return both the Coefficient and RSquare使用 Rollapply 返回 Coefficient 和 Rsquare
【发布时间】: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)]

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

  1. 有没有更好的方法来捕获 rollapply 中的最后 10 个项目,而不是将行号作为变量 a 传递,然后执行 subdtset
  2. 有没有办法从一个 rollapply 语句中返回 2 个值?如果我只需要进行一次回归,然后从中获取系数并计算 R 方,我认为我可以节省大量时间。两次执行相同的计算是非常低效的。

感谢您的帮助!

【问题讨论】:

  • (2) 返回一个list(并用asplit(.,2)包裹)并赋值给两个值,例如dtset[, c("a","b") := asplit(rollapply(..., FUN=function(a) { ...; list(1, 2);}),2)]
  • 谢谢你!我不知道 asplit 函数。

标签: r zoo rollapply


【解决方案1】:

使用by.column = FALSE 将两列都传递给函数。在函数中直接计算斜率和 r 平方以避免lm.fit 的开销。请注意,rollapply 可以返回一个向量,并且末尾带有 rrollapplyr 是右对齐的。如果 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 

【讨论】:

  • 我刚刚学会了by.column= 并且喜欢它
  • 谢谢你。我之前看过 by.column 输入,但我不知道输入整个数据表。你的例子对我的工作很有帮助。
  • (不过,在玩它时,我有点恼火Xmatrix,而不是data.framedata.table。:-( )
  • @r2evans,zoo 的想法是提供一个不规则间隔的 ts 版本,而 ts 是基于向量和矩阵的。阅读design vignette 了解动物园的目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2012-08-22
  • 2021-11-16
  • 2016-02-22
  • 1970-01-01
  • 2015-04-03
相关资源
最近更新 更多