3

対称行列 (変数間の相関関係など) がある場合、相互のしきい値相関の上または下にある変数のすべての組み合わせを返す方法を探しています。expand.grid現時点では、またはcombn(可能であれば) を使用してこれを行う方法がよくわかりません。変数のペアだけが必要では ないことに注意してください。

数字のグループのすべての可能な組み合わせを返したいと想像してください(順序付けされていないため、各セット内の数字の位置は気にしません)。2 つの数値がある場合は、{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 に答える