For-Loop 的替代方案:如何在 R 中使用滚动 window 进行提升?

Alternative to For-Loop: How to use rolling window for boosting in R?

我正在寻求帮助来优化我的代码以摆脱循环并提高计算速度。我对这个领域和 R 都很陌生。 我 运行 在具有滚动 window 的线性时间序列模型上进行组件明智的梯度提升回归。我对每个 window 使用 X 上回归 y 的系数来预测下一个 "out of window" 观察值 y。 (稍后我会评估预测准确性)

我的数据是 1560 个不同的时间序列(包括原始序列的滞后)和大约 540 个观察值(数据框尺寸为 540x1560)

我调查了 rollapply 但无法正常工作。特别是我不知道如何为每个 window(每次迭代)预测 yhat。

#Define windows size
w=100
##Starting Loop, rolling the window by one observation per iteration 
#Predicting the next dependent variable y_hat(w+i) with the data from the "pseudo" most recent observation
for (i in 1:(nrow(df_all)-w)){
glm1 <- glmboost(fm, data=df_all[i:(w-1+i), ], center=TRUE, control=boost_control(mstop = 100, trace=TRUE)) 
ls_yhat[[i]] <- predict(glm1, newdata = df_all[w-1+i,])
}

感谢任何提示(在我的笔记本电脑上永远 运行)!

PS:我也在考虑使用 multicoreparallel 包。特别是 b/c 稍后我将使用交叉验证作为停止标准。但我刚刚开始调查它。但是,也非常感谢有关这方面的任何提示!

编辑:使用内置数据(虽然不是时间序列)的最小工作示例:

library("mboost") ## load package
data("bodyfat", package = "TH.data") ## load data

##Initializing List for coefficients DFs
ls_yhat <- list()

#Define windows size
w=30
##Starting Loop, rolling the window by one observation per iteration 
##Predicting the next dependent variable y_hat(w+i) with the data from the "pseudo" most recent observation
for (i in 1:(nrow(bodyfat)-w)){
  glm1 <- glmboost(DEXfat~., data=bodyfat[i:(w-1+i), ], center=TRUE, control=boost_control(mstop = 15, trace=TRUE)) 
  ls_yhat[[i]] <- predict(glm1, newdata = bodyfat[(w-1+i),])
  i
}

正如 Vlo 正确提到的那样,瓶颈是增强算法。我使用 package:foreachdoParallel 将 运行 时间减半。我想分享我的解决方案。

library("mboost") ## load package
data("bodyfat", package = "TH.data") ## load data
library("foreach")
library("doParallel")

##Register backend for parallel execution
registerDoParallel()

##Initializing List for coefficients DFs
ls_yhat <- list()

#Define windows size
w=30
##Starting Loop, rolling the window by one observation per iteration 
##Predicting the next dependent variable y_hat(w+i) with the data from the "pseudo" most recent observation
ls_yhat <- foreach (i = 1:(nrow(bodyfat)-w), .packages='mboost') %dopar%{
  glm1 <- glmboost(DEXfat~., data=bodyfat[i:(w-1+i), ], center=TRUE, control=boost_control(mstop = 15, trace=TRUE)) 
  ls_yhat[[i]] <- predict(glm1, newdata = bodyfat[(w-1+i),])
}