Python 为什么萨里玛有季节限制?

Python 为什么萨里玛有季节限制?,python,time-series,statsmodels,arima,Python,Time Series,Statsmodels,Arima,原始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小时后仍未完成安装

原始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小时后仍未完成安装

将statsmodels.api作为sm导入 模型=sm.tsa.statespace.SARIMAX df.meantemp_箱, 顺序=1,0,2,, 季节顺序=1,1,1,7 适合 模型=sm.tsa.statespace.SARIMAX df.meantemp_箱, 顺序=1,0,2,, 季节顺序=1,1,1,365 适合 我不明白。从数学上讲,这些模型是相同的——它们都采用相同的p、q、p和q。但第二个模型要么学习时间太长,要么根本无法学习


我有什么问题吗?

首先,一个可能的解决方案:如果您使用的是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选项指示模型不尝试计算模型参数的标准误差,这将需要更多的对数似然评估。

首先,一个可能的解决方案:如果您使用的是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选项指示模型不尝试计算模型参数的标准误差,这将需要更多的对数似然评估。

谢谢,现在我明白了原因。然而,你建议的解决方案帮不了我-模型仍然需要几个小时才能适应。而且也没有方法class='innovations\u ml
拟合函数中的e。听起来您使用的模型类不正确。确保您正在使用类sm.tsa.arima.arima.Wow创建模型,它实际上是有效的。很抱歉,我没注意到。我猜我只是被误导了,因为ARIMA应该是没有季节成分的SARIMA。嗨@cfulton,我在尝试拟合一个每周周期的模型时遇到了类似的问题,3分钟采样频率周期为3360个样本。我用statsmodels 0.12.2、enforce_stationarity=False、enforce_inversibility=False、method='innovations\u mle',low_memory=True和cov_type='none'尝试了您的解决方案,但似乎不适合。我还尝试将采样频率减少到30分钟,这需要约40分钟和约3 GB的内存。我不知道这是否是意料之中的,我做错了什么,或者statsmodels api已经改变了。尽管如此,我们将不胜感激。如果有意义的话,我可以打开一个新的帖子。谢谢,现在我明白了原因。然而,你建议的解决方案帮不了我-模型仍然需要几个小时才能适应。而且fit函数中也没有方法class='innovations\u mle'。听起来您使用的模型类不正确。确保您正在使用类sm.tsa.arima.arima.Wow创建模型,它实际上是有效的。很抱歉,我没注意到。我猜我只是被误导了,因为ARIMA应该是没有季节成分的SARIMA。嗨@cfulton,我在尝试拟合一个每周周期的模型时遇到了类似的问题,3分钟采样频率周期为3360个样本。我用statsmodels 0.12.2、enforce_stationarity=False、enforce_inversibility=False、method='innovations\u mle',low_memory=True和cov_type='none'尝试了您的解决方案,但似乎不适合。我还尝试将采样频率减少到30分钟,这需要约40分钟和约3 GB的内存。我不知道这是否是意料之中的,我做错了什么,或者statsmodels api已经改变了。尽管如此,我们将不胜感激。如果有意义的话,我可以打开一个新的帖子。