2017-02-23 2 views
0

Ich verwende R dendextend-Paket, um hclust-Baumobjekte zu plotten, die von jeder hclust-Methode aus hclust generiert werden {stats}: "ward.D", "ward.D2", "single", "vollständig", "durchschnittlich" (= UPGMA), "mcquitty" (= WPGMA), "Median" (= WPGMC) oder "Zentroid" (= UPGMC).dendextend: color_branches funktioniert nicht für bestimmte hclust-Methoden

Ich bemerke, dass die Farbcodierung für color_branches fehlschlägt, wenn ich method = "median" oder "centroid" verwende.

Ich testete es mit zufällig generierten Matrix und Fehler wird für die "Median" und "Zentroid" Methoden repliziert, gibt es einen bestimmten Grund dafür?

Bitte beachten Sie den Link für die Ausgangs Stellplätze: fig1. hclust methods (a) ward.D2, (b) median, (c) centroid

library(dendextend) 
set.seed(1) 
df <- as.data.frame(replicate(10, rnorm(20))) 
df.names <- rep(c("black", "red", "blue", "green", "cyan"), 2) 
df.col <- rep(c("black", "red", "blue", "green", "cyan"), 2) 
colnames(df) <- df.names 
df.dist <- dist(t(df), method = "euclidean") 

# plotting works for "ward.D", "ward.D2", "single", "complete", "average", "mcquitty" 
dend <- as.dendrogram(hclust(df.dist, method = "ward.D2"), labels = df.names) 
labels_colors(dend) <- df.col[order.dendrogram(dend)] 
dend.colorBranch <- color_branches(dend, k = length(df.names), col = df.col[order.dendrogram(dend)]) 
dend.colorBranch %>% set("branches_lwd", 3) %>% plot(horiz = TRUE) 

# color_branches fails for "median" or "centroid" 
dend <- as.dendrogram(hclust(df.dist, method = "median"), labels = df.names) 
labels_colors(dend) <- df.col[order.dendrogram(dend)] 
dend.colorBranch <- color_branches(dend, k = length(df.names), col = df.col[order.dendrogram(dend)]) 
dend.colorBranch %>% set("branches_lwd", 3) %>% plot(horiz = TRUE) 

dend <- as.dendrogram(hclust(df.dist, method = "centroid"), labels = df.names) 
labels_colors(dend) <- df.col[order.dendrogram(dend)] 
dend.colorBranch <- color_branches(dend, k = length(df.names), col = df.col[order.dendrogram(dend)]) 
dend.colorBranch %>% set("branches_lwd", 3) %>% plot(horiz = TRUE) 

ich dendextend_1.4.0 verwende. Sitzungsinfo unten:

sessionInfo() 
R version 3.3.2 (2016-10-31) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: macOS Sierra 10.12.3 

Danke.

+0

Es funktioniert gut für mich, was ist Ihre genaue Ausgabe, bitte füge es ein. –

+0

ok, ich sehe jetzt was du meinst. Das Problem ist, dass dieser Code Cluster mit Baumhöhen erzeugt, die "komisch" sind. In einem solchen Fall ist mir nicht klar, wie ich damit umgehen soll, da die Bedeutung eines "Schnitts" nicht klar ist. –

+0

Hallo Tal, ja ich vermutete, dass es etwas mit den "seltsamen" Baumhöhen zu tun hatte, die meine Daten erzeugten, aber da ich es in einer zufälligen Matrix reproduzieren konnte, war ich neugierig, ob es mit den Clustermethoden zusammenhängt Tendenz, diese Arten von Bäumen zu erzeugen. Die Farbcodierung für die Etiketten funktioniert ... Gibt es eine Möglichkeit für mich, den Code zu bearbeiten, um zu markieren, wenn ein Schnitt nicht klar ist, und die Farbe der Zweige basierend auf der Etikettenreihenfolge zuzuweisen? –

Antwort

1

Sie dieses Problem lösen können mit branches_attr_by_clusters (obwohl es ein bisschen schwierig bekommen könnte, siehe Beispiel unten):

library(dendextend) 
set.seed(1) 
df <- as.data.frame(replicate(10, rnorm(20))) 
df.names <- rep(c("black", "red", "blue", "green", "cyan"), 2) 
df.col <- rep(c("black", "red", "blue", "green", "cyan"), 2) 
colnames(df) <- df.names 
df.dist <- dist(t(df), method = "euclidean") 

# plotting works for "ward.D", "ward.D2", "single", "complete", "average", "mcquitty" 
dend <- as.dendrogram(hclust(df.dist, method = "ward.D2"), labels = df.names) 
labels_colors(dend) <- df.col[order.dendrogram(dend)] 
dend.colorBranch <- color_branches(dend, k = length(df.names), col = df.col[order.dendrogram(dend)]) 
dend.colorBranch %>% set("branches_lwd", 3) %>% plot(horiz = TRUE) 

# color_branches fails for "median" or "centroid" 
dend <- as.dendrogram(hclust(df.dist, method = "median"), labels = df.names) 
aa <- df.col[order.dendrogram(dend)] 
labels_colors(dend) <- aa 
dend.colorBranch <- color_branches(dend, k = length(df.names), col = df.col[order.dendrogram(dend)]) 
dend.colorBranch %>% set("branches_lwd", 3) %>% plot(horiz = TRUE) 

aa <- factor(aa, levels = unique(aa)) 
dend %>% branches_attr_by_clusters(aa, value = levels(aa)) %>% plot 

enter image description here

Verwandte Themen