时间序列中‘Future data set is incomplete’警告的解决方法
我在学习《Forecasting Principles and Practice, 3rd Edition》的时间序列内容时,使用aus_accommodation数据集做时间序列交叉验证,执行以下代码后触发了警告:
执行代码
加载依赖与数据集:
library(fpp3) library(tidyverse) accommodations <- aus_accommodation
构建交叉验证训练集:
train <- accommodations %>% slice(-n()) %>% stretch_tsibble(.init = 36, step = 1)
拟合TSLM模型:
fit <- train %>% model( TSLM(CPI ~ trend() + season()) )
生成1步预测:
forecast1 <- fit %>% forecast(h=1)
评估预测准确率:
final <- forecast1 %>% fabletools::accuracy(accommodations)
触发的警告信息
Warning message:
The future dataset is incomplete, incomplete out-of-sample data will be treated as missing.
1 observation is missing at 2016 Q3
排查后确认:forecast1与final中无缺失值,但原数据集aus_accommodation确实没有2016 Q3及之后的观测。修改.init(1至36)、step(1至4)甚至移除这些参数,警告依旧出现。
问题原因
警告的核心是accuracy()函数在对比预测值与真实值时,会默认检查目标数据集(accommodations)是否包含所有预测时间段之后的观测。你的交叉验证训练集是通过slice(-n())去掉了原数据集的最后一行(2016 Q2),最后一个拉伸训练集的时间范围到2016 Q1,对应的预测期是2016 Q2。但accuracy()内部逻辑会额外检查是否存在2016 Q3的数据,而原数据集没有这部分,因此触发警告。
解决方法
方法1:限制对比的真实值范围
调用accuracy()时,只取与预测期完全匹配的真实值部分:
final <- forecast1 %>% fabletools::accuracy(accommodations %>% slice(37:n()))
这里slice(37:n())对应的是每个拉伸训练集预测的下一期真实值,刚好和forecast1的预测期一一对应,避免函数检查不存在的2016 Q3数据。
方法2:明确指定预测的时间点
生成预测时,用new_data参数明确传入要预测的时间点集合,替代h=1的自动推断:
# 提取所有需要预测的时间点(对应每个训练集的下一期) test_points <- accommodations %>% slice(37:n()) %>% select(Quarter) # 基于指定时间点生成预测 forecast1 <- fit %>% forecast(new_data = test_points) # 再执行准确率评估 final <- forecast1 %>% fabletools::accuracy(accommodations)
为什么修改.init/step没用?
问题根源不在交叉验证训练集的构建参数,而是accuracy()对目标数据集的完整性检查逻辑,因此调整.init或step无法消除警告。
内容的提问来源于stack exchange,提问作者Russ Conte

