2013-04-25 17 views
5

Ho una matrice di correlazione in R e voglio sapere quanti gruppi (e mettere questi gruppi in vettori) di elementi correlati tra loro in più del 95%.exctract elementi correlati di una matrice di correlazione

X <- matrix(0,3,5) 
X[,1] <- c(1,2,3) 
X[,2] <- c(1,2.2,3)*2 
X[,3] <- c(1,2,3.3)*3 
X[,4] <- c(6,5,1) 
X[,5] <- c(6.1,5,1.2)*4 

cor.matrix <- cor(X) 
cor.matrix <- cor.matrix*lower.tri(cor.matrix) 
cor.vector <- which(cor.matrix>0.95, arr.ind=TRUE) 

cor.vector contiene poi:

 row col 
[1,] 2 1 
[2,] 3 1 
[3,] 3 2 
[4,] 5 4 

Ciò significa che, come previsto, che i vettori 1,2 e 3 correlare tra di loro, e anche 4 e 5.

Quello che mi avrebbe bisogno è quello di ottenere due vettori c(1,2,3) e c(4,5) come risultato finale.

Questo è un semplice esempio, sto elaborando grandi matrici però.

+0

è possibile che '1-2',' 1-3' sono correlati, ma '2-3' non lo è? – Nishanth

+0

Non lo è. Se 1-2 e 1-3 sono correlati, allora 2-3 devono essere inclusi nello stesso gruppo. È una condizione particolare per ciò di cui ho bisogno. – Xavi

+0

Un approccio ingenuo sarebbe quello di testare tutte le combinazioni pairwise-row di 'cor.vector' tramite' sum (is.element (i, j))> 0' e se condividono un elemento comune, quindi ti unisci a loro e vai sopra. Poiché potrebbero esserci modi più efficaci per ottenere la soluzione, non oso scrivere questo come risposta ... –

risposta

4

Ecco un approccio utilizza igraph pacchetto:

require(igraph) 
g <- graph.data.frame(cor.vector, directed = FALSE) 
split(unique(as.vector(cor.vector)), clusters(g)$membership) 
# $`1` 
# [1] 2 3 1 

# $`2` 
# [1] 5 4 

Ciò fa essenzialmente è trovare i cluster nel grafico g (insiemi scollegati), come illustrato in figura. Poiché i vertici vengono utilizzati per creare il grafico nell'ordine immesso (dal tuo cor.vector), anche l'ordine di raggruppamento ritorna nello stesso ordine. Cioè: per i vertici c (2,3,5,1,4) i cluster sono c (1,1,2,1,2) con un totale di due cluster (cluster 1 e cluster 2). Quindi, usiamo questo per dividere usando il gruppo di cluster.

enter image description here

+0

Ho eseguito il codice con i miei dati e funziona perfettamente. Ho anche confrontato i risultati del tuo codice con il codice che ho sviluppato, che funziona bene ma è molto meno efficiente e ho bisogno di elaborare molti dati. I risultati sono gli stessi. – Xavi

Problemi correlati