【问题标题】:extract rownames and column names from correlation matrix using aspecefic value使用特定值从相关矩阵中提取行名和列名
【发布时间】:2021-12-10 19:15:43
【问题描述】:

我的目标是从数据集中消除重复。

为此,我编写了一个计算相关性的程序。

我想取相关性高于我确定的特定值的变量的名称。

这是我得到的结果之一。

            M926T709  M927T709_1  M927T709_2  M929T709
M926T709   1.0000000  0.9947082  0.9879702   0.8716944
M927T709_1 0.9947082  1.0000000  0.9955145   0.8785669
M927T709_2 0.9879702  0.9955145  1.0000000   0.8621052
M929T709   0.8716944  0.8785669  0.8621052   1.0000000

假设我想获取百分比高于 95% 的变量的名称

所以我应该得到这个结果

M926T709 , M927T709_1 , M927T709_2

编辑:Ronak Shah 给出的答案效果很好,但我需要将结果作为向量获取,这样我才能使用后面的名称

请注意,我不应该分析正交结果,因为它们总是等于 1。

如果您需要任何澄清,请告诉我,如果您想查看我的整个程序,请告诉我。

【问题讨论】:

  • 您可以使用rownames(df[rowSums(((df>=0.95) & (df<1)))!=0,])获得此结果,但这并不简单,具体取决于您打算如何使用此结果
  • @Basti:负相关呢?对角线之外的 1 的相关性如何(尽管通常不太可能,但仍有可能)。你的解决方案是否涵盖了这一点?
  • 感谢您的评论。实际上,它应该部分涵盖其他示例,我的评论(而不是回答)适合上述示例。如果您对此不满意,请随时发布更完整的答案,因为实际上我没有足够的技能和有关数据集的信息来提出完美的答案

标签: r statistics correlation


【解决方案1】:

示例数据:limit 和相关矩阵 m(为了演示目的添加了负相关):

  limit <- 0.95
  m <- as.matrix( read.table(text = "
            M926T709  M927T709_1  M927T709_2  M929T709
M926T709   1.0000000  -0.9947082  0.9879702   0.8716944
M927T709_1 -0.9947082  1.0000000  0.9955145   0.8785669
M927T709_2 0.9879702  0.9955145  1.0000000   0.8621052
M929T709   0.8716944  0.8785669  0.8621052   1.0000000"))

创建所需矩阵的子集并提取行/列名称。

Target <- unique( # Remove any duplicates
  unlist( # merge subvectors of the `dimnames` list into one 
    dimnames( # gives all names of rows and columns of the matrix below
      # Create a subset of the matrix that ignores correlations < limit
      m[rowSums(abs(m) * upper.tri(m) > limit) > 0, # Rows
        colSums(abs(m) * upper.tri(m) > limit) > 0] # Columns
    ), 
    recursive = FALSE))

Target
#> [1] "M926T709"   "M927T709_1" "M927T709_2"

reprex package 创建于 2021-10-25 (v2.0.1)

【讨论】:

  • 感谢您的评论,我尝试了您的解决方案,但 id 不适用于所有数据,我编写了一个生成大量相关矩阵的程序,
【解决方案2】:

使用rowSumscolSums 可以分别计算每行和每列中有多少个值大于0.95,然后返回名称。

tmp <- mat > 0.95
diag(tmp) <- FALSE
names(Filter(function(x) x > 0, rowSums(tmp) > 0 | colSums(tmp) > 0))
#[1] "M926T709"   "M927T709_1" "M927T709_2"

【讨论】:

  • 效果很好,谢谢你的回答
  • 是的,当然,你能告诉我吗,我怎样才能将名称作为向量返回,以便我可以使用后面的名称?因为我需要取变量名并使用这些名称做其他工作(我想计算这个变量的总和),谢谢
  • 输出已经是一个向量,将它分配给一些你以后可以使用的变量。 result &lt;- names(Filter(function(x) x &gt; 0, rowSums(tmp) &gt; 0 | colSums(tmp) &gt; 0))
  • 非常感谢
猜你喜欢
  • 2019-09-11
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2012-12-27
相关资源
最近更新 更多