python 回归去掉共线性_Python计算方差膨胀因子VIF

方差扩大因子(variance inflation factor)简称VIF,是表征自变量观察值之间复共线性程度的数值。线性回归分析中,回归系数βj的估计量的方差为σ2Cjj,其中Cjj=(1-Rj)-1,称Cjj为βj的方差扩大因子,这里Rj为xj对其余p-1个自变量的复相关系数的平方,显然Cjj≥1,它的大小可以反映出自变量的观察值之间是否存在复共线性以及其程度如何,Cjj越大,复共线性越严重。(以上引自百度百科),更多关于多重共线性的内容,可自行查询资料,资料很多。

本文重点说一下用Python调用variance_inflation_factor计算VIF函数遇到的坑。

下面的定义函数中直接调用的variance_inflation_factor函数计算的VIF,得到的结果是不对的。

def 

以上所用数据集都是经过预处理WOE转换过的

可以看到上边计算的VIF都异常的大(VIF大于10就认为存在严重多重共线性,严格一些大于5也认为存在多重共线性)。

下边我们从VIF的定义出发,再重新定义一个计算VIF的新函数。如下:

def 

结果输出:

以上所用数据均相同

以上输出值才是该数据集变量的VIF值。

那么为什么用variance_inflation_factor计算的不对呢?以下是variance_inflation_factor的源码:

from 

这是由于Python的OLS不同,在Python方差膨胀因子计算中使用的OLS默认情况下不会添加截距。

所以要做的是在数据框中再增加一列,并填充一列以代表一个常数(使用常数1)。这将是方程式的截距项。完成此操作后,计算的值就对了。如下:

def 

添加一列名为"c"的常数列,使填充值为1,结果输出如下:

忽略常数c的值

这样结果就一样了。以上两种方式都可以计算正确的VIF值。

你可能感兴趣的:(python,回归去掉共线性)