【问题标题】:How to compute correlations between all columns in R and detect highly correlated variables如何计算 R 中所有列之间的相关性并检测高度相关的变量
【发布时间】:2014-04-12 12:21:56
【问题描述】:

我有一个包含 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

谁能帮帮我?

【问题讨论】:

    标签: r correlation


    【解决方案1】:

    更新了新的 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     
    

    【讨论】:

    • 什么是价值?未找到值
    • value 是融合数据框时创建的默认列。您的环境中是否定义了dd_cord_cor_melt? (如果你输入每一个,它会返回一个数据框而不是错误吗?)
    • 您是否安装了dplyr?我将其添加到代码中
    • 酷,如果它满足您的需求,请接受我的回答 :) 如果没有,也不要担心 :)
    • 我可以知道如何排除相同的比较,如 x1 x2 和 x2 x1
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

      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 值。

      【讨论】:

      • 在您的第 4 行代码(即ccs &lt;- as.matrix(cs))中,“cs”是什么?
      • 抱歉!那个“cs”应该是“rawdata”。我想你刚刚发现了一个 2 年前的复制和粘贴错误!我已经更正了答案。
      【解决方案4】:

      您可以使用corrr 包。例如:

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

      【讨论】:

        【解决方案5】:

        Tidyverse,重温

        这是 tidyverse 的另一个例子 - 类似于 @maloneypatr's,但步骤更少。

        library(tidyverse)
        
        ## reproducible example data
        set.seed(20211202)
        df_data <- map_dfc(1:5, rnorm, n=10)
        
        df_data %>%
          ## convert to correlation matrix
          as.matrix %>% cor %>%
        
          ## set redundant to `NA`
          `[<-`(lower.tri(., TRUE), NA) %>%
        
          ## back to tibble
          as_tibble(rownames="var1") %>%
        
          ## long format, dropping redundant  
          pivot_longer(cols=-1, names_to="var2", values_to="rho", values_drop_na=TRUE) %>%
        
          ## descending sort most correlated pairs
          arrange(-abs(rho))
        
        ### A tibble: 10 x 3
        ##   var1  var2       rho
        ##   <chr> <chr>    <dbl>
        ## 1 ...1  ...5   0.549  
        ## 2 ...3  ...5   0.538  
        ## 3 ...2  ...5   0.304  
        ## 4 ...2  ...3   0.301  
        ## 5 ...3  ...4  -0.288  
        ## 6 ...4  ...5   0.249  
        ## 7 ...1  ...2  -0.0941 
        ## 8 ...1  ...3   0.0634 
        ## 9 ...2  ...4  -0.0627 
        ##10 ...1  ...4  -0.00761
        

        在了解第 1-3 列后,第 5 列可能不会造成太大差异。但迭代特征选择可能是更合适的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-31
          • 2023-03-27
          • 2019-02-14
          • 1970-01-01
          • 1970-01-01
          • 2017-05-02
          • 2020-05-01
          • 2016-02-07
          相关资源
          最近更新 更多