我正在尝试找出如何检索哪些群集是“父/子”群集的“子代/子代”。让我用下面的图来说明这一点。
此图是具有不同聚类解决方案的普通树状图。我想画的是较小的群集和较大的群集之间的路径。我之所以要这样做,是因为我有一个非常大的数据集,并且具有复杂的群集,并且我需要了解哪些群集从大型群集中“下降”(小型群集)。
# Load data
data(USArrests)
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
par(mfrow = c(2,2))
# Plot the obtained dendrogram
plot(hc, cex = 0.6, hang = -1)
rect.hclust(hc, k = 2, border = 2:5)
plot(hc, cex = 0.6, hang = -1)
rect.hclust(hc, k = 4, border = 2:5)
plot(hc, cex = 0.6, hang = -1)
rect.hclust(hc, k = 8, border = 2:5)
plot(hc, cex = 0.6, hang = -1)
rect.hclust(hc, k = 12, border = 2:5)
例如,这里有两个解决方案:2个集群和4个集群。我不清楚如何知道从两个sub_grp2
集群中划分出哪个sub_grp1
集群(依此类推)。
# Cut tree into 4 groups
sub_grp1 <- cutree(hc, k = 2)
sub_grp2 <- cutree(hc, k = 4)
sub_grp3 <- cutree(hc, k = 8)
sub_grp4 <- cutree(hc, k = 12)
USArrests$sub_grp1 = sub_grp1
USArrests$sub_grp2 = sub_grp2
USArrests$sub_grp3 = sub_grp3
USArrests$sub_grp4 = sub_grp4
我真正想要绘制或以任何方式检索的东西是:
这确实可以帮助我知道哪个较小的集群从较大的集群“下降”。
这有意义吗?
您可以尝试使用clustree
软件包。该顺序可能与树状图中的顺序不同,但是您可以看到这种关系:
library(clustree)
data(USArrests)
# Compute distances and hierarchical clustering
dd <- dist(scale(USArrests), method = "euclidean")
hc <- hclust(dd, method = "ward.D2")
Ks = c(1,2,4,6,8)
clus_results = sapply(Ks,function(i){
cutree(hc,i)
})
colnames(clus_results) = paste0("K",Ks)
clustree(clus_results, prefix = "K")
一种解决方案是将树状图转换为igraph
图,并使用igraph中可用的绘图工具。
具有全部50种状态,有点拥挤,但是您可以看到树的结构。
## Convert to a phylo, then to igraph
library(ape)
PH = as.phylo(hc)
IG = as.igraph(PH)
## Make a nice layout
LO = layout_as_tree(IG)
LO2 = LO[,2:1]
LO2[,1] = LO2[,1]*6
## plot
plot(IG, layout=LO2, vertex.size=80, edge.arrow.size=0.5,
rescale=F, vertex.label.cex = 0.8,
xlim=range(LO2[,1]), ylim=range(LO2[,2]))