如何找到 R 中相关矩阵的所有相互相关的行?

问题描述 投票:0回答:2

我创建了一个样本矩阵,并使用以下代码计算了行的成对相关性:

mtx <- do.call(rbind,lapply(1:8,function(x) {
  set.seed(x)
  runif(15)
}))
dimnames(mtx) <- list(paste0("r",as.character(1:nrow(mtx))),paste0("s",as.character(1:ncol(mtx))))
cor_mtx <- cor(t(mtx),use="pairwise.complete.obs")

我的目标是返回所有相互关联超过某个阈值的行。假设我的阈值是 0.2。通过上面生成的矩阵,您可以看到 r1 与高于此阈值的 r5 和 r8 相关。 r5 和 r8 在阈值以上也相互相关。因此,所有 3 个应该一起返回。如何以编程方式返回相互关联的行模块?预先感谢您。

r matrix correlation
2个回答
0
投票

我不确定这是否正是您正在寻找的,但使用 igraph 进行相关性的聚类/分组给了我一个合理的结果。
(我已将截止值调整为 0.4,以便更清楚地了解结果):

sel <- abs(cor_mtx) > 0.4
diag(sel) <- FALSE
##      r1    r2    r3    r4    r5    r6    r7    r8
##r1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##r2 FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
##r3 FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
##r4 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##r5 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
##r6 FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
##r7 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##r8 FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE

out <- expand.grid(dimnames(cor_mtx))[sel,]

library(igraph)
g <- graph_from_data_frame(out)
cmp <- components(g)$membership
split(names(cmp), cmp)
##$`1`
##[1] "r3" "r2"
##
##$`2`
##[1] "r8" "r5" "r6"

0
投票

使用

igraph::max_cliques
我们可以看到有 4 个大小为 2 的派系和 1 个大小为 3 的派系(r1、r5 和 r8):

library(igraph)

diag(cor_mtx) <- 0
max_cliques(graph_from_adjacency_matrix((cor_mtx > 0.2), "undirected"), 2)
#> [[1]]
#> + 2/8 vertices, named, from 904d6ab:
#> [1] r7 r2
#> 
#> [[2]]
#> + 2/8 vertices, named, from 904d6ab:
#> [1] r3 r2
#> 
#> [[3]]
#> + 2/8 vertices, named, from 904d6ab:
#> [1] r4 r8
#> 
#> [[4]]
#> + 2/8 vertices, named, from 904d6ab:
#> [1] r2 r8
#> 
#> [[5]]
#> + 3/8 vertices, named, from 904d6ab:
#> [1] r8 r1 r5
© www.soinside.com 2019 - 2024. All rights reserved.