为什么 SARIMA 有季节性限制?

Yos*_*tik 1 python time-series statsmodels arima

原始ARMA算法的公式如下:

有马

在这里您可以看到,ARMA 需要p + q + 1 个数字来计算。所以,没有任何疑问,这是很清楚的。

但是谈论SARIMA算法我无法理解一件事。SARIMA 公式看起来像 ARMA 加上额外的:

萨里玛

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

因此,SARIMA 必须计算p + q + P + Q + 1数字。只是额外的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()
Run Code Online (Sandbox Code Playgroud)

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

我是不是搞错了什么?

cfu*_*ton 5

首先,一个可能的解决方案:如果您使用的是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')
Run Code Online (Sandbox Code Playgroud)

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

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


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

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

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

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