我正在尝试在 Python 和 R 中使用 VIF 检测多重共线性。根据我的知识,如果没有多重共线性,VIF 应该小于 10。但是对于2个以上类别的分类变量,有些类别的VIF很高。我的数据包括10多个类别的变量。这是我在 Python 中所做的:
y, X = dmatrices('InvoiceUnitPrice~NewWidth+NewLength+NewThickness+InvoiceQuantity+Weight+SUPP_CD', data=ga_for_model, return_type='dataframe')
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif["features"] = X.columns
vif
Out[198]:
VIF Factor features
0 171.420478 Intercept
1 16.307844 SUPP_CD[W2]
2 7.677684 SUPP_CD[W3]
3 5.200108 SUPP_CD[Y0]
4 1.033676 SUPP_CD[Y4]
5 1.324480 SUPP_CD[Y1]
6 1.030234 SUPP_CD[H0]
7 1.220017 SUPP_CD[L0]
8 1.067945 SUPP_CD[L1]
9 1.163532 SUPP_CD[X1]
... ... ...
83 2.692464 NewWidth
84 2.729983 NewLength
85 1.744165 NewThickness
86 1.426814 InvoiceQuantity
87 1.079581 Weight
[88 rows x 2 columns]
如图所示,SUPP_CD[W2] 具有非常高的 VIF。然后我在 R 中使用vif()from carpackage 再次运行结果:
> vif(model)
GVIF Df GVIF^(1/(2*Df))
for_R$NewWidth 2.780087 1 1.667359
for_R$NewLength 2.834620 1 1.683633
for_R$SUPP_CD 7419.836402 82 1.055845
for_R$NewThickness 2.367231 1 1.538581
for_R$Type 8406.690333 21 1.240062
for_R$InvoiceQuantity 1.495487 1 1.222901
for_R$Weight 1.142044 1 1.068665
这两个结果之间的差异让我感到困惑。对于 R 中的结果,我查看了应该使用哪个方差膨胀因子之间的差异: \ GVIF Dftext或 ?GVIF^(1/(2*Df))
“Georges Monette 和我在论文“广义共线性诊断”中介绍了 GVIF,JASA 87:178-183, 1992(链接)。正如我们所解释的,GVIF 表示子集的联合置信椭球的超体积的平方比如果该子集中的回归量与互补子集中的回归量不相关,则将获得“乌托邦”椭球的系数。在单个系数的情况下,这专门用于通常的 VIF。为了使 GVIF 在各个维度上具有可比性,我们建议使用 GVIF^(1/(2*Df)),其中 Df 是子集中系数的数量。实际上,这会将 GVIF 降低为线性度量,对于 VIF,其中 Df = 1,与由于系数的置信区间共线性导致的通货膨胀。”
所以我认为 R 的结果通过查看没有指出多重共线性
GVIF^(1/(2*Df))(如果我错了,请纠正我。)
但是对于 Python 中的结果,它为每个类别提供 VIF。我不知道如何解释它们以及如何处理它们。
尽管 Paul Allison 在您何时可以安全地忽略多重共线性中介绍了 3 种可以忽略高 VIF 值的情况 ?,他只提到虚拟变量。不适合我的问题。
- 具有高 VIF 的变量是指示(虚拟)变量,代表具有三个或更多类别的分类变量。如果参考类别中的案例比例较小,则指标变量必然具有较高的 VIF,即使该类别变量与回归模型中的其他变量不相关。
例如,假设婚姻状况变量具有三类:当前已婚、未婚和以前结婚。您选择以前结婚作为参考类别,其他两个具有指示变量。所发生的情况是,这两个指标之间的相关性会随着参考类别中的人的比例变小而变得更负。例如,如果 45% 的人未婚、45% 已婚和 10% 以前结过婚,则已婚和未婚指标的 VIF 至少为 3.0。
我知道我可以将分类变量转换为虚拟变量,但 VIF 函数在没有转换的情况下仍然有效。请帮忙。谢谢!