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

机器算法验证 r 时间序列 预测 指数平滑
2022-01-27 21:09:21

我正在研究 R 中的一个算法来自动化每月的预测计算。我正在使用预测包中的 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)

在这里,在图表上,您将看到历史数据(黑色)、拟合值(绿色)和预测(蓝色)。预测绝对不符合拟合值。

您对如何“绑定”预测与历史销售“一致”有任何想法吗? 在此处输入图像描述

3个回答

正如@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))

在此处输入图像描述

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

当我在删除最后两个数据点的情况下重新运行 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)

在此处输入图像描述

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

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

在此处输入图像描述最终模型的统计数据在这里在此处输入图像描述实际/拟合和预测图表很有趣,因为它突出了异常活动。在此处输入图像描述