2013-04-25 8 views
5

Ich habe eine Korrelationsmatrix R in und ich möchte, wie viele Gruppen (und setzen diese Gruppen in Vektoren) kennen von Elementen zwischen ihnen in mehr als 95% zu korrelieren.exctract korrelierten Elementen einer Korrelationsmatrix

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 dann enthält:

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

Das heißt, wie zu erwarten, dass die Vektoren 1,2 und 3 Korrelat zwischen ihnen, und auch 4 und 5

Was ich brauchen würde ist es, zwei Vektoren c(1,2,3) und c(4,5) als Endergebnis zu erhalten.

Dies ist ein einfaches Beispiel, bin ich die Verarbeitung obwohl große Matrizen.

+0

ist es möglich, dass '1-2',' 1-3' korreliert sind, aber '2-3' nicht? – Nishanth

+0

Es ist nicht. Wenn 1-2 und 1-3 korrelieren, dann müssen 2-3 in derselben Gruppe enthalten sein. Es ist eine besondere Bedingung für das, was ich brauche. – Xavi

+0

Ein naiver Ansatz wäre es, alle zu testen paarweise Reihenkombinationen von 'cor.vector' über' Summe (is.element (i, j))> 0 'und, wenn sie ein gemeinsames Element teilen, dann verbinden Sie sie und geht auf. Wie könnte es wahrscheinlich effiziente Art und Weise sein, die Lösung zu bekommen, wage ich nicht dies als eine Antwort zu schreiben ... –

Antwort

4

Hier ist ein Ansatz mit igraph Paket:

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 

Was dies im Wesentlichen tut, ist den Cluster in der graphischen Darstellung g (getrennt Sets) zu finden, wie in der nachfolgenden Abbildung dargestellt. Da die Scheitelpunkte verwendet werden, um das Diagramm in der von Ihnen eingegebenen Reihenfolge zu erstellen (aus Ihrer cor.vector), kommt die Clustering-Reihenfolge auch in der gleichen Reihenfolge zurück. Das heißt: Für die Knoten c (2,3,5,1,4) sind die Cluster c (1,1,2,1,2) mit insgesamt zwei Clustern (Cluster 1 und Cluster 2). Wir verwenden das also nur, um die Clustergruppe zu teilen.

enter image description here

+0

Ich habe Ihren Code mit meinen Daten ausgeführt und es funktioniert einwandfrei. Ich habe auch die Ergebnisse Ihres Codes mit dem Code verglichen, den ich entwickelt habe. Das funktioniert gut, aber es ist viel weniger effizient und ich muss viele Daten verarbeiten. Die Ergebnisse sind gleich. – Xavi

Verwandte Themen