R 和 UCM 中 auto.arima 在一个数据集上的性能评估

机器算法验证 时间序列 预测 有马 模型评估 未观察到的组件模型
2022-03-31 11:22:38

我开始评估和比较一些预测方法。我在 R 软件 FMA 包中使用了 1900-1993 年美国打鸡蛋的价格,以美元为单位。我提出了过去 10 年的预测评估。以下是结果:

我在 R 软件中使用了自动 arima 方法。显然,结果是遥遥无期。我做错了什么吗?下面是预测。它不承认下降趋势。

汽车有马

我还使用了未观察到的组件模型(UCM)并获得了良好的预测,如下所示。

  1. 如果没有异常值/水平偏移,则标准误差非常大,因此置信带很宽。没有异常值的 UCM 水平变化
  2. 经过一些迭代工作,下面是带有异常值/水平变化的输出(我知道我在这里过拟合了),但它在预测方面做得很好;也有狭窄的置信区间。具有异常值水平变化的 UCM

仅查看此示例,UCM 似乎比 auto.arima 更准确地预测了保留样本。

为什么 auto.arima 没有提供合理的预测?

状态空间模型/UCM 是否更适合长期预测?

使用一种方法比另一种方法有什么好处吗?

3个回答

在 ARIMA 模型的估计中,回归系数的初始化方式最近发生了变化,这意味着现在auto.arima(使用 R3.0.2)选择了不同的模型:

> auto.arima(window(eggs,end=1983))

ARIMA(0,1,0) with drift         

Coefficients:
        drift
      -2.2665
s.e.   3.1133

sigma^2 estimated as 804.5:  log likelihood=-390.15
AIC=784.31   AICc=784.46   BIC=789.14

有关初始化更改的讨论,请参见https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15396这在这里是相关的,因为漂移被估计为线性回归。变化是在stats::arima,而不是在auto.arima

请注意,漂移在任何情况下都不显着。所以你很难说非趋势模型是不合理的。

当然,如果您对数据有所了解,那么您应该使用您所拥有的知识。但是如果你想要一些完全自动化的东西,如果它给你的东西不符合你对合理的先入为主的想法,你就不能真正抱怨。

状态空间未观察到的组件模型将与这些数据的 ARIMA 模型非常相似。事实上,任何适合数据的合理 UCM 都会有一个等效的 ARIMA 模型。所以说一个预测比另一个好是没有意义的。一个可能比另一个更容易使用,或者比另一个更容易解释。

是的,有好处。ARIMA 更擅长轻松处理复杂的短期动态。UCM 更擅长将系列分解为可解释的组件。

我使用了 AUTOBOX(我帮助开发的一个软件)。自动模型识别方案检测具有ar(3)分量的一阶差分模型。在此处输入图像描述. 对参数恒定性的测试揭示了在 53 期或附近的一个可能的断点(年=1953 请注意,UCM 模型在 1954 年宣布了一个新趋势),这表明可能在 1-52 和 53-83 之间发生政权变化。通过检查数据图可以很容易地从视觉上确认这一点。它是一个指数平滑模型(ARIMA 模型的一个非常特殊的情况),具有常数和对第 75 个数据点的调整。在此处输入图像描述残差图表明ACF 的充分性(至少有 31 个值)在此处输入图像描述下一个图是实际/拟合和预测。在此处输入图像描述

确定的 ARIMA 模型具有显着的负常数,因此提供了向下的指导。AUTOBOX 其他方法之间的区别在于,AUTOBOX 测试了瞬态参数并得出结论,旧数据 (obs 1-52) 与观察结果 53-83 不一致。这就是无人敢提的“房间里的大象”。在此处输入图像描述需要验证所有数据来自具有恒定参数的同一模型的假设,而不是忽略。仅仅因为我们知道存在 83 个值并不意味着我们应该使用所有数据。对整个系列建模不一定对单个子集建模。

我必须评论说,评估来自 1 个来源的预测是不够的研究。必须查看许多来源以及可能不同的交货时间。

我没有得到与 OP(预测包的 5.0 版)相同的结果。如果运行以下,结果确实是线性下降趋势。

install.packages("fma")
library(fma)
install.packages("forecast")
library(forecast)

#window as per the OP
eggs2<-window(eggs, start=c(1900), end=c(1983))   
plot(eggs2)

#does produce a linear trend downward!
model2<-auto.arima(eggs2)
model2
plot(forecast(model2,10))

也许在使用的包中默认情况下 allowdrift 不是 TRUE 的变化?

在此处输入图像描述

此外,如果您在完整的数据集上运行 auto.arima(不保留过去 10 年),我相信 Hyndman 博士正在做的事情,下降趋势就会出现。

model<-auto.arima(eggs)
model

Series: eggs 
ARIMA(0,1,1) with drift         

Coefficients:
          ma1    drift
      -0.1630  -2.3774
s.e.   0.1145   2.3229

sigma^2 estimated as 713:  log likelihood=-432.26
AIC=870.51   AICc=870.78   BIC=878.11