2017-03-24 2 views
-1

J'utilise R pour tracer un dendrogramme d'une classification hiérarchique. J'ai réalisé un regroupement hiérarchique de ~ 3000 éléments. L'intrigue de l'arbre correspondant est évidemment super malpropre. Ces 3000 éléments sont regroupés en 20 groupes utilisant la fonction cutree. Ce que je veux, c'est tracer l'arbre par grappe (c'est-à-dire tronqué aux nœuds où chaque grappe est étiquetée de manière appropriée par grappe => un arbre avec 20 feuilles terminales).R dendrogramme par grappe

Merci

O.

+0

Bienvenue sur Stack Overflow! S'il vous plaît lire les informations sur [comment poser une bonne question] (http://stackoverflow.com/help/how-to-ask) et comment donner un [exemple reproductible] (http://stackoverflow.com/questions/ 5963269). Cela rendra beaucoup plus facile pour les autres de vous aider. – zx8754

Répondre

1

Vous pouvez essayer de réduire ylim à la hauteur correspondante:

avec des données aléatoires:

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

La hauteur pour chaque étape du CAH sont dans testdata$heights de la première à la dernière fusion. Si, par exemple, vous voulez 5 groupes, vous devez connaître le 4e avant la dernière hauteur:

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

Ensuite, faire votre objet en tant que dendrogramme, vous pouvez tracer uniquement sur la partie dont vous avez besoin:

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

Si vous voulez étiqueter les branches avec les étiquettes de grappes, tels que définis par cutree, vous devez obtenir les étiquettes (en réorganisant cutree résultat) et trouver où les mettre le long de la x axis. Cette information peut être obtenue en "décomposant" le dendrogramme pour obtenir le midpoints nécessaire.

D'abord, obtenir les étiquettes de (tous) les feuilles:

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

Ensuite, nous utilisons une fonction récursive pour trouver les points médians des subdendrograms qui se trouve à la hauteur désirée:

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))) 
       } 
      } 
      } 

Donc, nous pouvons obtenir les points milieu ou la position de la feuille avec:

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

mais les points médians correspondent à la di position entre la feuille la plus à gauche et le noeud, donc, dans le cas d'un cluster avec plus d'un membre, nous devons ajouter la distance de 1 à la feuille la plus à gauche.

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] 

Enfin, mettre les étiquettes sur le terrain:

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

enter image description here

+0

Merci Cath. Mais alors, comment diriez-vous quel cluster est comparé à la fonction cutree? Comment étiquetteriez-vous sur l'intrigue? – Oselm

+0

@Oselm s'il vous plaît voir la modification pour placer les étiquettes des clusters – Cath