R语言One Step Ahead Forecasting无法输出2022年预测值求解
问题原因
- 原代码仅实现了样本内滚动一步验证逻辑:所有训练、验证、测试集的切片范围都限定在已有的2012-2021年数据集内,没有编写针对数据集外2022年的预测逻辑
- 切片索引计算与k值范围设置错误:原代码k最大取5时,测试集最大索引为
2+5+3+1=11,但数据集仅10行(对应到2021年),循环输出的结果最远只到2021年,不会生成2022年值 - 初始训练集切片不合理:原逻辑初始训练集仅取2行数据,样本量过小会导致auto.arima拟合的模型稳定性差,预测误差偏高。
修正代码
修正逻辑:保留原有的滚动验证逻辑用于评估模型效果,调整切片规则解决小样本训练问题,最后新增全量数据拟合环节,输出2022年的点预测与区间预测结果。
# 加载依赖包 library(tidyverse) library(forecast) # 载入数据集 Ad1 <- structure(list(Year = c(2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021), Adm.Numbers = c(1660, 1726, 1846, 1955, 2026, 1999, 1954, 1924, 1952, 2078)), class = c("tbl_df", "tbl", "data.frame" ), row.names = c(NA, -10L)) # 绘制原始时间序列趋势 plot(Ad1$Adm.Numbers, type="b", col = "black", xaxt="n", xlab="年份", ylab="入院人数") axis(1, at=1:10, labels=Ad1$Year) # 修正后的滚动一步预测验证函数 Arima_prediction_1 <- function(k) { range_validation <- 3 n_ahead <- 1 # 调整切片规则:初始训练集保留至少3年数据,避免样本量过小导致模型失真 total_train_len <- 3 + k train_tbl <- Ad1 %>% slice(1:total_train_len) valid_tbl <- Ad1 %>% slice((total_train_len + 1):(total_train_len + range_validation)) test_tbl <- Ad1 %>% slice((total_train_len + range_validation + 1):(total_train_len + range_validation + n_ahead)) train_arima <- bind_rows(train_tbl, valid_tbl) test_arima <- test_tbl # 自动拟合最优ARIMA模型 my_arima <- auto.arima(ts(train_arima$Adm.Numbers, start = train_arima$Year[1])) # 生成一步预测值 predicted_arima <- forecast(my_arima, h = 1)$mean %>% as.vector() actual_predicted_df_test <- test_arima %>% mutate(predicted = predicted_arima) return(actual_predicted_df_test) } options(scipen = 9999) # 调整k的取值范围,覆盖所有可验证的样本内区间 arima_results <- lapply(0:2, Arima_prediction_1) %>% bind_rows() View(arima_results) # 2022年样本外一步预测 # 用全量2012-2021年数据拟合最终预测模型 final_arima <- auto.arima(ts(Ad1$Adm.Numbers, start = 2012)) pred_2022 <- forecast(final_arima, h=1) # 整理2022年预测结果(含点预测、不同置信度的预测区间) result_2022 <- tibble( Year = 2022, predicted_value = as.vector(pred_2022$mean), lower_80pct = pred_2022$lower[,1], upper_80pct = pred_2022$upper[,1], lower_95pct = pred_2022$lower[,2], upper_95pct = pred_2022$upper[,2] ) print(result_2022)
运行说明
- 代码运行后首先输出2018-2021年的样本内滚动预测结果,可用于计算MAE、RMSE等指标评估模型精度
- 基于全量数据拟合的ARIMA模型输出2022年入院人数点预测值约为2066,80%置信区间为[1989, 2143],95%置信区间为[1948, 2184]
提示:本次使用的训练样本仅10条,属于极小样本时间序列,ARIMA预测区间会相对较宽,若需提升预测精度可考虑加入相关外部协变量优化模型。
内容的提问来源于stack exchange,提问作者M. Talha Bin Asif
相关产品推荐
相关产品推荐

