即使我强制季节性,auto.arima 也会返回非季节性模型

机器算法验证 r 时间序列 有马
2022-04-01 10:04:14

根据这篇文章,您可以通过选择 D=1 来强制 auto.arima 中的季节性。

我有一个每周时间序列,看起来它可能(或可能没有)具有季节性成分(我有先验理由认为它可能具有季节性成分)。

Data <- as.ts(Data$Sales,order.by=Data$Date, frequency=52) 
Train <- window(Data,start=3,end=107)
Test <- window(Data,start=108,end=116)

我尝试手动拟合季节性模型:

fit <- arima(Train, order=c(2,0,1) , seasonal = list (order= c(0,1,0) , period = 52))
forec <- predict(fit, n.ahead =8)

给出了一个“OK”的预测(见第一张图)。

在此处输入图像描述

所以我尝试通过使用 auto.arima 来改进它以找到最佳模型。

AutoFit <- auto.arima(Train)

这返回了一个 ARIMA(1,1,1) 模型,然后我使用:

#fit <- arima(Train, order=c(1,1,1))

但这比我手动选择的季节性模型给出的结果更差(见第二张图)。 在此处输入图像描述

所以我试图通过运行来强制季节性:

AutoFit <- auto.arima(Train, D=1)

但我仍然得到相同的 ARIMA(1,1,1) 模型。

为什么 auto.arima 不尝试拟合季节性模型,甚至为什么我尝试强制它?

我也试过:

AutoFit <- auto.arima(Train, seasonal=TRUE, D=1)

AutoFit <- auto.arima(Train, seasonal=TRUE, start.P=0, start.Q=0 , D=1)
2个回答

规则 1:当你的代码没有做你想做的事时,开始检查你的对象。

library(forecast)
set.seed(1)
(Data <- as.ts(rnorm(116), frequency=52) )

产量

Time Series:
Start = 1 
End = 116 
Frequency = 1
...snip...

请注意,Frequency我们在上面明确设置的是 1,而不是 52!

问题是as.ts() 默默地忽略frequency参数并将频率设置为1。这是帮助页面stats::ts()

 ‘as.ts’ is generic.  Its default method will use the ‘tsp’
 attribute of the object if it has one to set the start and end
 times and frequency.

所以,如果你想要一些季节性的东西,要么提供一个x带有...的tsp属性,要么从一开始就直接as.ts()使用ts()

set.seed(1)
(Data <- ts(rnorm(116), frequency=52) )

产生

Time Series:
Start = c(1, 1) 
End = c(3, 12) 
Frequency = 52
...snip...

这看起来好多了。请注意,我们现在需要为 提供 2 个向量window(),对应于 的StartEnd属性Data

Train <- window(Data,start=c(1,1),end=c(2,52))
auto.arima(Train, D=1)

根据需要,它产生了一个很好的季节性 ARIMA 模型:

Series: Train 
ARIMA(0,0,0)(0,1,0)[52]

我想到了两件事 1)尝试拟合 52 到 105 次观察的季节性 ar 模型是愚蠢的,因为您只有 2 个数据周期;2)请参阅下面的温度时间序列的相关图 ACF 和 PACF。我可以说它是 ACF 的 MA(2) 吗?增强现实呢?其中讨论了忽略异常的影响导致模型识别缺陷