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:我也在考虑使用 multicore
或 parallel
包。特别是 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:foreach
和 doParallel
将 运行 时间减半。我想分享我的解决方案。
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),])
}
我正在寻求帮助来优化我的代码以摆脱循环并提高计算速度。我对这个领域和 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:我也在考虑使用 multicore
或 parallel
包。特别是 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:foreach
和 doParallel
将 运行 时间减半。我想分享我的解决方案。
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),])
}