时间序列预测报错:'start'值未更改,求三月均值朴素预测验证集性能
三月均值朴素时间序列预测的报错修复
问题背景
需要基于ausbeer数据集,用三月均值模型预测并评估验证集(2005-2007年四季度)的性能,原代码使用了受限库之外的fpp2和zoo,且运行时报错:
Error in window.default(x, ...) : 'start' cannot be after 'end' In addition: Warning message: In window.default(x, ...) : 'start' value not changed
仅允许使用library(forecast)、library(timeSeries)和library(astsa)三个库。
报错原因
- 原代码用
zoo::rollmean生成的滚动均值序列长度比训练集短2个观测值(滚动窗口为3),与验证集的时间范围、长度无法匹配,导致accuracy函数内部调用window时出现起止时间冲突。 - 违规使用了
fpp2和zoo库,不符合要求。
修正后的代码
library(forecast) # 加载数据集 data(ausbeer) # 划分训练集、验证集、测试集 train1 <- window(ausbeer, start = c(1956,1), end = c(2004,4)) valid1 <- window(ausbeer, start = c(2005,1), end = c(2007,4)) test1 <- window(ausbeer, start = c(2008,1)) # 用forecast库的ma函数计算3期移动平均(三月均值),align="right"等价于centre=FALSE ma3_train <- ma(train1, order = 3, centre = FALSE) # 提取训练集最后一个移动均值,生成与验证集长度一致的预测值(朴素滚动均值预测逻辑) naive3_pred <- rep(tail(ma3_train, 1), length(valid1)) # 给预测值匹配验证集的时间序列属性,保证对齐 ts_pred <- ts(naive3_pred, start = start(valid1), frequency = frequency(valid1)) # 计算验证集的预测性能指标 accuracy(ts_pred, valid1)[,1:5]
代码说明
- 用
forecast::ma替代zoo::rollmean,满足库的限制,centre=FALSE对应原代码的右对齐滚动逻辑,生成最近3期的均值序列。 - 朴素三月均值预测的逻辑是用训练集最后一个滚动均值作为基准,重复生成验证集长度的预测值,保证时间序列的起止和长度与验证集完全匹配,解决
window函数的起止冲突报错。 - 给预测结果设置正确的时间序列属性,确保
accuracy函数能正确对齐观测值与预测值,计算性能指标。
内容的提问来源于stack exchange,提问作者ebrahimi
相关产品推荐
相关产品推荐

