可能你想要这样的东西:
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行的一次性data.table!)。
我会使用一个简单的for循环,而不需要数据。表(或多或少需要相同的时间):
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