gpt4 book ai didi

r - 分类变量的多重共线性

转载 作者:行者123 更新时间:2023-12-03 09:32:09 26 4
gpt4 key购买 nike

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

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

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

如何做同样的事情?

最佳答案

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

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 - 分类变量的多重共线性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33397689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com