从回归中“累积”预期值的矢量化

时间:2018-03-29 09:46:35

标签: r data.table vectorization

我有数据

set.seed(42)
dat <- data.frame(t=1:1000,x1=runif(1000,1,10),x2=round(runif(1000,0,1)))
dat$y <- 8*dat$x1 - 5*dat$x2 + rnorm(1000)

> head(dat)
  t       x1 x2        y
1 1 9.233254  1 71.19109
2 2 9.433679  0 75.99355
3 3 3.575256  1 24.57278
4 4 8.474029  1 63.16920
5 5 6.775710  0 53.20974
6 6 5.671864  0 44.77743

其中t给出了时间点。我希望根据yyx1使用前面的时间点的回归,在每个时间点获得x2的预期值。

我可以在for循环中执行此操作,但我想知道是否存在data.table的解决方案。在related question中,Michael Chirico对如何进行回归并得到系数给出了很好的暗示,

dat[dat, on=.(t<t), allow.cartesian = TRUE, nomatch=0L][ , as.list(coef(lm(y ~ x1 + x2))), keyby = t]

但使用它们来获得预期值会更好。

1 个答案:

答案 0 :(得分:1)

可能你想要这样的东西:

dat[dat, on=.(t<t), allow.cartesian = TRUE, nomatch=0L][ , .( exp=predict(lm(y ~ x1 + x2),list(x1=i.x1[1],x2=i.x2[1]))), keyby = t]

       t        exp
  1:    2  71.191094
  2:    3 -64.382779
  3:    4  64.935556
  4:    5  54.437024
  5:    6  44.693841
 ---                
995:  996  17.828209
996:  997  47.443171
997:  998  12.177957
998:  999  43.640271
999: 1000   3.516452

无论如何,这种方法在内存使用方面可能非常低效(例如,这个小例子已经创建了499500行的丢弃数据。)。

我会使用一个简单的for循环而不需要data.table(它需要或多或少同时):

expected <- rep.int(NA,nrow(dat))
for(n in 2:nrow(dat)){
  LM <- lm(y~x1+x2,data=dat[1:(n-1),])
  expVal <- predict(LM,dat[n,])
  expected[n] <- expVal
}
dat$exp <- expected

> dat
        t       x1 x2         y        exp
1       1 9.233254  1 71.191094         NA
2       2 9.433679  0 75.993552  71.191094
3       3 3.575256  1 24.572780 -64.382779
4       4 8.474029  1 63.169202  64.935556
5       5 6.775710  0 53.209744  54.437024
6       6 5.671864  0 44.777425  44.693841
7       7 7.629295  1 56.199610  57.353776