自动检测具有多重共线性问题的项目

时间:2018-04-28 15:41:13

标签: r statistics

我有以下数据:

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存在多重共线性问题。现在我必须手动屏蔽输出。有没有办法自动检测这些项目?关于什么应该是门槛的任何想法?

1 个答案:

答案 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