在R中将树状图切成n个具有最小聚类大小的树

6
我正在尝试使用层次聚类(具体来说是hclust)将数据集分成10个组,每个组的成员不超过100人,并且没有一个组的人数超过总人口的40%。我目前唯一知道的方法是反复使用cut()并选择连续较低的h级别,直到我对切割的离散程度感到满意。然而,这迫使我回去重新聚类我修剪的组,将它们合并成100个成员的组,这可能非常耗时。
我已经尝试了dynamicTreeCut包,但无法强制执行这些(相对简单的)限制。我使用deepSplit作为指定分组数量的方式,但按照文档,这将最大数量限制为4。在下面的练习中,我只想将聚类分成5个由3个或更多个人组成的组(我可以自己解决最大大小限制,但如果您也想尝试解决这个问题,那么会很有帮助!)。
以下是我的示例,使用Orange数据集。
library(dynamicTreeCut)
library(reshape2)

##creating 14 individuals from Orange's original 5
Orange1<-Orange
Orange1$Tree<-as.numeric(as.character(Orange1$Tree))
Orange2<-Orange1
Orange3<-Orange1
Orange2$Tree=Orange2$Tree+6
Orange3$Tree=Orange3$Tree+11
combOr<-rbind(Orange1, Orange2[1:28,], Orange3)


####casting the data to make a correlation matrix, and then running 
#### a hierarchical cluster
castOrange<-dcast(combOr, age~Tree, mean, fill=0)
castOrange[,16]<-c(1,34,5,35,34,35,21)
castOrange[,17]<-c(1,34,5,35,34,35,21)
orangeCorr<-cor(castOrange[, -1])
orangeClust<-hclust(dist(orangeCorr))

###running the dynamic tree cut
dynamicCut<-cutreeDynamic(orangeClust, minClusterSize=3, method="tree", deepSplit=4)

dynamicCut
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0

可以看到,它只指定了两个群集。对于我的练习,我想避免使用明确的高度术语来削减树木,而是希望得到 k 束树。


这是一个旧帖子,但请注意,0意味着“没有聚类”,而不是“#0聚类”!在这个例子中,只有1个聚类。 - Gautier Drusch
1个回答

8
1- 确定最适合的差异度量方法(例如,"欧几里得"、"最大值"、"曼哈顿"、"堪培拉"、"二进制"或"闵可夫斯基")和链接方法(例如,"瓦德"、"单一"、"完全"、"平均"、"麦夸蒂"、"中位数"或"质心"),基于数据的性质和聚类目标。有关更多详细信息,请参见?dist和?hclust。
2- 在开始切割步骤之前绘制树状图。有关更多详细信息,请参见?hclust。

3- 在 dynamicTreeCut 包中使用混合自适应树切割方法,并调整形状参数 (maxCoreScatterminGap / maxAbsCoreScatterminAbsGap)。参见 Langfelder 等人的 2009 年论文 (http://labs.genetics.ucla.edu/horvath/CoexpressionNetwork/BranchCutting/Supplement.pdf)。


针对您的示例,

1- 根据需要更改"euclidean"和/或"complete"方法,

orangeClust <- hclust(dist(orangeCorr, method="euclidean"), method="complete")

2- 绘制树状图,

plot(orangeClust)

3- 使用混合树剪枝方法并调整形状参数,

dynamicCut <- cutreeDynamic(orangeClust, minClusterSize=3, method="hybrid", distM=as.matrix(dist(orangeCorr, method="euclidean")), deepSplit=4, maxCoreScatter=NULL, minGap=NULL, maxAbsCoreScatter=NULL, minAbsGap=NULL)
dynamicCut
 ..cutHeight not given, setting it to 1.8  ===>  99% of the (truncated) height range in dendro.
 ..done.
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0

作为调整形状参数的指南,其默认值为
deepSplit=0: maxCoreScatter = 0.64 & minGap = (1 - maxCoreScatter) * 3/4
deepSplit=1: maxCoreScatter = 0.73 & minGap = (1 - maxCoreScatter) * 3/4
deepSplit=2: maxCoreScatter = 0.82 & minGap = (1 - maxCoreScatter) * 3/4
deepSplit=3: maxCoreScatter = 0.91 & minGap = (1 - maxCoreScatter) * 3/4
deepSplit=4: maxCoreScatter = 0.95 & minGap = (1 - maxCoreScatter) * 3/4

正如您所见,maxCoreScatterminGap都应该在01之间,并且增加maxCoreScatter(减少minGap)会增加聚类的数量(大小更小)。这些参数的含义在Langfelder等人的2009年论文中有描述。
例如,要获得更多较小的聚类。
maxCoreScatter <- 0.99
minGap <- (1 - maxCoreScatter) * 3/4
dynamicCut <- cutreeDynamic(orangeClust, minClusterSize=3, method="hybrid", distM=as.matrix(dist(orangeCorr, method="euclidean")), deepSplit=4, maxCoreScatter=maxCoreScatter, minGap=minGap, maxAbsCoreScatter=NULL, minAbsGap=NULL)
dynamicCut
 ..cutHeight not given, setting it to 1.8  ===>  99% of the (truncated) height range in dendro.
 ..done.
 2 3 2 2 2 3 3 2 2 3 3 2 2 2 1 2 1 1 1 2 2 1 1 2 2 1 1 1 0 0

最后,您的聚类约束(大小、高度、数量等)应该是合理且可解释的,并且生成的聚类应该与数据相符。这将引导您进行重要的聚类验证和解释步骤。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接