给定一个相关矩阵,如何让 R 根据变量对于任意阈值是否相关(连通)返回一个分区?
例如,凝视:
corr(x)
并找到由以下定义的分区:
corr(x) > 0.5
返回分组为字符列表的行/列名称。
list(c("a", "b"), "d")
表示“a”、“b”在一组,但“d”不在一组。
这个问题目前还不是很详细,所以我不确定这是否能解决您的问题,但是我的建议是生成高于特定阈值的所有相关矩阵对的列表:
# example dataset
a <- mvtnorm::rmvnorm(10,rep(0,10)) |>
as.data.frame() |>
setNames(LETTERS[1:10])
# correlation matrix
ca <- cor(a)
# optional: remove upper.tri and diag to avoid duplicates
ca[upper.tri(ca,T)] <- NA
# matrix of name pairs corresponding to each cell of ca
cm <- do.call(expand.grid, dimnames(ca)) |>
apply(1,c,simplify = F) |>
lapply(unname) |>
matrix(ncol(ca))
# use the correlation matrix to filter the matrix of name pairs
# may remove abs() to obtain only positive correlations
# adjust threshold, currently 0.6
as.list(cm[!is.na(ca)&abs(ca)>.6])
您可以添加一个逆相关矩阵,该矩阵是通过在
-1
中添加 lapply
获得的,然后将 list
与 Reduce
互补元素。
考虑
mtcars
的这个小子集
> m
mpg cyl disp
mpg TRUE FALSE FALSE
cyl FALSE TRUE TRUE
disp FALSE TRUE TRUE
> lapply(c(0, -1), \(x) apply(`mode<-`(m + x, 'logical'), 1, \(x) names(which(x)))) |>
+ Reduce(function(x, y) Map(list, x, y), x=_)
$mpg
$mpg[[1]]
[1] "mpg"
$mpg[[2]]
[1] "cyl" "disp"
$cyl
$cyl[[1]]
[1] "cyl" "disp"
$cyl[[2]]
[1] "mpg"
$disp
$disp[[1]]
[1] "cyl" "disp"
$disp[[2]]
[1] "mpg"
数据:
> m <- cor(mtcars[, 1:3]) > .5