2013-03-06 68 views
2

如果我有一个对称矩阵(例如变量之间的相关性),我正在寻找一种方法来返回所有组合那些高于或低于某个阈值的变量相互关联。我目前无法完全掌握如何使用expand.gridcombn(如果可以)做到这一点。请注意,我不要只需要变量对。假设我想返回一组数字的每个可能的组合,(无序,所以不关心每组中的数字的位置)。如果有两个数字,我只需{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 

任何人都可以帮助建议一种方式吗?

+2

我不明白的“1,2,3”到底是谁? – juba 2013-03-06 17:09:05

+0

因为我不想只是变量对。想象一下,我想返回一组数字的每个可能的组合(无序,所以不关心每组中的数字位置)。如果有两个数字,我只需{1},{2},{1,2}。如果有3个数字,它将是{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。我想用变量在这里做同样的事情,但是我想限制返回的组合,以便该集合的任何成员与集合中的任何其他成员的相关性都不大于0.6。这现在更有意义了吗?我可以更新问题文本。 – 2013-03-06 17:20:40

+1

@Juba,我认为他在识别矩阵中给出的四个独立元素的互相关。他不仅需要两两“相关<0.6)”,而且还要“集中”。西蒙 - 如果我在这里错了,请给我一些钟声。 – 2013-03-06 17:23:27

回答

3

不是最漂亮的解决方案,但这个工程:

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 
+0

美丽!这有什么不好?!你能解释一下这个命令是如何实现的吗? 'combn(y,2,function(z)m [z [1],z [2]] <0.7)'。我想我知道了 - 是否检查列中每个元素与y之间的成对相关性,这是来自给定长度矩阵'm'的可能变量组合的矩阵?谢谢谢谢! – 2013-03-06 18:59:41

相关问题