3

如果我有一个对称矩阵(例如变量之间的相关性),我正在寻找一种方法来返回高于或低于某个阈值相关性的那些变量的所有组合。目前我还不能完全掌握如何使用expand.gridor combn(如果可以的话)来做到这一点。请注意,我想要成对的变量。

想象一下,我想返回一组数字的所有可能组合(无序,所以不关心每组数字的位置)。如果有两个数字,我只有 {1}、{2}、{1,2}。如果有 3 个数字,它将是 {1} , {2} , {3} , {1,2} , {1,3} , {2,3} , {1,2,3}。

我想在这里对变量做同样的事情,但我想限制返回的组合,以便集合中的任何成员都没有高于某个阈值的相关性(在下面的示例中,阈值是> 0.7)与任何其他成员放。

set.seed(8) # to reproduce the numbers I have
n <- 5
m <- diag(n)
m[lower.tri(m, diag=F)] <- round( runif( sum( 1:(n-1) ) ) , 2 )
m[upper.tri(m, diag=F)] <- m[lower.tri(m, diag=F)]
m

#In this case I want to return the combinations:
1,2
1,3
1,4
1,5
2,4
4,5
1,2,4 # meaning that none of the pairs {1,2} {1,4} {2,4} share a correlation greater than 0.6
1,4,5 # ditto for {1,4} {1,5} {4,5}

     [,1] [,2] [,3] [,4] [,5]
[1,] 1.00 0.47 0.21 0.65 0.29
[2,] 0.47 1.00 0.80 0.32 0.93
[3,] 0.21 0.32 1.00 0.72 0.77
[4,] 0.80 0.72 0.93 1.00 0.64
[5,] 0.65 0.29 0.77 0.64 1.00

任何人都可以帮助提出一种方法吗?

4

1 回答 1

4

不是最漂亮的解决方案,但这有效:

o <- unlist(lapply(2:nrow(m), function(x) {
    i1 <- combn(seq_len(nrow(m)), x)
    apply(i1, 2, function(y) {
        if (all(combn(y, 2, function(z) m[z[1], z[2]] < 0.7) == TRUE))
            y
        else 
            NA
    })
}), recursive=F)
o[!is.na(o)]

# [[1]]
# [1] 1 2
# 
# [[2]]
# [1] 1 3
# 
# [[3]]
# [1] 1 4
# 
# [[4]]
# [1] 1 5
# 
# [[5]]
# [1] 2 4
# 
# [[6]]
# [1] 4 5
# 
# [[7]]
# [1] 1 2 4
# 
# [[8]]
# [1] 1 4 5
于 2013-03-06T18:49:54.710 回答