2

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

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

我调查了rollapply但无法让它工作。特别是我不知道如何预测每个窗口(每次迭代)的 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
}
4

1 回答 1

0

正如 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),])
}
于 2016-09-10T14:30:11.900 回答