2013-11-01 67 views
5

我試圖使用僱主聚類(特別是hclust)將數據集劃分爲10個組,其大小爲100個或更少,且沒有組超過40個佔總人口的百分比。我目前唯一知道的方法是反覆使用cut()並選擇不斷降低的h值,直到我對切割的分散感到滿意爲止。然而,這迫使我回去重新組合我修剪的小組,將它們聚合爲100個成員組,這可能非常耗時。將樹狀圖切割爲最小簇大小爲n的樹

我已經試用了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表示「未聚集」而不是「#0簇」!在這個例子中,只有一個羣集。 –

回答

7

1-找出最合適的相異性度量(例如,"euclidean""maximum""manhattan""canberra""binary",或"minkowski")和聯動方法(例如,"ward""single""complete""average""mcquitty""median" ,或"centroid")基於您的數據的性質和聚類的目標。有關更多詳細信息,請參閱?dist?hclust。在開始切割步驟之前繪製樹狀圖樹。有關更多詳情,請參閱?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 

正如你可以看到,這兩個maxCoreScatterminGap01,並增加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 

最後,您的集羣約束(大小,高度,數量,...等),應合理解釋,併產生集羣應該同意這些數據。這將引導您進行聚類驗證和解釋的重要步驟。


祝你好運!