【问题标题】:Show correlations as an ordered list, not as a large matrix将相关性显示为有序列表,而不是大矩阵
【发布时间】:2011-08-16 06:11:50
【问题描述】:

我有一个包含 100 多列的数据框。 cor() 返回的速度非常快,但告诉我的太多了,尤其是在大多数列不相关的情况下。我希望它只告诉我列对及其相关性,理想情况下是有序的。

如果没有意义,这里是一个人为的例子:

df = data.frame(a=1:10,b=20:11*20:11,c=runif(10),d=runif(10),e=runif(10)*1:10)
z = cor(df)

z 看起来像这样:

           a          b           c           d          e
a  1.0000000 -0.9966867 -0.38925240 -0.35142452  0.2594220
b -0.9966867  1.0000000  0.40266637  0.35896626 -0.2859906
c -0.3892524  0.4026664  1.00000000  0.03958307  0.1781210
d -0.3514245  0.3589663  0.03958307  1.00000000 -0.3901608
e  0.2594220 -0.2859906  0.17812098 -0.39016080  1.0000000

我正在寻找的是一个会告诉我的函数:

a:b -0.9966867 
b:c  0.4026664
d:e -0.39016080  
a:c -0.3892524 
b:d  0.3589663
a:d -0.3514245 
b:e -0.2859906
a:e  0.2594220 
c:e  0.17812098
c:d  0.03958307

我有一个粗略的方法来消除一些噪音:

z[abs(z)<0.5]=0

然后扫描寻找非零值。但远不如上面想要的输出。

更新: 根据收到的答案以及一些试验和错误,这是我采用的解决方案:

z[lower.tri(z,diag=TRUE)]=NA  #Prepare to drop duplicates and meaningless information
z=as.data.frame(as.table(z))  #Turn into a 3-column table
z=na.omit(z)  #Get rid of the junk we flagged above
z=z[order(-abs(z$Freq)),]    #Sort by highest correlation (whether +ve or -ve)

【问题讨论】:

  • @Aaron 是的,这完全是同一个问题。我很抱歉! (我确实浏览了相关问题列表,但完全错过了那个。)但是(至少对我而言)注意答案的异同是有教育意义的。

标签: r


【解决方案1】:

我一直用

zdf <- as.data.frame(as.table(z))
zdf
#    Var1 Var2     Freq
# 1     a    a  1.00000
# 2     b    a -0.99669
# 3     c    a -0.14063
# 4     d    a -0.28061
# 5     e    a  0.80519

然后使用subset(zdf, abs(Freq) &gt; 0.5) 选择重要的值。

【讨论】:

  • 谢谢。它仍然包含对角线,每个相关性包含两次,并且没有排序,但我用它作为我所采用的解决方案的起点。
【解决方案2】:
library(reshape)

z[z == 1] <- NA #drop perfect
z[abs(z) < 0.5] <- NA # drop less than abs(0.5)
z <- na.omit(melt(z)) # melt! 
z[order(-abs(z$value)),] # sort

【讨论】:

  • 太棒了!融化很少跳出来对我使用。
  • 谢谢。 z[z==1] &lt;- NA 是危险的,因为它还消除了真正的完美相关性(最好使用z[lower.tri(z,diag=TRUE)]=NA)。顺便说一句,在这种情况下,melt(z) 与 as.data.frame(as.table(z)) 完全一样(?),所以它可以在没有其他包的情况下完成。
【解决方案3】:

以@Marek 的回答为基础。 消除对角线和重复项

data = as.data.frame( as.table( z ) )
combinations = combn( colnames( z ) , 2 , FUN = function( x ) { paste( x , collapse = "_" ) } )
data = data[ data$Var1 != data$Var2 , ]
data = data[ paste( data$Var1 , data$Var2 , sep = "_" ) %in% combinations , ]

【讨论】:

    【解决方案4】:

    有几种方法可以可视化相关矩阵,以便快速了解数据集。这是link 的一个看起来不错的方法。

    【讨论】:

    • 感谢您的想法。当然,如果有 100 多列,这有点不切实际(除非我的列以某种有意义的方式聚集在一起)。
    【解决方案5】:

    从 Marek 的回答开始,我添加了几行使用Tidyverse pipes 进行常见清理:

      df_cor %>%                               # start from the correlation matrix
      as.table() %>% as.data.frame() %>%       # Marek's answer in TidyVerse format
      subset(Var1 != Var2 & abs(Freq)>0.5) %>% # omit diagonal and keep significant correlations (optional...)
      filter(!duplicated(paste0(pmax(as.character(Var1), as.character(Var2)), pmin(as.character(Var1), as.character(Var2))))) %>%
                                               # keep only unique occurrences, as.character because Var1 and Var2 are factors
      arrange(desc(Freq))                      # sort by Freq
    

    第 4 行的更多信息:How do I select all unique combinations of two columns in an R data frame?

    【讨论】:

      猜你喜欢
      • 2019-07-15
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2017-05-07
      • 2021-08-23
      • 2018-11-05
      相关资源
      最近更新 更多