12

に保存されているデータを使用して、R でローリング回帰を実行していdata.tableます。

私は動作するバージョンを持っていますが、ハックのように感じます-パッケージから知っていることを実際に使用してzooおり、魔法は何もありませんdata.table...したがって、本来よりも遅く感じます.

Joshua の提案 (以下) を組み込むlm.fitと、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

ここここに示されている知識を適用しようとして、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')
4

2 に答える 2

5

私の知る限りではありません。data.tableウィンドウをローリングするための特別な機能はありません。j他のパッケージは既にベクトルにローリング機能を実装しているため、 of で使用できますdata.table。それらが十分に効率的ではなく、より高速なバージョンのパッケージがない場合 (?)、より高速なバージョンを自分で作成し、(もちろん) それらを既存のパッケージに追加するか、独自のパッケージを作成して提供する必要があります。

関連する質問 (リンク内のリンクをたどる) :

data.table を使用して rollapply
R を高速化する data.table スライディング ウィンドウ
R の複数の列に対するローリング回帰

于 2012-08-28T10:51:31.723 に答える