You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:03:18