car::vif 的多重共线性检验

Multicollinearity test with car::vif

我正在尝试 运行 在 R 中进行 car::vif() 测试,以测试多重共线性。但是,当我 运行 代码

reg.model1 <- log(Price2) ~ Detached.house + Semi.detached.house + 
               Attached.houses + Apartment +
      Stock.apartment + Housing.cooperative + Sole.owner + Age +
      BRA + Bedrooms + Balcony + Lotsize + Sentrum + Alna + Vestre.Aker +
      Nordstrand + Marka + Ullern + Østensjø + Søndre.Nordstrand + Stovner + 
      Nordre.Aker + Bjerke + Grorud + Gamle.Oslo + St..Hanshaugen + 
      Grünerløkka + Sagene + Frogner 
reg1 <- lm(formula = reg.model1, data = Data)
vif(reg1)

我在控制台中收到此错误:

Error in vif.default(reg1) : there are aliased coefficients in the model.

我读到的是,这意味着模型中有一些东西是高度相关的。当我查看相关矩阵时,唯一高度相关的是因变量 Price。但我也在某处读到,即使因变量高度相关,它也可以。我还发现 BRA 的相关性为 0.8,所以我尝试在没有这个的情况下再次 运行 它,但仍然得到相同的错误。有谁知道可能是什么问题,或者我可以尝试做些什么不同的事情?

这告诉您某些预测变量集 is/are 完全(多)共线;如果你查看 coef(reg1) 你会看到至少一个 NA 值,如果你 运行 summary(lm) 你会看到消息

([n] not defined because of singularities)

(对于某些 n>=1)。检查预测变量的成对相关性是不够的,因为如果你有(例如)预测变量 A、B、C,其中成对相关性的(绝对值)none 恰好为 1,它们仍然可以是 共线。 (可能最常见的情况是 A、B、C 是描述一组相互排斥和完整的可能性的虚拟变量 [即对于每个观察,A、B、C 中恰好有一个为 1,另外两个为 0]。我强烈怀疑这就是你最后 16 个变量的原因,这些变量似乎是奥斯陆的自治市镇......)

检查哪些回归系数是 NA(如@Axeman 所建议)可以提示问题出在哪里; 解释了如何使用 model.matrix()caret::findLinearCombos 来准确找出导致问题的预测变量集。 (如果您所有的预测变量都是简单的数值变量,您可以跳过 model.matrix()。)

如果您的问题确实是由为每个可能的地理区域包含一个虚拟变量引起的,simplest/best 解决方案是将地理区域(行政区)作为 因素:如果你这样做,R 会自动生成一组 dummies/contrasts,但它会 自动留下一个假人 以避免此类问题。如果您以后想要返回并获取每个行政区的预测值,您可以使用 emmeanseffects 包中的工具。

我四处寻找解决方案,因为我无法根据答案解决它们。然而,这些答案帮助我更好地理解了我的问题。我的问题的解决方案非常简单,只需为其中一个虚拟变量加上减号而不是加号。这最初是我之前发布的代码:

reg.model1 <- log(Price2) ~ Detached.house + Semi.detached.house + 
               Attached.houses + Apartment +
      Stock.apartment + Housing.cooperative + Sole.owner + Age +
      BRA + Bedrooms + Balcony + Lotsize + Sentrum + Alna + Vestre.Aker +
      Nordstrand + Marka + Ullern + Østensjø + Søndre.Nordstrand + Stovner + 
      Nordre.Aker + Bjerke + Grorud + Gamle.Oslo + St..Hanshaugen + 
      Grünerløkka + Sagene + Frogner 
reg1 <- lm(formula = reg.model1, data = Data)
vif(reg1)

为了解决我的问题,我只需将我的代码更改为:

reg.model1 <- log(Price2) ~ Detached.house + Semi.detached.house + 
               Attached.houses - Apartment +
      Stock.apartment + Housing.cooperative - Sole.owner + Age +
      BRA + Bedrooms + Balcony + Lotsize + Sentrum + Alna + Vestre.Aker +
      Nordstrand + Marka + Ullern + Østensjø + Søndre.Nordstrand + Stovner + 
      Nordre.Aker + Bjerke + Grorud + Gamle.Oslo + St..Hanshaugen + 
      Grünerløkka + Sagene - Frogner 
reg1 <- lm(formula = reg.model1, data = Data)
vif(reg1)

如您所见,我有 3 个系列的假人,为了确保不会发生多重共线性,我必须从每个假人中删除一个假人。我已经删除了房屋类型的公寓,所有权类型的唯一所有者和地区的 Frogner。这个网站比我(https://www.learndatasci.com/glossary/dummy-variable-trap/)!

更好更简单地解释了这个问题和解决方案