Skip to content

方差膨胀因子(VIF)

通过辅助回归计算 VIF,诊断多重共线性。

核心代码

py
    def _fit_vif(self, df: pd.DataFrame, decimals: int, title: str) -> None:
        """
        执行 VIF 共线性检验
        
        参数:
            df: 清洗后的数据框
            decimals: 小数位数
            title: 表格标题
        """
        X = df.copy()
        X['const'] = 1
        vif_data = []
        vif_values = []  # 用于计算 Mean VIF
        
        for i in range(len(X.columns)):
            col_name = X.columns[i]
            if col_name == 'const':
                continue
            try:
                val = variance_inflation_factor(X.values, i)
                if np.isinf(val):
                    vif_str = "Inf"
                    tol_str = "0.000"
                else:
                    vif_str = f"{val:.{decimals}f}"
                    tol_str = f"{1/val:.{decimals}f}"  # 容忍度 1/VIF
                    vif_values.append(val)
                
                vif_data.append({
                    'Variable': col_name,
                    'VIF': vif_str,
                    '1/VIF': tol_str
                })
            except Exception:
                vif_data.append({
                    'Variable': col_name,
                    'VIF': 'Error',
                    '1/VIF': '-'
                })
        
        # 计算 Mean VIF
        if vif_values:
            mean_vif = np.mean(vif_values)
            vif_data.append({
                'Variable': 'Mean VIF',
                'VIF': f"{mean_vif:.{decimals}f}",
                '1/VIF': '.'
            })
        
        vif_df = pd.DataFrame(vif_data)
        title = title if title else "Variance Inflation Factor"
        self.custom_html = self._generate_html_table(vif_df, title, index_name=None)

Released under the AGPL-3.0 License.