2

J'ai créé un cluster hiérarchique pour un projet. J'ai 300 observations chacune de 20 variables. J'ai indexé toutes les variables de sorte que chaque variable soit comprise entre 0 et 1, une plus grande valeur étant meilleure.Comment modifier les libellés de noeud d'un diagramme de dendrogramme

J'ai utilisé le code suivant pour créer un graphe de grappe.

d_data <- dist(all_data[,-1]) 
d_data_ind <- dist(data_ind[,-1]) 
hc_data_ind <- hclust(d_data_ind, method = "complete") 
dend<- as.dendrogram(hc_data_ind) 
plot(dend) 

Maintenant, les étiquettes des nœuds sont dans les noms de ligne, les numéros 1 à 300 (voir l'image du haut). Au cours de l'analyse, j'ai enlevé la première colonne du bloc de données qui est étiqueté «géographie» (voir photo du bas), parce qu'ils étaient des noms de villes dans le texte et bousiller l'analyse. Mais vraiment besoin d'obtenir les noms de villes sur la parcelle de cluster dans leurs bons endroits, car je dois choisir une liste de villes en fonction des résultats.

Quel code dois-je écrire pour insérer les noms de villes dans la colonne "geography" dans ce tracé, correspondant à leurs noms de lignes?

Comme vous pouvez le voir dans le cadre de données (image du bas), tous les noms de villes sont classés par ordre alphabétique, dans l'ordre croissant, tout comme les noms des lignes. Je suis sûr qu'il n'est pas difficile de mettre les noms de la ville sur l'intrigue, je ne peux pas le trouver en faisant des recherches sur Google.

enter image description here How to alter the label of the nodes? Right now it's numbers but I need them to be cities.

enter image description here

+0

S'il vous plaît se habituer à fournir le code reproductible, prêt à copier-coller terme, pour le rendre plus facile pour les visiteurs et lecteurs. (Par exemple 'all_data' n'est pas donné, les captures d'écran des ensembles de données ne sont pas utiles, fournissant le résultat de' dput (my_data) 'est le chemin à parcourir.) – lukeA

+0

merci pour le conseil, je vais pratiquer dans le futur – Elan

+0

[Pourquoi pas améliorer votre question maintenant] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? – Jaap

Répondre

2

Vous voulez que les étiquettes d'origine au lieu d'ID? Peut-être que cela vous aide dans votre analyse:

data <- USArrests[1:5, ] 
data <- cbind(label=row.names(data), data) 
row.names(data) <- NULL 
d <- dist(data[, -1]) 
hc <- hclust(d) 
plot(hc) 
rect.hclust(hc, h=40) 

![enter image description here

data$label[order.dendrogram(as.dendrogram(hc))] 
# [1] "Arkansas" "Arizona" "California" "Alabama" "Alaska" 

clusters <- cutree(hc, h=40) 
split(data$label, clusters) 
# $`1` 
# [1] "Alabama" "Alaska" 
# 
# $`2` 
# [1] "Arizona" "California" 
# 
# $`3` 
# [1] "Arkansas" 

hc$labels <- data$label 
plot(hc) 

enter image description here

PS: Je l'ai trouvé utile d'enregistrer dendrogrammes au format pdf, où vous pouvez zoomer et dézoomer facilement: pdf("my.pdf"); plot(hc); dev.off() .

+0

essayé cette solution et retourné erreur ... a fini par utiliser un carnet de croquis pour entrer manuellement les valeurs de caractères en fonction des numéros de ligne lol, mais je vais fouiner plus quand j'ai le temps – Elan

+0

_ "essayé cette solution et retourné erreur .. "_ - Qu'avez-vous essayé exactement, quel message d'erreur est-il retourné? Vous devez modifier votre message et ajouter les données plus le code complet pour reproduire votre problème. Sinon, il n'est pas possible d'aider. – lukeA

2

Je pense que ce que vous demandez est "comment puis-je décider des étiquettes dans un dendrogramme". Donc, cela a deux parties. Par exemple, utilisons les données simples des nombres c (1,2,5,6)

1) Lorsque vous créez le hclust en utilisant dist, il utilise les noms des éléments. Et s'ils n'existent pas alors il utilise un index courant. Par exemple:

x <- c(1,2,5,6) 
d1 <- as.dendrogram(hclust(dist(x))) 
plot(d1) 

enter image description here

Ceci est évidemment un problème puisque les éléments que nous avons sont 1,2,5,6 et non 1: 4! Alors, comment pouvons-nous résoudre ce problème? Une façon est de mettre à jour les noms. Par exemple:

x <- c(1,2,5,6) 
names(x) <- x 
x 
d2 <- as.dendrogram(hclust(dist(x))) 
plot(d2) 

enter image description here

Je crois que cela résout fondamentalement votre problème (et franchement, ne nécessite pas dendextend).Mais si vous voulez mettre à jour le texte après avoir créé le dendrogramme - lire:

2) Le paquet dendextend vous permet de mettre à jour les étiquettes d'un dendrogramme. Mais vous devez vous assurer que vous utilisez l'ordre correct (puisque l'ordre du vecteur original, et celui des étiquettes dans l'arbre ne sont pas les mêmes!). Voici comment il peut être fait:

if (!require(dendextend)) install.packages(dendextend); 
library(dendextend) 
x <- c(1,2,5,6) 
d3 <- as.dendrogram(hclust(dist(x))) 
labels(d3) <- x[order.dendrogram(d3)] 
plot(d3) 

enter image description here

Voici comment nous le ferions pour un objet de données plus complexes (où l'on peut ne pas vouloir jouer avec les noms de ligne de l'objet, mais mettre à jour le dendrogramme):

if (!require(dendextend)) install.packages(dendextend); 
library(dendextend) 
x <- CO2[,4:5] 
d4 <- as.dendrogram(hclust(dist(x))) 
labels(d4) <- apply(CO2[,1:3], 1, paste, collapse = "_")[order.dendrogram(d4)] 

d4 <- set(d4, "labels_cex", 0.6) 
d4 <- color_branches(d4, k = 3) 
par(mar = c(3,0,0,6)) 
plot(d4, horiz = T) 

enter image description here