r - 是否有_fast_ 方法在data.table 中运行滚动回归?

标签 r data.table zoo

我正在 R 中运行滚动回归,使用存储在 data.table 中的数据.

我有一个可用的版本,但感觉就像一个黑客——我真的在使用我从 zoo 中知道的东西包,并且没有 data.table 中的任何魔法......因此,它感觉比它应该的要慢。

结合 Joshua 的建议 - 下面 - 使用 lm.fit 可将速度提高约 12 倍而不是 lm .

(修改)示例代码:

require(zoo)
require(data.table)
require(rbenchmark)
set.seed(1)

tt <- seq(as.Date("2011-01-01"), as.Date("2012-01-01"), by="day")
px <- rnorm(366, 95, 1)

DT <- data.table(period=tt, pvec=px)

dtt <- DT[,tnum:=as.numeric(period)][, list(pvec, tnum)]
dtx <- as.matrix(DT[,tnum:=as.numeric(period)][, tnum2:= tnum^2][, int:=1][, list(pvec, int, tnum, tnum2)])

rollreg <- function(dd) coef(lm(pvec ~ tnum + I(tnum^2), data=as.data.frame(dd)))
rollreg.fit <- function(dd) coef(lm.fit(y=dd[,1], x=dd[,-1]))

rr <- function(dd) rollapplyr(dd, width=20, FUN = rollreg, by.column=FALSE)
rr.fit <- function(dd) rollapplyr(dd, width=20, FUN = rollreg.fit, by.column=FALSE)

bmk <- benchmark(rr(dtt), rr.fit(dtx), 
         columns = c('test', 'elapsed', 'relative'),
         replications = 10,
         order = 'elapsed'
       )

     test elapsed relative
2 rr.fit(dtx)    0.48   1.0000
1     rr(dtt)    5.85  12.1875

尝试应用所展示的知识 herehere ,我编造了下面这个简单的滚动回归函数,我认为它使用了data.table操作的一些速度。

请注意,问题有点不同(而且更现实):取一个向量,添加滞后,然后自行回归。这类 AR 类型的问题非常广泛。

我在这里分享它,因为它可能有用,我是 确定 它可以改进(我会随着改进而更新):
require(data.table)
set.seed(1)
x  <- rnorm(1000)
DT <- data.table(x)
DTin <- data.table(x)

lagDT <- function(DTin, varname, l=5)
{
    i = 0
    while ( i < l){
        expr <- parse(text = 
                  paste0(varname, '_L', (i+1), 
                     ':= c(rep(NA, (1+i)),', varname, '[-((length(',     varname, ') - i):length(', varname, '))])'
                 )
              )
    DTin[, eval(expr)]
    i <- i + 1
}
return(DTin)
}   

rollRegDT <- function(DTin, varname, k=20, l=5)
{
adj <- k + l - 1
.x <- 1:(nrow(DTin)-adj)
DTin[, int:=1]
dtReg <- function(dd) coef(lm.fit(y=dd[-c(1:l),1], x=dd[-c(1:l),-1]))
eleNum <- nrow(DTin)*(l+1)
outMatx <- matrix(rep(NA, eleNum), ncol = (l+1))
colnames(outMatx) <- c('intercept', 'L1', 'L2', 'L3', 'L4', 'L5')
for (i in .x){
    dt_m <- as.matrix(lagDT(DTin[i:(i+adj), ], varname, l))
    outMatx[(i+(adj)),] <- dtReg(dt_m)
}
return(outMatx)
}

rollCoef <- rollRegDT(DT, varname='x')

最佳答案

据我所知,没有; data.table滚动窗口没有任何特殊功能。其他包已经在向量上实现了滚动功能,因此它们可以在 j 中使用。的 data.table .如果它们不够高效,并且没有包具有更快的版本(?),那么就是自己编写更快版本并(当然)贡献它们的情况:要么添加到现有包中,要么创建自己的包。

相关问题(按照链接中的链接):

Using data.table to speed up rollapply
R data.table sliding window
Rolling regression over multiple columns in R

关于r - 是否有_fast_ 方法在data.table 中运行滚动回归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139934/

相关文章:

r - 统计r列中多个字符串中的多个字符

r - pglm 不使用本地环境中的任何变量

r - 对空白缺失值使用不同长度的 data.table 的 fread

r - 使用动态列名以编程方式分配 data.table 中的列

r - 将每日级别的数据聚合到 R 中的每周级别

r - 如何在 ggplot2 中绘制通过 fastshp 加载的 shapefile?

r - 将 fig.cap 设置为 options$label

r - 使用条件函数在 data.table() 中分配多列

r - 为什么 read.zoo 在时间可用时将索引作为日期

R Zoo绘制多年数据重叠的图