为什么 SARIMA 有季节性限制?

Why SARIMA has seasonal limits?

原始的ARMA算法有如下公式:

arima

在这里你可以看到,ARMA 需要 p + q + 1 个数字来计算。所以,毫无疑问,这很清楚。

但是说到SARIMA算法我有一点是看不懂的。 SARIMA 公式看起来像带有 exta 的 ARMA:

SARIMA

其中 S 是一个数字,代表季节。 S是常量。

因此,SARIMA 必须计算 p + q + P + Q + 1 个数字。只是 exta P + Q 个数字。不会太多,如果 P = 1 且 Q = 2。

但是如果我们使用太长的时间段,例如日常时间序列为 365 天,SARIMA 就无法停止拟合。看看这个模型。第一个9秒适配,第二个2小时还没适配!

import statsmodels.api as sm

model = sm.tsa.statespace.SARIMAX(
    df.meantemp_box, 
    order=(1, 0, 2),
    seasonal_order=(1, 1, 1, 7)
).fit()

model = sm.tsa.statespace.SARIMAX(
    df.meantemp_box, 
    order=(1, 0, 2),
    seasonal_order=(1, 1, 1, 365)
).fit()

我无法理解。从数学上讲,这些模型是相同的——它们都采用相同的 p、q、PQ。但是第二个要么学的时间太长,要么根本学不会。

我是不是弄错了什么?

首先,一个可能的解决方案:如果您使用的是Statsmodels v0.11或开发版,那么当您有较长的季节性影响时,可以使用以下方法:

mod = sm.tsa.arima.ARIMA(endog, order=(1, 0, 2), seasonal_order=(1, 1, 1, 365))
res = mod.fit(method='innovations_mle', low_memory=True, cov_type='none')

主要限制是您的时间序列不能缺少条目。如果您缺少值,那么您需要在创建模型之前以某种方式估算它们。

此外,并非我们所有的结果功能都可供您使用,但您仍然可以打印带有参数的摘要、计算对数似然和信息标准、计算样本内预测以及进行样本外预测预测。


现在解释一下问题是什么:

问题在于,这些模型是通过将它们置于状态 space 形式然后应用卡尔曼滤波器来计算对数似然来估计的。 ARIMA 模型的状态 space 形式的维度随着整个季节中的周期数而快速增长 - 对于 s=365 的模型,状态向量的维度为 733。

卡尔曼滤波器需要将矩阵与这个维度相乘,默认情况下,为每个时间段的这个维度的矩阵分配内存。这就是为什么 运行 需要很长时间(而且它也占用大量内存)。

对于上面的解决方案,我们不是使用卡尔曼滤波器计算对数似然,而是计算一种称为创新算法的东西。然后我们只 运行 卡尔曼滤波器一次来计算结果对象(这允许例如预测)。 low_memory=True 选项指示模型不要为每个时间步存储所有大维矩阵,cov_type=None 选项指示模型不要尝试计算模型参数的标准误差(这将需要更多的对数似然评估)。