分类变量的多重共线性

时间:2015-10-28 17:29:38

标签: r statistics linear-regression

对于数值/连续数据,要检测预测变量之间的共线性,我们使用 Pearson相关系数,并确保预测变量之间没有相关性,但与响应变量相关。

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

#include <iostream>

namespace X {
    void p() {
        void q();   // This is a block scope declaration of the function q() with external
                    // linkage (by §3.5/6), which then must be defined in namespace X,
                    // according to §3.5/7, and not in the global namespace.
        q();
    }
}

void q() { std::cout << "q()" << '\n'; }

int main()
{
    X::p();
}

如何做同样的事?

1 个答案:

答案 0 :(得分:3)

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

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”,它独立于前两个perdictors(因为C也是一个R函数,因此确实是一个变量的错误名称),你可以从{{得到更理想的结果1}}:

vif

编辑:我意识到尽管从 dat2$C <- sample(1:4, 1000, repl=TRUE) vif ( lm( res ~ A + C, dat2) ) #--------- A C 1.003493 1.003493 采样,我还没有真正创建“分类变量”的R表示。使用该“样本”的因子版本会出现同样的结果:

1:4

请注意,系数计算中省略了两个因子水平。 ...因为它们与相应的A级完全共线。因此,如果您想查看> 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 返回几乎共线的因子变量的内容,您需要更改一些值:

vif