Python statsmodels 线性回归自相关检测:DW与LM检验的3种实现与结果解读

在时间序列数据分析中,线性回归模型的自相关问题是一个常见但容易被忽视的挑战。想象一下这样的场景:您正在分析某电商平台过去24个月的销售额与广告投入的关系,使用普通最小二乘法(OLS)建立了回归模型。表面上看,模型拟合效果不错,R²达到0.85,但当您深入检查残差时,却发现本月的高销售额往往伴随着下个月的高销售额,残差呈现出明显的"记忆效应"——这正是自相关的典型表现。

1. 自相关:隐藏在时间序列中的"记忆效应"

自相关(Autocorrelation)是指时间序列中当前观测值与历史观测值之间的相关性。在回归分析中,它特指误差项之间存在相关性,违背了经典线性回归模型中误差项相互独立的基本假设。

为什么自相关如此危险? 因为它会导致:

  • 回归系数的标准误被低估,使t检验和F检验失效
  • 置信区间和预测区间变窄,产生过度乐观的结论
  • 模型预测能力下降,特别是在时间序列预测中

表:自相关对回归分析的影响

影响维度 无自相关时 存在自相关时
系数估计 无偏但有效 仍无偏但无效
标准误估计 准确 通常被低估
假设检验 有效 可能严重误导
预测区间 准确 过于乐观

在Python生态中, statsmodels 库提供了完整的工具链来检测和处理自相关问题。下面我们将重点介绍三种最实用的自相关检测方法:图示法、Durbin-Watson(DW)检验和Breusch-Godfrey(LM)检验。

2. 实战准备:构建含自相关问题的回归模型

为了演示自相关检测方法,我们首先需要创建一个存在自相关问题的回归模型。这里使用中国1995-2014年的GDP与进口总额数据作为示例。

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

# 示例数据:GDP(亿元)与进口总额(亿元)
data = np.array([
    [61129.8, 11048.1], [71572.3, 11557.4], [79429.5, 11806.5],
    [84883.7, 11626.1], [90187.7, 13736.4], [99776.3, 18638.8],
    [110270.4, 20159.2], [121002.0, 24430.3], [136564.6, 34195.6],
    [160714.4, 46435.8], [185895.8, 54273.7], [217656.6, 63376.9],
    [268019.4, 73300.1], [316751.7, 79526.5], [345629.2, 68618.4],
    [408903.0, 94699.3], [484123.5, 113161.4], [534123.0, 114801.0],
    [588018.8, 121037.5], [636138.7, 120358.0]
])

# 准备数据
X = data[:, 0]  # GDP作为自变量
y = data[:, 1]  # 进口总额作为因变量
X = sm.add_constant(X)  # 添加常数项

# 构建OLS模型
model = sm.OLS(y, X)
results = model.fit()

# 输出模型摘要
print(results.summary())

运行上述代码后,您将看到模型摘要输出,其中包含我们后续分析需要的关键信息。

3. 三种自相关检测方法详解

3.1 图示法:直观的第一道防线

图示法是检测自相关最简单直接的方法,主要通过两种图形来实现:

  1. 残差序列图 :绘制残差随时间变化的折线图
  2. 残差散点图 :绘制残差e_t与e_{t-1}的散点图
# 获取预测值和残差
y_pred = results.predict(X)
residuals = y - y_pred

# 创建画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 残差序列图
ax1.plot(residuals, marker='o')
ax1.axhline(y=0, color='r', linestyle='--')
ax1.set_title('残差序列图')
ax1.set_xlabel('时间顺序')
ax1.set_ylabel('残差值')

# 残差散点图
ax2.scatter(residuals[:-1], residuals[1:])
ax2.set_title('残差散点图')
ax2.set_xlabel('e_{t-1}')
ax2.set_ylabel('e_t')

plt.tight_layout()
plt.show()

如何解读图示结果?

  • 残差序列图 :如果残差呈现系统性波动模式(如连续正值后跟连续负值),表明存在自相关
  • 残差散点图 :如果点聚集在一条斜线附近,表明存在自相关;右上倾斜为正相关,右下倾斜为负相关

提示:图示法虽然直观,但缺乏定量判断标准,通常需要与其他检验方法结合使用。

3.2 Durbin-Watson检验:经典的一阶自相关检测

Durbin-Watson(DW)检验是检测一阶自相关最常用的方法,其统计量计算公式为:

DW = Σ(e_t - e_{t-1})² / Σe_t²

在Python中,DW统计量已集成在 statsmodels 的模型摘要中:

print(f"Durbin-Watson统计量: {results.durbin_watson:.3f}")

DW检验结果解读准则

DW值范围 自相关情况
0 ≤ DW < dL 存在正自相关
dL ≤ DW < dU 无法确定
dU ≤ DW < 4-dU 无自相关
4-dU ≤ DW < 4-dL 无法确定
4-dL ≤ DW ≤ 4 存在负自相关

其中dL和dU是临界值,可通过查表获得。对于我们的示例(n=20, k=1):

dL = 1.20  # 下限临界值
dU = 1.41  # 上限临界值
dw = results.durbin_watson

if dw < dL:
    print("存在正自相关")
elif dw > 4 - dL:
    print("存在负自相关")
elif dL <= dw < dU or 4 - dU < dw <= 4 - dL:
    print("无法确定是否存在自相关")
else:
    print("无自相关")

DW检验的局限性

  • 仅检测一阶自相关
  • 存在"无法确定"的灰色区域
  • 不适用于包含滞后因变量的模型

3.3 Breusch-Godfrey(LM)检验:更强大的高阶自相关检测

Breusch-Godfrey检验(又称拉格朗日乘数检验)克服了DW检验的局限性,能够检测高阶自相关,适用于包含滞后因变量的模型。

在Python中的实现:

from statsmodels.stats.diagnostic import acorr_breusch_godfrey

# 执行LM检验(默认检测1阶自相关)
bg_test = acorr_breusch_godfrey(results, nlags=1)
print(f"LM统计量: {bg_test[0]:.3f}")
print(f"P值: {bg_test[1]:.3f}")

# 检测高阶自相关(如3阶)
bg_test_high_order = acorr_breusch_godfrey(results, nlags=3)
print(f"\n3阶LM统计量: {bg_test_high_order[0]:.3f}")
print(f"P值: {bg_test_high_order[1]:.3f}")

LM检验结果解读

  • 原假设:不存在自相关(至指定阶数)
  • 备择假设:存在自相关
  • 判断标准:当P值小于显著性水平(如0.05)时,拒绝原假设

LM检验的优势

  • 可检测任意阶数的自相关
  • 适用于更广泛的模型设定
  • 结果明确(不像DW检验存在不确定区域)

4. 自相关问题的解决方案

当检测到自相关后,常见的解决方法包括:

  1. 广义差分法 :将原模型转换为差分形式消除自相关
  2. Cochrane-Orcutt迭代法 :迭代估计自相关系数并调整模型
  3. Newey-West标准误 :保持原模型但修正标准误估计
  4. 引入滞后变量 :将滞后因变量作为解释变量纳入模型

以下演示广义差分法的实现:

# 估计一阶自相关系数
rho = np.corrcoef(residuals[:-1], residuals[1:])[0, 1]

# 广义差分变换
y_diff = y[1:] - rho * y[:-1]
X_diff = X[1:, :] - rho * X[:-1, :]

# 重新拟合模型
model_diff = sm.OLS(y_diff, X_diff)
results_diff = model_diff.fit()

# 输出新模型摘要
print(results_diff.summary())
print(f"\nDurbin-Watson统计量(处理后): {results_diff.durbin_watson:.3f}")

表:自相关处理方法比较

方法 适用场景 优点 缺点
广义差分法 已知自相关结构 直接消除自相关 损失第一个观测值
Cochrane-Orcutt 一阶自相关明显 自动迭代估计ρ 可能不收敛
Newey-West标准误 保持原模型形式 不改变系数估计 不提高估计效率
引入滞后变量 动态经济关系 经济意义明确 增加多重共线性风险

在实际项目中,我经常遇到这样的情况:处理后的模型DW统计量接近2,但LM检验仍显示存在高阶自相关。这时需要综合考虑业务背景和统计指标,有时引入适当的滞后变量或改用时间序列专用模型(如ARIMA)可能是更好的选择。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐