2017-02-23 34 views
0

Я использую пакет R dendextend для построения объектов дерева hclust, генерируемых каждым методом hclust из hclust {stats}: «ward.D», «ward.D2», «single», «полный», «средний» (= UPGMA), «mcquitty» (= WPGMA), «средний» (= WPGMC) или «центроид» (= UPGMC).dendextend: color_branches не работает для определенных методов hclust

Я замечаю, что цветовая кодировка для color_branches терпит неудачу, когда я использую метод = «медианный» или «центроидный».

Я тестировал его со случайно сгенерированной матрицей, и ошибка реплицируется для «медианных» и «центроидных» методов, есть ли для этого конкретная причина?

Пожалуйста, смотрите ссылку для выходных участков: 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) 

Я использую dendextend_1.4.0. Сессия Информация ниже:

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 

Спасибо.

+0

Он отлично работает для меня, то, что ваш точный выход, пожалуйста вставьте его. –

+0

ОК, теперь я понимаю, что вы имеете в виду. Проблема в том, что этот код создает кластеры с высотами деревьев, которые являются «странными». В таком случае мне непонятно, как его решать, поскольку смысл «разреза» не ясен. –

+0

Привет Таль, да, я подозревал, что это связано с «странными» высотами деревьев, которые генерировали мои данные, но поскольку я смог воспроизвести его в случайной матрице, мне было любопытно, связано ли это с кластерными методами - если эти методы имеют тенденция генерировать эти типы деревьев. Цветное кодирование ярлыков работает ... Есть ли способ изменить код, который будет отмечен, когда разрез нечеткий, и назначить цвет ветвей на основе порядка ярлыков? –

ответ

1

Вы можете решить эту проблему с помощью branches_attr_by_clusters (хотя он может получить немного сложнее, смотрите пример ниже):

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