【问题标题】:Why SARIMA has seasonal limits?为什么 SARIMA 有季节性限制?
【发布时间】:2020-08-16 07:16:21
【问题描述】:

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

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

但是谈到 SARIMA 算法,我无法理解一件事。 SARIMA 公式看起来像带有 exta 的 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()

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

我是不是搞错了?

【问题讨论】:

    标签: python time-series statsmodels arima


    【解决方案1】:

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

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

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


    现在解释一下问题所在:

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

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

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

    【讨论】:

    • 谢谢,现在我明白了原因。但是,您建议的解决方案对我无济于事-该模型仍需要数小时才能适应。而且fit函数中也没有method='innovations_mle'
    • 听起来您没有使用正确的模型类。确保您使用 sm.tsa.arima.ARIMA 类创建模型。
    • 哇,它确实有效。很抱歉没有注意到这一点。我想我只是感到困惑,因为 ARIMA 应该是没有季节性成分的 SARIMA。
    • 嗨@cfulton,我在尝试以3分钟采样频率(3360个样本周期)拟合具有每周周期的模型时遇到了类似的问题。我使用 statsmodels 0.12.2、enforce_stationarity=False、enforce_invertibility=False、method='innovations_mle'、low_memory=True 和 cov_type='none' 尝试了您的解决方案,但似乎不适合。我还尝试将采样频率降低到 30 分钟,这需要约 40 分钟和约 3GB 的 RAM。我不知道这是否是预期的,我做错了什么,或者 statsmodels api 已经改变了。任何虽然将不胜感激。如果有道理,我可以开一个新帖子。
    猜你喜欢
    • 2020-09-09
    • 2022-06-15
    • 2020-10-19
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多