r树形图 - groupLabels与真实标签不匹配(包dendextend)

时间:2017-05-25 19:41:58

标签: r dendrogram dendextend

让我们使用 FactoMineR 包对 iris数据集进行快速3聚类分类:

library(FactoMineR)
model <- HCPC(iris[,1:4], nb.clust = 3)
summary(model$data.clust$clust)

 1  2  3
50 62 38

我们看到群集1中有50个观察,群集2中有62个,群集3中有38个。

现在,我们希望在树形图中可视化这3个聚类,使用 dendextend 包可以制作漂亮的聚类:

library(dendextend)
library(dplyr)
model$call$t$tree %>% 
    as.dendrogram() %>% 
    color_branches(k = 3, groupLabels = unique(model$data.clust$clust)) %>% 
    plot()

enter image description here

问题是树形图上的标签不符合分类的真实标签。群集2应该是最大的(根据数据进行62次观察),但在树形图上,我们清楚地看到它是最小的一个。

我尝试了不同的想法但现在没有任何作用,所以如果你知道哪个输入提供给groupLabels =以匹配真实标签,那就太好了。

1 个答案:

答案 0 :(得分:2)

查看dendextend::color_branches内部,我们可以看到使用命令g <- dendextend::cutree(dend, k = k, h = h, order_clusters_as_data = FALSE)分配了组标签 此事实可用于在HCPC分配的群集标签和dendextend::color_branches分配的群组标签之间构建地图。

library(FactoMineR)
library(dendextend)
library(dplyr)
model <- HCPC(iris[,1:4], nb.clust = 3)  

clust.hcpc <- as.numeric(model$data.clust$clust)
clust.cutree <- dendextend:::cutree(model$call$t$tree, k=3, order_clusters_as_data = FALSE)
idx <- order(as.numeric(names(clust.cutree)))
clust.cutree <- clust.cutree[idx]
( tbl <- table(clust.hcpc, clust.cutree) )

###########
          clust.cutree
clust.hcpc  1  2  3
         1 50  0  0
         2  0  0 62
         3  0 36  2

此表显示群集标签2和3分别与组标签3和2匹配。 (令人惊讶的是,对于两个样本单位,这个规则并不正确。)

需要传递给dendextend::color_branches的组级别可以如下找到:

( lbls <- apply(tbl,2,which.max) )

##############
1 2 3 
1 3 2

这是树形图:

model$call$t$tree %>% 
    color_branches(k=3, groupLabels =lbls) %>% 
    set("labels_cex", .5) %>% 
    plot(horiz=T) 

enter image description here