【问题标题】:Multi Collinearity for Categorical Variables分类变量的多重共线性
【发布时间】:2016-01-28 14:50:22
【问题描述】:

对于数值/连续数据,为了检测预测变量之间的共线性,我们使用 皮尔逊相关系数,并确保预测变量彼​​此之间不相关,但与响应变量相关。


但是,如果我们有一个数据集,其中预测变量都是分类,我们如何检测多重共线性。我正在共享一个数据集,我试图找出预测变量是否相关


> A(Response Variable)   B     C   D
> Yes                    Yes Yes Yes
> No                     Yes Yes Yes
> Yes                    No   No  No

如何做到这一点?

【问题讨论】:

  • 这个问题需要迁移到 CV,因为我已经标记了它。这对 SO 来说是题外话。
  • 如果提问者要求 R 代码来检测共线性或多重共线性(我建议通过计算方差膨胀因子或数据矩阵的容差水平来很好地完成),然后 CV.com可能不是正确的场地。当问题是“如何在 R 中做 X?”时,他们通常会将人们推荐给 SO。

标签: r statistics linear-regression


【解决方案1】:

共线性可以是,但不总是,只是一对变量的属性,在处理分类变量时尤其如此。因此,尽管高相关系数足以确定共线性可能是一个问题,但一堆成对的低到中等相关性并不足以证明缺乏共线性。变量的连续混合或分类集合的常用方法是查看方差膨胀因子(我的记忆告诉我它与方差-协方差-矩阵的特征值成正比)。无论如何,这是 package:rms 中vif-function 的代码:

vif  <- 
function (fit) 
{
    v <- vcov(fit, regcoef.only = TRUE)
    nam <- dimnames(v)[[1]]
    ns <- num.intercepts(fit)
    if (ns > 0) {
        v <- v[-(1:ns), -(1:ns), drop = FALSE]
        nam <- nam[-(1:ns)]
    }
    d <- diag(v)^0.5
    v <- diag(solve(v/(d %o% d)))
    names(v) <- nam
    v
}

分类变量更容易产生共线性的原因是三向或四向制表经常形成线性组合,导致完全共线性。你的例子是共线性的一个极端例子,但你也可以得到共线性

A B C D
1 1 0 0
1 0 1 0
1 0 0 1

请注意,这是共线的,因为 A == B+C+D 在所有行中。成对相关性都不高,但系统共同导致完全共线性。

将数据放入 R 对象并在其上运行 lm() 后,很明显还有另一种方法可以确定与 R 的共线性,这是因为 lm 将在结果中删除因子变量“别名”,这只是完全共线的另一个术语。

这是@Alex 演示高度共线数据的示例以及vif 在这种情况下的输出。一般来说,您希望看到方差膨胀因子低于 10。

> set.seed(123)
> dat2 <- data.frame(res = rnorm(100), A=sample(1:4, 1000, repl=TRUE)
+ )
> dat2$B<-dat2$A
> head(dat2)
          res A B
1 -0.56047565 1 1
2 -0.23017749 4 4
3  1.55870831 3 3
4  0.07050839 3 3
5  0.12928774 2 2
6  1.71506499 4 4
> dat2[1,2] <- 2   
#change only one value to prevent the "anti-aliasing" routines in `lm` from kicking in
> mod <-  lm( res ~ A+B, dat2) 
> summary(mod)

Call:
lm(formula = res ~ A + B, data = dat2)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.41139 -0.58576 -0.02922  0.60271  2.10760 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  0.10972    0.07053   1.556    0.120
A           -0.66270    0.91060  -0.728    0.467
B            0.65520    0.90988   0.720    0.472

Residual standard error: 0.9093 on 997 degrees of freedom
Multiple R-squared:  0.0005982, Adjusted R-squared:  -0.001407 
F-statistic: 0.2984 on 2 and 997 DF,  p-value: 0.7421

> vif ( mod )
       A        B 
1239.335 1239.335 

如果您创建第四个变量“C”,它独立于前两个预测器(当然,因为C 也是一个 R 函数,所以变量名称不好),您会从 vif 获得更理想的结果:

 dat2$C <- sample(1:4, 1000, repl=TRUE)

 vif ( lm( res ~ A + C, dat2) )
#---------    
   A        C 
1.003493 1.003493 

编辑:我意识到尽管从1:4 采样,我实际上并没有创建“分类变量”的 R 表示。该“样本”的因子版本也会出现同样的结果:

>  dat2 <- data.frame(res = rnorm(100), A=factor( sample(1:4, 1000, repl=TRUE) ) )
>  dat2$B<-dat2$A
>  head(dat2)
          res A B
1 -0.56047565 1 1
2 -0.23017749 4 4
3  1.55870831 3 3
4  0.07050839 3 3
5  0.12928774 2 2
6  1.71506499 4 4
>  dat2[1,2] <- 2   
> #change only one value to prevent the "anti-aliasing" routines in `lm` from kicking in
>  mod <-  lm( res ~ A+B, dat2) 
>  summary(mod)


Call:
lm(formula = res ~ A + B, data = dat2)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.43375 -0.59278 -0.04761  0.62591  2.12461 

Coefficients: (2 not defined because of singularities)
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.11165    0.05766   1.936   0.0531 .
A2          -0.67213    0.91170  -0.737   0.4612  
A3           0.01293    0.08146   0.159   0.8739  
A4          -0.04624    0.08196  -0.564   0.5728  
B2           0.62320    0.91165   0.684   0.4944  
B3                NA         NA      NA       NA  
B4                NA         NA      NA       NA  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9099 on 995 degrees of freedom
Multiple R-squared:  0.001426,  Adjusted R-squared:  -0.002588 
F-statistic: 0.3553 on 4 and 995 DF,  p-value: 0.8404

请注意,在系数计算中省略了两个因子水平。 ...因为它们与相应的 A 级完全共线。因此,如果您想查看 vif 为几乎共线的因子变量返回什么,您需要更改更多值:

> dat2[1,2] <- 2   
> dat2[2,2] <-2; dat2[3,2]<-2; dat2[4,2]<-4
>  mod <-  lm( res ~ A+B, dat2) 
>  summary(mod)

Call:
lm(formula = res ~ A + B, data = dat2)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.42819 -0.59241 -0.04483  0.62482  2.12461 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.11165    0.05768   1.936   0.0532 .
A2          -0.67213    0.91201  -0.737   0.4613  
A3          -1.51763    1.17803  -1.288   0.1980  
A4          -0.97195    1.17710  -0.826   0.4092  
B2           0.62320    0.91196   0.683   0.4945  
B3           1.52500    1.17520   1.298   0.1947  
B4           0.92448    1.17520   0.787   0.4317  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9102 on 993 degrees of freedom
Multiple R-squared:  0.002753,  Adjusted R-squared:  -0.003272 
F-statistic: 0.4569 on 6 and 993 DF,  p-value: 0.8403
#--------------
> library(rms)

> vif(mod)
      A2       A3       A4       B2       B3       B4 
192.6898 312.4128 308.5177 191.2080 312.5856 307.5242 

【讨论】:

  • 分类变量不能共线性。它们不代表欧几里得空间中的线性度量。卡方检验可用于检验分类变量的独立性。
  • R 因子变量表示为整数,在我描述的情况下它们可能共线,因为它是由数据叉积形成的矩阵的可逆性确定是否存在共线性。
  • 没有。这是统计学和数学中的定义性事物。共线(def-geometry):如果点位于一条直线上,则称它们是共线的。共线性(def-statistics):两个变量之间的线性关系......您提供了一个使用 VIF 的经验示例,该示例在统计上没有实质性意义。由于您描述的 R 中的整数编码,IE-VIF 确实在 R 中计算。但这并不意味着它具有统计上有效的解释。
  • 您不是在尝试生成解释,而是为了防止分析中的错误。顺便说一句,您拼错了您要“保护”的术语。
  • 感谢拼写错误...同意--让我们防止分析中的错误。认为分类变量可以共线是错误的分析。
猜你喜欢
  • 2014-06-21
  • 2013-12-15
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2014-07-17
  • 2019-07-20
  • 2019-06-03
相关资源
最近更新 更多