我正在尝试为python中的简单数据集中的每一列计算方差膨胀因子(VIF):
a b c d
1 2 4 4
1 2 6 3
2 3 7 4
3 2 8 5
4 1 9 4
我已经使用usdm library中的vif函数在R中完成了此操作,该函数给出以下结果:
a <- c(1, 1, 2, 3, 4)
b <- c(2, 2, 3, 2, 1)
c <- c(4, 6, 7, 8, 9)
d <- c(4, 3, 4, 5, 4)
df <- data.frame(a, b, c, d)
vif_df <- vif(df)
print(vif_df)
Variables VIF
a 22.95
b 3.00
c 12.95
d 3.00
但是,当我使用statsmodel vif function在python中执行相同操作时,我的结果是:
a = [1, 1, 2, 3, 4]
b = [2, 2, 3, 2, 1]
c = [4, 6, 7, 8, 9]
d = [4, 3, 4, 5, 4]
ck = np.column_stack([a, b, c, d])
vif = [variance_inflation_factor(ck, i) for i in range(ck.shape[1])]
print(vif)
Variables VIF
a 47.136986301369774
b 28.931506849315081
c 80.31506849315096
d 40.438356164383549
即使输入相同,结果也大不相同。通常,statsmodel VIF函数的结果似乎是错误的,但是我不确定这是否是由于我的调用方式所致,还是函数本身存在问题。
我希望有人可以帮助我弄清楚我是错误地调用statsmodel函数还是解释结果中的差异。如果函数存在问题,那么python中是否有其他VIF替代方案?
最佳答案
我相信这样做的原因是由于Python的OLS不同。在python方差膨胀因子计算中使用的OLS默认情况下不会添加拦截。但是,您肯定要在其中进行拦截。
您想要做的是在矩阵ck中再增加一列,并填充一列以代表一个常数。这将是方程式的截距项。完成此操作后,您的值应正确匹配。
编辑:用零代替零
关于python - Python中的方差膨胀因子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42658379/