时间序列中的动态模型常常表现出序列相关性,即误差项随时间存在相关性。序列相关性违反了误差项独立的经典假设,从而导致估计效率低下、标准误差错误以及统计推断具有误导性。
序列相关性,也称为自相关性,是指回归模型的残差(ϵt)与过去的残差(ϵt−1, ϵt−2,…)之间存在相关性。在动态模型中,变量的过去值会影响当前值,因此序列相关性是一个常见问题。
序列相关性的存在意味着:
其中:
如果动态模型中存在序列相关性,那么标准误差会有偏差。这会导致统计检验具有误导性。这也意味着我们违反了普通最小二乘法(OLS,即回归)的假设,因此置信区间和假设检验变得不可靠。结果,使用该模型进行的任何预测都会不够准确,并且容易将误差传播到未来的预测中(即产生不良结果)。
检测序列相关性
有几种方法可以检验残差中的序列相关性:
让我们使用来自 FRED 的数据(密歇根大学:通货膨胀预期(MICH))来检查分布滞后模型中的序列相关性。
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.graphics.tsaplots as tsaplots
from statsmodels.stats.diagnostic import acorr_breusch_godfrey
from statsmodels.regression.linear_model import GLS, GLSAR
from datetime import datetime
from pandas_datareader import data as web
import matplotlib.pyplot as plt
from visualization import plot_time_series, plot_decomposition
# Function to fetch data from FRED
def get_fred_data(series_id, start_date="2000-01-01", end_date=None):
if end_date is None:
end_date = datetime.now().strftime("%Y-%m-%d")
df = web.DataReader(series_id, 'fred', start_date, end_date)
return df.dropna()
# Fetch University of Michigan Consumer Sentiment Index (MICH)
series_id = "MICH"
mich_data = get_fred_data(series_id)
mich_data = mich_data.pct_change().dropna() # Convert to percentage change
# Prepare DataFrame
mich_data = mich_data.rename(columns={series_id: "MICH"})
mich_data["Date"] = mich_data.index # Ensure a date column for plotting
# Create lagged MICH values
for lag in range(1, 3): # Include 2 lags
mich_data[f"MICH_lag{lag}"] = mich_data["MICH"].shift(lag)
# Drop missing values due to lagging
mich_data.dropna(inplace=True)
# Define independent and dependent variables
X_lags = ["MICH", "MICH_lag1", "MICH_lag2"]
X_matrix = sm.add_constant(mich_data[X_lags]) # Add intercept
y_vector = mich_data["MICH"] # Target is MICH itself (can be changed)
# Fit a distributed lag model
model = sm.OLS(y_vector, X_matrix).fit()
# Perform the Breusch-Godfrey test for serial correlation
bg_test = acorr_breusch_godfrey(model, nlags=2)
print(f"Breusch-Godfrey Test p-value: {bg_test[1]:.4f}")
Breusch-Godfrey 检验(p 值 = 0.0000)用于检查残差中的序列相关性。p 值为 0.0000 意味着拒绝无序列相关性的原假设。因此,我们得出结论,残差存在自相关性,这表明模型的误差项不是独立的。
处理序列相关性
如果检测到序列相关性,有几种方法可以纠正它:
广义最小二乘法(GLS)通过考虑序列相关性的结构来修改普通最小二乘法(OLS):
from statsmodels.regression.linear_model import GLS
gls_model = GLS(y_vector, X_matrix).fit()
print(gls_model.summary())
广义最小二乘法(GLS)模型显示,MICH 的系数为 1.0000,t 统计量接近 0。MICH_lag1 和 MICH_lag2 的影响接近零,且 p 值较高。R² = 1.000,表明拟合完美(这非常可疑)。Durbin-Watson 统计量为 2.392,接近 2,表明自相关性得到了一定程度的修正。
Cochrane-Orcutt 方法使用迭代程序来转换回归模型,以消除序列相关性。
from statsmodels.regression.linear_model import GLSAR
cochrane_orcutt = GLSAR(y_vector, X_matrix, rho=1).iterative_fit()
print(cochrane_orcutt.summary())
GLSAR(Cochrane-Orcutt)方法显示,MICH 的系数仍为 1.0000,这证实了存在近乎完美的相关性。MICH_lag1 和 MICH_lag2 现在变得显著(p < 0.05),表明它们增加了一些解释力。Durbin-Watson 统计量为 1.533,仍表明存在一些自相关性,但相较于 GLS 模型有所改善。
Newey-West 稳健标准误
如果我们无法修正模型结构,Newey-West 稳健标准误可以提供有效的推断。
model_robust = model.get_robustcov_results(cov_type="HAC", maxlags=2)"HAC", maxlags=2)
print(model_robust.summary())
Newey-West(也称为具有异方差自相关(HAC)的 OLS)调整了自相关和异方差性下的标准误。令人惊讶的是,系数几乎保持不变。MICH_lag1 和 MICH_lag2 仍然不显著,表明它们没有提供太多解释力。Durbin-Watson 统计量为 2.392,接近 2,表明自相关性有所减少。
为了诊断序列相关性,我们可以绘制残差的自相关函数(ACF)图。
import statsmodels.graphics.tsaplots as tsaplots
# Extract residuals
residuals = model.resid
# Plot ACF
plt.figure(figsize=(10, 5))
tsaplots.plot_acf(residuals, lags=20, alpha=0.05)
plt.xlabel("Lag")
plt.ylabel("Autocorrelation")
plt.title("Autocorrelation of Residuals")
plt.savefig("residual_acf.png")
plt.show()
自相关函数(ACF)图证实了序列相关性的存在。滞后1期的尖峰表明存在强烈的自相关性。大多数其他滞后期都保持在置信带内,这意味着问题主要出现在较低的滞后期。该图支持了 Breusch-Godfrey 检验的结果。
在此情况下,我们得出结论,存在序列相关性(由 Breusch-Godfrey 检验(p = 0.0000)和 ACF 图证实)。如 Durbin-Watson 统计量所示,广义最小二乘法(GLS)和广义最小二乘自回归(GLSAR)模型处理序列相关性的效果优于普通最小二乘法(OLS)。密歇根大学的通货膨胀预期数据存在高度自相关性,且滞后期对解释的贡献很小。
我们可以通过研究差分模型或使用 ARIMA 等工具来改进这一分析。
序列相关性是动态模型(特别是涉及滞后预测变量的模型)中的常见问题。如果忽视它,会导致估计效率低下和推断结果具有误导性。Breusch-Godfrey 检验有助于检测序列相关性,而 GLS、Cochrane-Orcutt 和 Newey-West 校正方法则有助于解决这一问题。