状态空间 SARIMAX 的 MLE 收敛错误

机器算法验证 最大似然 有马 收敛 季节性
2022-01-24 16:59:28

我正在尝试将长达一年的半小时数据集放入 Python statsmodels 的 SARIMAX 中。我绘制了相关图,它表明 AR 和 MA 项均远高于 5,周期性项(每天)约为 2。但即使在季节性或非季节性类型的 AR 或 MA 项中超过 2 阶也会产生 MLE 收敛错误.

C:\Users\<user>\AppData\Local\Continuum\miniconda3\lib\site-packages\statsmodels\base\
model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. 
Check mle_retvals
  "Check mle_retvals", ConvergenceWarning)

我知道这是一个非线性模型并且无法收敛,但我不知道如何进行。mle_retvals不是SARIMAXResults对象的属性。拟合整个数据集需要一个多小时,这就是为什么我在迭代时只能使用一两个月的数据。我直觉地怀疑这减少了 SARIMAX 拟合可以容纳的术语的潜在顺序而不会出现收敛问题,尽管我对这里的概念没有深入的理解。

其他可能重要的细节是整个数据集中缺少许多值,我依靠状态空间形式来估算这些缺失值。

如何解决我在使用 SARIMAX 时遇到的收敛错误?我应该检查哪些方面可能导致问题?这些问题通常可以解决吗?谢谢。

更新:我不知道现在发生了什么,但我得到了一个 mle_retvals 对象

{'Hinv': array([[1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0],
        [0, 0, 0, 1, 0, 0],
        [0, 0, 0, 0, 1, 0],
        [0, 0, 0, 0, 0, 1]]),
 'converged': False,
 'fcalls': 44,
 'fopt': 0.22864169058350794,
 'gcalls': 33,
 'gopt': array([ 0.33676031, -0.35390488, -0.01763243, -0.09141768, -0.12037386,
         0.08537955]),
 'warnflag': 2}

这是针对 order=(2,0,2) 和seasonal_order=(1,0,0,48) 的。而且我现在还注意到在 ConvergenceWarning 之前有一个警告

Warning: Desired error not necessarily achieved due to precision loss.

所以 Hessian 是单数的;这听起来不像是数据问题吗?可能这意味着数据的顺序低于模型?但这并没有反映在 (1,0,2),(1,0,0,48) 模型的插值残差系列的 ACF 和 PACF 中,其中有很多高于显着性水平的峰值(参见下面的 PACF )。我为此使用了BFGS算法。

PACF 在残差中显示出显着的峰值

插值数据以删除缺失值没有任何区别!

更改算法:Nelder-Mead 似乎需要大量迭代,但最终收敛于 (2,0,2),(1,0,0,48),参见下面的 PACF

PACF 在残差中显示出显着的峰值

1个回答

首先,mle_retvals应该是一个属性,SARIMAXResults如果它是使用fit调用构造的,所以你应该能够检查它。当你尝试时你会得到什么print(res.mle_retvals)

其次,估计的参数看起来“在球场上”,还是胡说八道?或者他们是NaN?

不知道更多:您可以尝试增加最大迭代次数,例如

mod = sm.tsa.SARIMAX(endog, order=(p,d,q))
res = mod.fit(maxiter=200)

您也可以尝试不同的优化程序(例如 Nelder-Mead 的 nm):

res = mod.fit(maxiter=200, method='nm')

您可以尝试以某种方式计算更好的起始参数。默认例程可能不适用于每小时数据,并且可能不适用于大量缺失数据,例如:

params = [...]
res = mod.fit(start_params=params)

最后,如果没有其他方法,要查看是否是丢失的数据本身就是问题,您可以尝试输入数据(例如使用 Pandas 插值或其他东西)并查看模型是否收敛(估计的参数不会适用于原始数据集,但至少您可以判断这是否是问题所在)。

更新

我猜似然函数可能非常平坦,和/或有许多局部最小值。这也可以解释为什么powell(这是一种无衍生方法)有帮助。

我认为对于这样的高频数据,基本的 SARIMAX 模型可能过于“生硬”。例如,在基本模型下,可能存在非常长的季节性模式(例如每周),这在计算上是繁重的,并且可能存在必须考虑的日历效应。我认为这些特征会使自相关难以解释,并且可能看起来需要大量滞后才能很好地拟合模型。

不幸的是,最好的方法可能只能通过查看和思考数据来确定。您可能希望从简单的低阶 SARIMAX 模型开始,并查看残差和相关诊断(例如res.plot_diagnostics()开始)。

在拟合 SARIMAX 模型之前,您还可以尝试使用滤波器(例如seasonal_decomposebk_filter)来消除各种频率的循环效应。您也可以尝试使用人口普查局的 X13 工具。