方差膨胀因子VIF

VIF公式是




Ri是第i个变量xi与其他全部变量xj(i=1,2,...,k; i≠j)的复相关系数,复相关系数就是xi作因变量,其他全部变量xj为自变量做一个新的回归,预测值和真值计算得到的相关系数,Ri2就是拟合优度,也叫决定系数(coefficient of determination)。

复相关系数,单数/复数,复就是多个,顾名思义,多个自变量组成的回归方程拟合值与真值的相关系数。

因为R2在0到1之间,所以VIF是1到正无穷,越小越好。

经验注意的说法,VIF >= 10,>= 5,>=3就认为有严重的多重共线性。

复相关系数和pearson相关矩阵是存在关联的。





P是相关系数矩阵的行列式,求出来是一个数值

M_ii是相关系数矩阵去掉i行i列得到的余子式的结果

我实际验证了一下,基本是吻合的,可能不同的轮子存在计算精度的问题?


20220721补充:

1、statsmodels.stats.outliers_influence.variance_inflation_factor这个计算出的VIF是默认没有截距项做的回归,有时候会出现很夸张的VIF(1000左右),之前是用WOE转换的变量算的VIF没发现这个问题,昨天用未WOE编码的数据发现了这个问题,所以如果要用statsmodels.stats.outliers_influence.variance_inflation_factor,要手动在X上再加1个全为1的column,就像statsmodels的LR那样。我上面图中的VIF细微差异,可能也是这个原因造成的。

2、VIF还有一种算法,相关系数矩阵的逆矩阵的对角线就是VIF,参考https://github.com/statsmodels/statsmodels/issues/2376,python代码

np.diag(np.linalg.inv(np.corrcoef(x, rowvar=0)))

3、statsmodels.stats.outliers_influence.variance_inflation_factor加了截距项后计算出来的vif就和2相同。我推测加截距后也和上面行列式的算法相同。





留言

熱門文章