如何计算R中所有列之间的相关性并检测高度相关的变量

时间:2014-03-09 13:05:42

标签: r correlation

我有一个包含100个变量和3000个观测值的大数据集。 我想检测那些高度相关或冗余的变量(列),从而删除数据帧中的维数。 我试过这个,但它只计算一列与其他列之间的相关性;我总是收到一条错误消息

for(i in 1:ncol(predicteurs)){
correlations <- cor(predicteurs[,i],predicteurs[,2])
names(correlations[which.max(abs(correlations))])
}

  Warning messages:
 1: In cor(predicteurs[, i], predicteurs[, 2]) :
the standard deviation is zero
  2: In cor(predicteurs[, i], predicteurs[, 2]) :
 the standard deviation is zero

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:29)

针对较新的tidyverse软件包进行了更新..

我会尝试收集相关矩阵。

# install.packages(c('tibble', 'dplyr', 'tidyr'))
library(tibble)
library(dplyr)
library(tidyr)

d <- data.frame(x1=rnorm(10),
                x2=rnorm(10),
                x3=rnorm(10))

d2 <- d %>% 
  as.matrix %>%
  cor %>%
  as.data.frame %>%
  rownames_to_column(var = 'var1') %>%
  gather(var2, value, -var1)

  var1 var2      value
1   x1   x1 1.00000000
2   x2   x1 0.28397793
3   x3   x1 0.32169405
4   x1   x2 0.28397793
5   x2   x2 1.00000000
6   x3   x2 0.07672398
7   x1   x3 0.32169405
8   x2   x3 0.07672398
9   x3   x3 1.00000000

# .5 is an arbitrary number
filter(d2, value > .5)

答案 1 :(得分:8)

另一种看起来有效的方法可能是:

set.seed(101)
mat = matrix(runif(12), 3)
cor_mat = cor(mat)
cor_mat
#           [,1]       [,2]       [,3]       [,4]
#[1,]  1.0000000  0.1050075  0.9159599 -0.5108936
#[2,]  0.1050075  1.0000000  0.4952340 -0.9085390
#[3,]  0.9159599  0.4952340  1.0000000 -0.8129071
#[4,] -0.5108936 -0.9085390 -0.8129071  1.0000000
which(cor_mat > 0.15 & lower.tri(cor_mat), arr.ind = T, useNames = F)
#     [,1] [,2]
#[1,]    3    1
#[2,]    3    2

答案 2 :(得分:5)

我遇到了同样的问题,这就是我解决问题的方法:

install.packages("Hmisc") # Only run on first use
library(Hmisc)
rawdata <- read.csv("/path/to/your/datafile", sep="\t", stringsAsFactors=FALSE) # In my case the separator in the file was "\t", adjust accordingly.
ccs <- as.matrix(rawdata)
rcorr(ccs, type="pearson") # You can also use "spearman"

这比其他方法更有优势,它会输出相关值各自的 p - 值。

答案 3 :(得分:0)

您可以使用corrr软件包。例如:

corrr::correlate(your_data, method = "pearson")