web-dev-qa-db-ja.com

Rのすべての列間の相関を計算し、相関の高い変数を検出する方法

100個の変数と3000個の観測値を持つ大きなデータセットがあります。相関性が高い、または冗長な変数(列)を検出して、データフレームの次元を削除します。私はこれを試しましたが、1つの列と他の列の間の相関のみを計算します。いつもエラーメッセージが出ます

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

誰か助けてもらえますか?

13
Charlotte

新しい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   x1   x2 -0.05936703
3   x1   x3 -0.37479619
4   x2   x1 -0.05936703
5   x2   x2  1.00000000
6   x2   x3  0.43716004
7   x3   x1 -0.37479619
8   x3   x2  0.43716004
9   x3   x3  1.00000000

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

# remove duplicates
d2 %>%
  mutate(var_order = paste(var1, var2) %>%
           strsplit(split = ' ') %>%
           map_chr( ~ sort(.x) %>% 
                      paste(collapse = ' '))) %>%
  mutate(cnt = 1) %>%
  group_by(var_order) %>%
  mutate(cumsum = cumsum(cnt)) %>%
  filter(cumsum != 2) %>%
  ungroup %>%
  select(-var_order, -cnt, -cumsum)

  var1  var2   value
1 x1    x1     1     
2 x1    x2    -0.0594
3 x1    x3    -0.375 
4 x2    x2     1     
5 x2    x3     0.437 
6 x3    x3     1     
30
maloneypatr

有効に見える別のアプローチは次のとおりです。

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
8
alexis_laz

私はまったく同じ問題を抱えていましたが、これが私がそれを解決した方法です:

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"

これは、相関値andのそれぞれのp-valuesを出力するという他の方法よりも優れています。

6
Stunts