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一些树。

4

1 回答 1

7

1-根据数据的性质和聚类的目标,找出最合适的差异度量(例如 、"euclidean""maximum""manhattan"、或)和链接方法(例如 、、、、、或) 。见和"canberra""binary""minkowski""ward""single""complete""average""mcquitty""median""centroid"?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都应该在0和之间1,并且增加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

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


祝你好运!

于 2013-11-09T13:04:46.987 回答