代码之家  ›  专栏  ›  技术社区  ›  bumblebee

回归“累积”期望值的矢量化

  •  1
  • bumblebee  · 技术社区  · 7 年前

    我有数据

    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 。在a中 related question ,MichaelChirico就如何进行回归并获得系数给出了极好的提示,

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   digEmAll    7 年前

    可能你想要这样的东西:

    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