一、学习内容
1. SARIMA 模型的残差分析与诊断
残差分析:
- 在拟合 SARIMA 模型后,我们需要对模型的残差进行分析,以确保模型没有遗漏重要的信息。一个好的模型应该具有白噪声残差,即残差应该是零均值、方差恒定且无自相关性的。
- 残差分析可以通过以下步骤进行:
- 可视化残差序列:绘制残差的时间序列图,以观察其是否表现为随机波动。
- 残差的 ACF 图:绘制残差的自相关函数 (ACF) 图,检查是否存在显著的自相关性。
- Ljung-Box 检验:使用 Ljung-Box 检验来进一步确认残差是否为白噪声。
2. 模型的优化与参数调整
参数调整:
- 如果残差分析显示残差存在显著的自相关性或不符合白噪声假设,则需要对 SARIMA 模型的参数进行调整。通过调整 和 参数,可以提高模型的拟合效果。
- AIC/BIC 信息准则:在调整参数时,可以使用 AIC(赤池信息准则)和 BIC(贝叶斯信息准则)作为评价标准,选择 AIC 或 BIC 最小的模型。
模型对比:
- 通过尝试不同的参数组合,并比较模型的 AIC 和 BIC 值,来确定最优的模型。
- 对比新旧模型的残差分析结果,确认优化后的模型是否改善了残差的表现。
二、实战案例
我们将使用 statsmodels
库对一个季节性数据集(如航空乘客数据)进行 SARIMA 模型的残差分析与调整。
1. 数据加载与 SARIMA 模型拟合
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.stats.diagnostic import acorr_ljungbox
# 加载时间序列数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')
# SARIMA 模型拟合 (p, d, q) x (P, D, Q, m) = (1, 1, 1) x (1, 1, 1, 12)
model = SARIMAX(data['Passengers'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results = model.fit()
# 输出模型摘要
print(results.summary())
程序解释:
- 载入航空乘客数据集,并使用
SARIMAX
函数拟合 SARIMA(1, 1, 1)(1, 1, 1, 12) 模型,输出模型摘要信息。
程序的运行结果:
SARIMAX Results
==========================================================================================
Dep. Variable: Passengers No. Observations: 144
Model: SARIMAX(1, 1, 1)x(1, 1, 1, 12) Log Likelihood -506.149
Date: Mon, 02 Sep 2024 AIC 1022.299
Time: 20:27:49 BIC 1036.675
Sample: 01-01-1949 HQIC 1028.140
- 12-01-1960
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ar.L1 -0.1272 0.356 -0.357 0.721 -0.825 0.570
ma.L1 -0.2149 0.325 -0.660 0.509 -0.853 0.423
ar.S.L12 -0.9272 0.214 -4.341 0.000 -1.346 -0.509
ma.S.L12 0.8395 0.309 2.717 0.007 0.234 1.445
sigma2 130.7819 15.420 8.481 0.000 100.559 161.005
===================================================================================
Ljung-Box (L1) (Q): 0.00 Jarque-Bera (JB): 7.05
Prob(Q): 0.99 Prob(JB): 0.03
Heteroskedasticity (H): 2.65 Skew: 0.13
Prob(H) (two-sided): 0.00 Kurtosis: 4.11
===================================================================================
SARIMA(1, 1, 1)(1, 1, 1, 12) 模型的摘要:模型摘要中显示了各参数的估计值、标准误差、t 统计量等信息,以及 AIC/BIC 信息准则,用于评估模型的拟合效果。
2. 残差分析
# 绘制残差时间序列图
residuals = results.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals)
plt.title('Residuals of SARIMA(1, 1, 1)(1, 1, 1, 12) Model')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()
程序解释:
- 绘制 SARIMA 模型拟合后的残差时间序列图,观察残差的随机性和波动情况。如果残差表现为无趋势且围绕零线波动,则表明残差是白噪声。
程序的运行结果:
残差分析:残差时间序列图显示了 SARIMA 模型拟合后的残差。如果残差表现为随机波动且无显著趋势,则表明模型残差接近白噪声。
# 绘制残差的 ACF 图
plot_acf(residuals, lags=40)
plt.title('ACF of Residuals')
plt.show()
程序解释:
- 绘制残差的 ACF 图,检查残差的自相关性。如果残差的 ACF 图中没有显著的自相关性,说明残差符合白噪声的假设。
程序的运行结果:
残差的 ACF 图用于检查残差的自相关性,如果没有显著的自相关性,则残差可以被认为是白噪声。
3. Ljung-Box 检验
# Ljung-Box 检验
ljung_box_results = acorr_ljungbox(residuals, lags=[10], return_df=True)
print("Ljung-Box Test Results:")
print(ljung_box_results)
程序解释:
- 使用 Ljung-Box 检验进一步确认残差是否为白噪声。Ljung-Box 检验的 p 值如果较大(通常大于 0.05),则无法拒绝原假设,表明残差无显著自相关性。
程序的运行结果:
Ljung-Box Test Results:
lb_stat lb_pvalue
10 6.182128 0.799737
Ljung-Box 检验:Ljung-Box 检验的结果显示了残差的 p 值。如果 p 值较大(通常大于 0.05),则无法拒绝原假设,说明残差无显著自相关性,模型拟合效果较好。
4. 模型优化与对比
# 尝试不同的模型进行优化
model_alt = SARIMAX(data['Passengers'], order=(2, 1, 2), seasonal_order=(1, 1, 1, 12))
results_alt = model_alt.fit()
# 输出新的模型摘要
print("\nAlternative SARIMA(2, 1, 2)(1, 1, 1, 12) Model Summary:")
print(results_alt.summary())
程序解释:
- 尝试一个新的 SARIMA(2, 1, 2)(1, 1, 1, 12) 模型,并输出模型摘要信息。
程序的运行结果:
Alternative SARIMA(2, 1, 2)(1, 1, 1, 12) Model Summary:
SARIMAX Results
============================================================================================
Dep. Variable: Passengers No. Observations: 144
Model: SARIMAX(2, 1, 2)x(1, 1, [1], 12) Log Likelihood -503.024
Date: Mon, 02 Sep 2024 AIC 1020.048
Time: 20:28:01 BIC 1040.174
Sample: 01-01-1949 HQIC 1028.226
- 12-01-1960
Covariance Type: opg
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ar.L1 0.4441 0.388 1.145 0.252 -0.316 1.204
ar.L2 0.3287 0.303 1.086 0.278 -0.265 0.922
ma.L1 -0.8352 0.402 -2.079 0.038 -1.623 -0.048
ma.L2 -0.1385 0.385 -0.359 0.719 -0.894 0.617
ar.S.L12 -0.8799 0.274 -3.213 0.001 -1.417 -0.343
ma.S.L12 0.7843 0.359 2.183 0.029 0.080 1.489
sigma2 124.5105 14.050 8.862 0.000 96.974 152.047
===================================================================================
Ljung-Box (L1) (Q): 0.03 Jarque-Bera (JB): 12.42
Prob(Q): 0.86 Prob(JB): 0.00
Heteroskedasticity (H): 2.62 Skew: 0.14
Prob(H) (two-sided): 0.00 Kurtosis: 4.48
===================================================================================
-
模型优化与对比:尝试一个新的 SARIMA(2, 1, 2)(1, 1, 1, 12) 模型,并与原模型进行对比。
# 绘制新的模型残差时间序列图
residuals_alt = results_alt.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals_alt)
plt.title('Residuals of SARIMA(2, 1, 2)(1, 1, 1, 12) Model')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()
# 对新模型的残差进行 Ljung-Box 检验
ljung_box_results_alt = acorr_ljungbox(residuals_alt, lags=[10], return_df=True)
print("Ljung-Box Test Results for SARIMA(2, 1, 2)(1, 1, 1, 12):")
print(ljung_box_results_alt)
程序解释:
- 比较新旧模型的残差分析结果和 Ljung-Box 检验结果,以确定新的模型是否在残差方面有显著改善。
程序的运行结果:
Ljung-Box Test Results for SARIMA(2, 1, 2)(1, 1, 1, 12):
lb_stat lb_pvalue
10 5.775787 0.833736
新模型的残差分析和 Ljung-Box 检验结果将显示新的模型在残差方面是否有改善,如果新模型的残差表现更接近白噪声,且 AIC/BIC 值更低,则表明新模型更优。
-
三、结果分析
1. 残差分析与模型诊断
- 通过残差时间序列图和 ACF 图,验证了 SARIMA 模型残差的白噪声性质。如果残差没有显著的自相关性,说明模型已经有效捕捉了时间序列中的季节性和趋势成分。
2. Ljung-Box 检验
- Ljung-Box 检验结果表明残差无显著的自相关性,进一步证明模型残差是白噪声。通过这种统计检验,可以确认模型的拟合效果。
3. 模型的优化与调整
- 通过调整 SARIMA 模型的参数 ,可以进一步提升模型的拟合效果。新拟合的 SARIMA(2, 1, 2)(1, 1, 1, 12) 模型可能在 AIC/BIC 值和残差表现上优于原模型。
通过这次学习,您掌握了如何对 SARIMA 模型进行诊断与调整,包括残差分析、Ljung-Box 检验、参数调整等过程。这些步骤对于提高 SARIMA 模型的预测精度至关重要,有助于更好地捕捉时间序列数据中的季节性和趋势特征。