我有数据
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
给出了时间点。我希望根据y
和y
上x1
使用前面的时间点的回归,在每个时间点获得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]
但使用它们来获得预期值会更好。
答案 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