使用fable Prophet时未来数据集不完整的问题解决
解决按分组移除最后N条观测值及Prophet样本外性能评估问题
问题根源
你遇到的警告是因为未按type分组执行移除最后5条观测值的操作,导致部分分组的训练数据没有正确截断,后续生成的预测数据集与原完整数据集的时间范围无法匹配,出现缺失值提示。
正确实现步骤
1. 按分组移除最后5条观测值
使用group_by(type)确保每个分组独立移除最后5条数据,再用slice或filter完成截断:
# 方法1:用slice按分组取前n-5条 lax_train <- lax_passengers %>% group_by(type) %>% slice(1:(n() - 5)) %>% # 保留每个分组的前(总条数-5)条,即移除最后5条 ungroup() # 方法2:按时间筛选(更直观,适用于规则时间序列) lax_train <- lax_passengers %>% group_by(type) %>% filter(time < max(time) - months(5)) %>% # 假设时间为月度频率,非月度需调整单位 ungroup()
2. 验证数据正确性
检查每个分组的观测数是否比原数据集少5条,确认截断有效:
# 对比原数据和训练数据的分组观测数 lax_passengers %>% count(type) lax_train %>% count(type)
3. 拉伸时间序列并生成预测
# 构建拉伸时间序列(.init根据数据量调整,确保初始训练集足够) lax_stretch <- lax_train %>% stretch_tsibble(.init = 12, .step = 1) # 训练Prophet模型并生成5步预测 fc <- lax_stretch %>% model(prophet = Prophet(passengers ~ season('year', 12))) %>% forecast(h = 5)
4. 计算样本外性能得分
此时再执行准确率计算,不会出现缺失数据警告:
accuracy(fc, lax_passengers)
关键说明
- 必须通过
group_by(type)明确分组操作,否则slice会对整个数据集而非单个分组生效,导致数据截断不彻底。 - 若时间序列频率不是月度,需调整
months(5)为对应单位(如weeks(20)对应周度数据)。
内容的提问来源于stack exchange,提问作者QMan5
相关产品推荐
相关产品推荐

