超过 2 个类别的类别变量的 VIF

机器算法验证 r 多重回归 Python 多重共线性
2022-03-24 00:36:50

我正在尝试在 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))
GVIFGVIF1/(2df)

“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 值的情况 ?,他只提到虚拟变量。不适合我的问题。

  1. 具有高 VIF 的变量是指示(虚拟)变量,代表具有三个或更多类别的分类变量。如果参考类别中的案例比例较小,则指标变量必然具有较高的 VIF,即使该类别变量与回归模型中的其他变量不相关。
    例如,假设婚姻状况变量具有三类:当前已婚、未婚和以前结婚。您选择以前结婚作为参考类别,其他两个具有指示变量。所发生的情况是,这两个指标之间的相关性会随着参考类别中的人的比例变小而变得更负。例如,如果 45% 的人未婚、45% 已婚和 10% 以前结过婚,则已婚和未婚指标的 VIF 至少为 3.0。

我知道我可以将分类变量转换为虚拟变量,但 VIF 函数在没有转换的情况下仍然有效。请帮忙。谢谢!

1个回答

vif()在 Rcar的函数中实现的“广义方差膨胀因子”(GVIF)Fox 和 Monette专门设计用于处理这样的情况,其中有一组预测变量应该一起考虑而不是单独考虑。这种情况包括多级分类变量和单个变量中的多项式项。

维基百科页面上描述的标准 VIF 计算(显然是在 Pythonvariance_inflation_factor()函数中实现的)分别处理每个预测器。然后级分类变量计为预测变量,该类型 VIF 计算的结果将取决于该变量的编码方式,特别是哪个类别被视为参考水平。Allison 在您链接的帖子中提到了这一点,建议在执行该类型的 VIF 计算时使用最常见的类别作为参考。kk1

GVIF 方法为应该一起考虑的每组预测变量提供了一个组合的共线性度量,就像您的每个多级分类变量一样。它以一种独立于这些预测变量如何编码的细节的方式做到这一点。然后,该GVIF^(1/(2*Df))计算提供了具有不同维度的预测器集之间的可比性。

因此,在您的情况下,GVIF 方法最适用,并且似乎没有多重共线性的实质性证据。