Skip to content

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表示负相关')
        }

Released under the AGPL-3.0 License.