对于数值/连续数据,为了检测预测变量之间的共线性,我们使用了皮尔逊相关系数,并确保了预测变量之间没有相关性,而是与响应变量相关。
但是,如果我们有一个数据集,那么如何检测multicollinearity,其中的预测器都是分类。我正在共享一个数据集,其中我试图找出预测变量是否相关。
> A(Response Variable) B C D
> Yes Yes Yes Yes
> No Yes Yes Yes
> Yes No No No如何做同样的事情?
发布于 2015-10-28 21:58:32
共线性可以是,但并不总是,只是一对变量的性质,在处理范畴变量时尤其如此。因此,虽然高相关系数足以证明共线性可能是一个问题,但由于缺乏共线性,一组成对的低到中等相关性并不是一个充分的检验。对于变量的连续、混合或分类集合,通常的方法是查看方差膨胀因子(我的记忆告诉我,这些因素与方差协方差矩阵的特征值成正比)。无论如何,这是包中的vif-function的代码: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函数),这对变量来说是个不好的名称),那么您可以从vif得到一个更理想的结果。
dat2$C <- sample(1:4, 1000, repl=TRUE)
vif ( lm( res ~ A + C, dat2) )
#---------
A C
1.003493 1.003493 编辑:我意识到,我并没有真正创建一个“范畴变量”的R-表示,尽管从1:4取样。该“示例”的因子版本也会出现相同的结果:
> 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 https://stackoverflow.com/questions/33397689
复制相似问题