外观
Durbin-Watson 检验
一阶序列相关的 DW 检验。
核心代码
py
@staticmethod
def durbin_watson_test(
df: pd.DataFrame,
y_var: str,
x_vars: List[str],
decimals: int = 4
) -> Dict[str, Any]:
"""
Durbin-Watson检验:检验一阶序列相关
参数:
df: 数据框
y_var: 因变量名
x_vars: 自变量列表
decimals: 小数位数
返回:
包含检验结果的字典
"""
# 准备数据
cols = [y_var] + x_vars
df_clean = df[cols].dropna()
if len(df_clean) < len(x_vars) + 3:
raise ValueError(_('样本量不足以进行Durbin-Watson检验'))
# 1. 估计OLS模型
formula = build_patsy_formula(y_var, x_vars)
model = smf.ols(formula, data=df_clean)
result = model.fit()
# 2. 获取残差
residuals = result.resid.values
# 3. 计算DW统计量
# DW = Σ(e_t - e_{t-1})² / Σe_t²
diff_resid = np.diff(residuals)
dw_stat = np.sum(diff_resid ** 2) / np.sum(residuals ** 2)
# 4. 判断结果
# DW统计量的理论范围是0到4
# DW ≈ 2: 无序列相关
# DW < 2: 正序列相关
# DW > 2: 负序列相关
if dw_stat < 1.5:
conclusion = _('存在显著正序列相关')
interpretation = _('残差呈现正相关,当前观测值的误差倾向于与前一期误差同向变动')
elif dw_stat > 2.5:
conclusion = _('存在显著负序列相关')
interpretation = _('残差呈现负相关,当前观测值的误差倾向于与前一期误差反向变动')
elif 1.8 <= dw_stat <= 2.2:
conclusion = _('不存在显著序列相关')
interpretation = _('残差基本独立,模型设定较为合理')
elif dw_stat < 1.8:
conclusion = _('可能存在正序列相关')
interpretation = _('残差可能呈现正相关,建议进一步检查')
else:
conclusion = _('可能存在负序列相关')
interpretation = _('残差可能呈现负相关,建议进一步检查')
return {
'test_name': 'Durbin-Watson Test for Serial Correlation',
'null_hypothesis': _('误差项不存在一阶序列相关'),
'alternative_hypothesis': _('误差项存在一阶序列相关'),
'dw_statistic': round(dw_stat, decimals),
'conclusion': conclusion,
'interpretation': interpretation,
'n_obs': len(df_clean),
'note': _('DW统计量范围:0-4。接近2表示无序列相关,<2表示正相关,>2表示负相关')
}