2013-03-06 60 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

相關問題