2017-03-24 6 views
-1

Ich verwende R, um ein Dendrogramm eines hierarchischen Clusters zu zeichnen.R-Dendrogramm nach Cluster

Ich habe ein hierarchisches Clustering von ~ 3000 Elementen realisiert. Die Handlung des entsprechenden Baumes ist offensichtlich sehr unordentlich. Diese 3000 Elemente sind in 20 Gruppen unter Verwendung der cutree-Funktion gruppiert. Was ich will, ist den Baum nach Cluster zu plotten (d. H. Abgeschnitten an den Knoten, wo jeder Cluster seinen Ursprung hat, entsprechend gekennzeichnet durch cluster => ein Baum mit 20 terminalen Blättern).

Dank

O.

+0

Willkommen bei Stack-Überlauf! Bitte lesen Sie die Informationen über [wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und wie man ein [reproduzierbares Beispiel gibt] (http://stackoverflow.com/questions/ 5963269). Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – zx8754

Antwort

1

Sie können versuchen, ylim auf die entsprechende Höhe zu reduzieren:

mit Zufallsdaten: für jeden Schritt des CAH

set.seed(123) 
testdata <- matrix(rnorm(300), ncol=3) 
testcah <- hclust(dist(testdata)) 

Die Höhe sind in testdata$heights von der ersten bis zur letzten Zusammenführung. Wenn Sie zum Beispiel 5 Gruppen wollen, müssen Sie die vierte vorletztes Höhe wissen:

floor_y <- rev(testcah$height)[5-1] 

Dann Ihr Objekt als Dendrogramm zu machen, können Sie es zeichnen nur auf dem Teil, den Sie brauchen:

testdend <- as.dendrogram(testcah) 
plot(testdend, ylim=c(floor_y, attributes(testdend)$height)) 

Wenn Sie die Zweige mit den Clustern Etiketten beschriften, wie cutree definiert, müssen Sie die Etiketten bekommen (von cutree Ergebnis Nachbestellung) und finden, wo sie entlang der x axis zu setzen. Diese Information kann durch "Zerlegen" des Dendrogramms erhalten werden, um die benötigte midpoints zu finieren.

Zunächst erhalten die Etiketten von (alle) die Blätter:

testlab <- cutree(testcah, 5)[testcah$order] 

Dann benutzen wir eine rekursive Funktion die Mittelpunkte der subdendrograms zu finden, die in der gewünschten Höhe liegt:

find_x <- function(dendro, ordrecah, cutheight){ 
      if(!is.null(attributes(dendro)$leaf)) { # if the dendrogram is a leaf, just get its position in the global dendrogram 
       return(which(ordrecah==attributes(dendro)$label)) 
      } else { 
       if(attributes(dendro)$height<cutheight){ # if we're under the height threshold, get the midpoint 
        return(attributes(dendro)$midpoint) 
       } else { # if we're above the height threshold, pass the function on the 2 subparts of the dendrogram 
        return(c(find_x(dendro[[1]], ordrecah, cutheight), find_x(dendro[[2]], ordrecah, cutheight))) 
       } 
      } 
      } 

So können wir die Mittelpunkte oder Blattposition mit erhalten:

test_x <- find_x(testdend, testcah$order, floor_y) 

aber die Mittelpunkte entsprechen dem di Position zwischen dem linken Blatt und dem Knoten, so müssen wir im Falle eines Clusters mit mehr als einem Mitglied den Abstand von 1 zur linken Seite hinzufügen.

length_clus <- rle(testlab)$lengths # get the number of members by cluster 
test_x[length_clus > 1] <- (test_x + head(c(1, cumsum(length_clus)+1), -1))[length_clus > 1] 

Schließlich legte die Etiketten auf dem Grundstück:

mtext(side=1, at=test_x, line=0, text=unique(testlab)) 

enter image description here

+0

Danke Cath. Aber wie würden Sie dann feststellen, welcher Cluster im Vergleich zur cutree-Funktion steht? Wie würdest du auf der Handlung beschriften? – Oselm

+0

@Oselm Bitte beachten Sie die Bearbeitung, um die Cluster-Labels zu platzieren – Cath

Verwandte Themen