【发布时间】:2021-07-03 16:34:09
【问题描述】:
我正在尝试使用 stastmodels recursive_filter 和 convolution_filter 重现 ARIMA 模型中使用的过滤器。 (我的最终目标是使用这些过滤器对外生系列进行预白化。)
我首先使用 AR 模型和递归过滤器。这是简化的实验设置:
import numpy as np
import statsmodels as sm
np.random.seed(42)
# sample data
series = sm.tsa.arima_process.arma_generate_sample(ar=(1,-0.2,-0.5), ma=(1,), nsample=100)
model = sm.tsa.arima.model.ARIMA(series, order=(2,0,0)).fit()
print(model.summary())
优雅地产生以下内容,这似乎很公平:
SARIMAX Results
==============================================================================
Dep. Variable: y No. Observations: 100
Model: ARIMA(2, 0, 0) Log Likelihood -131.991
Date: Wed, 07 Apr 2021 AIC 271.982
Time: 12:58:39 BIC 282.403
Sample: 0 HQIC 276.200
- 100
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -0.3136 0.266 -1.179 0.238 -0.835 0.208
ar.L1 0.2135 0.084 2.550 0.011 0.049 0.378
ar.L2 0.4467 0.101 4.427 0.000 0.249 0.645
sigma2 0.8154 0.126 6.482 0.000 0.569 1.062
===================================================================================
Ljung-Box (L1) (Q): 0.10 Jarque-Bera (JB): 0.53
Prob(Q): 0.75 Prob(JB): 0.77
Heteroskedasticity (H): 0.98 Skew: -0.16
Prob(H) (two-sided): 0.96 Kurtosis: 2.85
===================================================================================
我拟合 AR(2) 并根据 SARIMAX 结果获得滞后 1 和 2 的系数。我使用statsmodels.tsa.filters.filtertools.recursive_filter 复制这个模型的直觉是这样的:
filtered = sm.tsa.filters.filtertools.recursive_filter(series, ar_coeff=(-0.2135, -0.4467))
(也许还可以从回归结果中添加常数)。然而,直接比较结果表明递归过滤器没有复制 AR 模型:
import matploylib.pyplot as plt
# ARIMA residuals
plt.plot(model.resid)
# Calculated residuals using recursive filter outcome
plt.plot(filtered)
我是不是在错误地处理这个问题?我应该使用不同的过滤器功能吗?对我来说,下一步是在 MA 模型上执行相同的任务,这样我就可以将(?)结果加在一起以获得用于预白化的完整 ARMA 过滤器。
注意:这个问题对于搜索“如何预白化时间序列数据?”的人可能很有价值。特别是在 Python 中使用 statsmodels。
【问题讨论】:
标签: python statistics time-series statsmodels arima