我有以下数据:
set.seed(1)
df=data.frame(y=rnorm(500,0,20),x1=rnorm(500,50,100),x2=rnorm(500,10,40))
df$x3=df$x1+runif(500,-50,50); df$x4=df$x2+runif(500,-5,5)
此数据包含多线性数据。如果我这样做:
library(ppcor)
t <- pcor(df, method = "pearson")
t$estimate
我看到X1 / X3和X2 / X4存在多重共线性问题。现在我必须手动屏蔽输出。有没有办法自动检测这些项目?关于什么应该是门槛的任何想法?
答案 0 :(得分:0)
重新发现多重共线性 - 有许多测试可以帮助您检测多重共线性。例如,您可以使用vif
包中的car
函数计算“方差通胀因子”。
fit <- lm(y ~ x1 + x2 + x3 + x4, data = df)
vifVues <- car::vif(fit)
此外,Wikipedia有关于检测多重共线性的完整页面,而this看起来像是一篇很好的博文。
然而,与您所做的类似,我通常从相关性开始,以便检测“有问题”的高相关性。为此,您可以尝试“压平”相关表,而不是过滤掉高相关性。
注意:因为我不熟悉ppcor
我使用Hmisc
。但是,这个想法是一样的。
require(tidyverse)
require(Hmisc)
#Flatten correlation matrix function
flattenCorrMatrix <- function (DF)
{
DF <- DF %>% as.matrix() %>% rcorr()
ut <- upper.tri(DF$r)
flat <- data.frame(row = rownames(DF$r)[row(DF$r)[ut]], column = rownames(DF$r)[col(DF$r)[ut]],
cor = (DF$r)[ut], p = DF$P[ut], n = DF$n[ut])
return(flat)
}
#using the function and filtering out the y variable and correlations higher than abs(0.7)
flattenCorrMatrix(df) %>%
filter(!grepl("y", row)) %>%
filter(cor > abs(0.7))
输出:
row column cor p n
1 x1 x3 0.9626412 0 500
2 x2 x4 0.9972960 0 500