R语言中h>2的样本外滚动窗口失业率预测实现问题
适配h>2的滚动窗口失业率预测实现方案
核心思路
原有代码仅存储了单步(h=1)预测值,要实现多步(h>2,此处以h=12为例)滚动窗口预测,需调整结果存储结构为矩阵(每行对应一个滚动窗口,每列对应一个预测步长),并修正循环边界以确保每个窗口后有足够的样本外观测值。
完整实现代码
library(forecast) # 示例失业率数据(替换为你的FRED数据) x <- c(4.1, 4, 4, 3.8, 4, 3.8, 3.8, 3.7, 3.8, 3.8, 3.9, 4, 3.8, 3.8, 3.6, 3.6, 3.6, 3.7, 3.7, 3.5, 3.6, 3.6, 3.6, 3.5, 3.5, 4.4, 14.7, 13.2, 11, 10.2, 8.4, 7.9, 6.9, 6.7, 6.7, 6.4, 6.2, 6, 6, 5.8, 5.9, 5.4, 5.2, 4.7, 4.6, 4.2, 3.9, 4, 3.8, 3.6, 3.6, 3.6, 3.6, 3.5, 3.7, 3.5) # 配置参数 window_sizes <- c(24, 60) # 滚动窗口大小 h <- 12 # 目标预测步长 n_obs <- length(x) # 初始化结果存储列表 forecast_results <- list() for (win_size in window_sizes) { # 计算有效滚动窗口数量:确保训练集后有h个样本外观测值 n_windows <- n_obs - win_size - h + 1 # 创建矩阵存储多步预测结果:行=窗口数,列=1~h步预测 ar1_preds <- matrix(NA, nrow = n_windows, ncol = h) ar2_preds <- matrix(NA, nrow = n_windows, ncol = h) rw_preds <- matrix(NA, nrow = n_windows, ncol = h) auto_arima_preds <- matrix(NA, nrow = n_windows, ncol = h) for (i in 1:n_windows) { # 定义当前滚动窗口的训练集 train_end <- i + win_size - 1 x_train <- x[i:train_end] # 拟合各单变量模型 fit_ar1 <- Arima(x_train, order = c(1, 0, 0)) fit_ar2 <- Arima(x_train, order = c(2, 0, 0)) fit_rw <- rwf(x_train, h = h) # 随机游走模型(替代原meanf,若需均值预测可换回meanf) fit_auto_arima <- auto.arima(x_train) # 生成h步预测并存储 ar1_preds[i, ] <- forecast(fit_ar1, h = h)$mean ar2_preds[i, ] <- forecast(fit_ar2, h = h)$mean rw_preds[i, ] <- fit_rw$mean auto_arima_preds[i, ] <- forecast(fit_auto_arima, h = h)$mean } # 按窗口大小归类存储结果 forecast_results[[paste0("window_", win_size)]] <- list( AR1 = ar1_preds, AR2 = ar2_preds, RandomWalk = rw_preds, AutoARIMA = auto_arima_preds ) }
关键调整说明
- 结果存储结构:用矩阵替代向量,完整保留每个窗口的1~h步预测值,便于后续多步预测的误差分析或对比。
- 循环边界修正:通过
n_windows = n_obs - win_size - h + 1计算有效窗口数量,避免因训练集后观测值不足导致的索引越界问题。 - 模型函数优化:使用
forecast()函数统一处理多步预测输出,比predict()更适配forecast包的模型结构;随机游走模型改用rwf()(若你实际需要的是均值预测,可换回meanf())。 - 结果组织:用列表按窗口大小分类存储不同模型的预测结果,提升后续分析的便利性。
后续使用示例
# 查看窗口大小24的AR1模型第1个滚动窗口的12步预测值 print(forecast_results[["window_24"]]$AR1[1, ]) # 生成对应样本外真实值矩阵(用于模型评估) win_size <- 24 n_windows <- n_obs - win_size - h + 1 true_values <- matrix(NA, nrow = n_windows, ncol = h) for (i in 1:n_windows) { true_start <- i + win_size true_end <- true_start + h - 1 true_values[i, ] <- x[true_start:true_end] }
内容的提问来源于stack exchange,提问作者Econ
相关产品推荐
相关产品推荐

