ETS()函数,如何避免与历史数据不一致的预测?


16

我正在研究R中的alogorithm,以使每月预测计算自动化。除其他外,我正在使用预报包中的ets()函数来计算预报。运行良好。

不幸的是,对于某些特定的时间序列,我得到的结果很奇怪。

请在下面找到我正在使用的代码:

train_ts<- ts(values, frequency=12)
fit2<-ets(train_ts, model="ZZZ", damped=TRUE, alpha=NULL, beta=NULL, gamma=NULL, 
            phi=NULL, additive.only=FALSE, lambda=TRUE, 
            lower=c(0.0001,0.0001,0.0001,0.8),upper=c(0.9999,0.9999,0.9999,0.98), 
            opt.crit=c("lik","amse","mse","sigma","mae"), nmse=3, 
            bounds=c("both","usual","admissible"), ic=c("aicc","aic","bic"),
            restrict=TRUE)  
ets <- forecast(fit2,h=forecasthorizon,method ='ets')   

请在下面的相关历史数据集下面找到:

 values <- c(27, 27, 7, 24, 39, 40, 24, 45, 36, 37, 31, 47, 16, 24, 6, 21, 
35, 36, 21, 40, 32, 33, 27, 42, 14, 21, 5, 19, 31, 32, 19, 36, 
29, 29, 24, 42, 15, 24, 21)

在此图中,您将看到历史数据(黑色),拟合值(绿色)和预测(蓝色)。该预测绝对与拟合值不一致。

您对如何“绑定”前瞻使其与历史销售“保持一致”有任何想法吗? 在此处输入图片说明


这是我遇到过的最奇怪的预测之一ets。历史数据的平均/水平大约为20,而预测的平均/水平大约为50。不确定为什么会这样吗?您可以运行基本版本ets并查看是否获得相同结果吗?
预报者

非常感谢您的时间和答复!我同意您一个事实,即最后一点可能被视为“异常值”(上一年是21点与7或6或5相比),可以根据过去的数据使用置信区间来检测出来,因此在计算出a统计预测。但是,如果我们假设这是一次“正常”销售,是否有办法通过限制预测来避免这种行为,或者至少要警告该预测是历史记录的两倍?在这种情况下,绑定的alpha,beta和gamma无关紧要。再次感谢您在这一点上的帮助!
MehdiK 2015年

我已对您的答案投了赞成票,现在我想您可以发表评论了。将来,请在评论的正下方留下评论,以便回答的人会注意到它。谢谢
预报者

ETS和所有单变量时间序列模型均假定过去的行为会预测未来的行为。如果存在任何异常数据点,则需要让模型知道存在异常。模型将不知道该值是正常值,您需要在模型中指定该值离群值。
预报者

Answers:


10

正如@forecaster指出的,这是由系列末尾的异常值引起的。如果将估计的水平分量绘制在顶部,则可以清楚地看到问题:

plot(forecast(fit2))
lines(fit2$states[,1],col='red')

请注意,该系列末尾的水平有所提高。

使模型对异常值更健壮的一种方法是减少参数空间,以使平滑参数必须采用较小的值:

fit2 <- ets(train_ts, upper=c(0.3,0.2,0.2,0.98))  
plot(forecast(fit2))

在此处输入图片说明


相当于您处理异常值的第二个建议的Forecast :: auto.arima是什么?
垃圾平衡

1
使用ARIMA模型,您可以在有问题的时间处理将虚拟变量设置为1的离群值。只需在auto.arima或Arima中使用xreg参数即可。
罗伯·海恩德曼

6

这是教科书案例,在系列结尾处有异常值及其意想不到的后果。数据的问题在于最后两个点是离群值,您可能需要在运行预测算法之前识别并处理离群值。我将在今天晚些时候更新一些识别异常值的策略的答案和分析。以下是快速更新。

在删除了最后两个数据点的情况下重新运行ets时,我得到了一个合理的预测。请看下面:

values.clean <- c(27, 27, 7, 24, 39, 40, 24, 45, 36, 37, 31, 47, 16, 24, 6, 21, 
                  35, 36, 21, 40, 32, 33, 27, 42, 14, 21, 5, 19, 31, 32, 19, 36, 
                  29, 29, 24, 42, 15)## Last two points removed

train_ts.clean<- ts(values.clean, frequency=12)
fit2.clean<-ets(train_ts.clean)  
ets.f.clean <- forecast(fit2.clean,h=24)
plot(ets.f.clean)

在此处输入图片说明


5

@forecaster当您考虑趋势和季节性活动时,最后一个值是离群值,但正确的是最后一个值38(倒数第二个值)不是离群值。这是测试/评估替代健壮方法的定义/教学时间。如果您没有识别并调整异常,则差异会夸大,导致找不到其他项。周期32也是一个异常值。周期3,32和1也是异常值。该系列的前17个值具有统计上的显着趋势,但此后从周期18开始减弱。因此,数据中确实有两个趋势。这里要吸取的教训是,不考虑任何趋势或趋势的特定形式和/或默认为自回归过程的特定形式的简单方法需要受到严重质疑。继续进行良好的预测应该考虑到在极限点(期间39)发现的异常活动的可能延续。这是不可能从数据中提取出来的。

这是一个可能有用的模型:

在此处输入图片说明最终模型的统计信息在此处。在此处输入图片说明“实际/适合和预测”图很有趣,因为它突出显示了异常活动。在此处输入图片说明


+1您的答案始终具有教育意义和启发性。我了解脉搏和时间,固定效应纯粹是确定性模型吗?
预报者

@forecaster是固定影响/季节性脉冲纯粹是确定性的……就像脉冲/电平移动和本地时间趋势一样。此外,8月(8)并不重要,也不在最终列表中。
IrishStat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.