外观
方差膨胀因子(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)