首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中将树状图切成最小聚类大小的n棵树

在R中将树状图切成最小聚类大小的n棵树
EN

Stack Overflow用户
提问于 2013-11-01 19:54:34
回答 1查看 6.4K关注 0票数 6

我正试图使用历史悠久的聚类(特别是hclust)将数据集聚成10个组,每个组的成员数不超过100个,而且没有一个组的总人数超过40%。我目前所知道的唯一方法是反复使用cut()并选择持续较低的h值,直到我对削减的分散性感到满意为止。然而,这迫使我回去重新聚集我修剪过的组,将它们聚合成100个成员组,这是非常耗时的。

我已经尝试过dynamicTreeCut包,但不知道如何输入这些(相对简单的)限制。我使用deepSplit作为指定分组数量的方法,但在文档之后,最大数量限制为4。对于下面的练习,我所要做的就是将集群分成5组,每组3人或更多人(我可以自己处理最大的大小限制,但如果您也想解决这个问题,这会很有帮助!)

下面是我的示例,使用Orange数据集。

代码语言:javascript
复制
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数的树。

EN

回答 1

Stack Overflow用户

发布于 2013-11-09 13:04:46

1-根据数据的性质和聚类的目标,找出最合适的不同度量(例如,"euclidean""maximum""manhattan""canberra""binary""minkowski")和链接方法(例如"ward""single""complete""average""mcquitty""median"d12)。有关更多细节,请参见?dist和?hclust。

2-在开始切割前绘制树状图树。有关更多详细信息,请参阅?hclust。

3.在dynamicTreeCut封装中使用混合自适应树切割方法,并对形状参数(maxCoreScatter和minGap / maxAbsCoreScatter和minAbsGap)进行优化。见Langfelder等人。2009年(http://labs.genetics.ucla.edu/horvath/CoexpressionNetwork/BranchCutting/Supplement.pdf)。

以你为例,

1-酌情更改"euclidean"和/或"complete"方法,

代码语言:javascript
复制
orangeClust <- hclust(dist(orangeCorr, method="euclidean"), method="complete")

2-图树状图,

代码语言:javascript
复制
plot(orangeClust)

3-采用杂交树形切割法,调整形状参数,

代码语言:javascript
复制
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

作为调整形状参数的指南,默认值为

代码语言:javascript
复制
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

如您所见,maxCoreScatter和minGap都应该在0和1之间,而增加maxCoreScatter (减少minGap)会增加集群的数量(具有较小的大小)。这些参数的含义用Langfelder等人来描述。2009年。

例如,为了获得更小的集群

代码语言:javascript
复制
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

最后,您的集群约束(大小、高度、数量、.应该是合理的和可解释的,所生成的聚类应与数据一致。这将引导您了解集群验证和解释的重要步骤。

祝好运!

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19734381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档