2013-11-01 5 views
5

Ich versuche zu verwenden Clusterarchive (speziell hclust), um einen Datensatz in 10 Gruppen mit einer Größe von 100 Mitgliedern oder weniger und ohne eine Gruppe mit mehr als 40 zu gruppieren % der Gesamtbevölkerung. Die einzige Methode, die ich derzeit kenne, ist, wiederholt cut() zu verwenden und kontinuierlich niedrigere h-Werte auszuwählen, bis ich mit der Zerstreuung der Schnitte zufrieden bin. Dies zwingt mich jedoch dazu, zurückzugehen und die Gruppen, die ich beschnitten habe, neu zu gruppieren, um sie in 100 Mitgliedsgruppen zusammenzufassen, was sehr zeitaufwendig sein kann.Schneiden von Dendrogramm in n-Bäume mit minimaler Clustergröße in R

Ich habe mit dem dynamicTreeCut Paket experimentiert, kann aber nicht herausfinden, wie man diese (relativ einfachen) Einschränkungen eingibt. Ich benutze deepSplit als die Art, die Anzahl der Gruppierungen zu bestimmen, aber nach der Dokumentation begrenzt dies die maximale Anzahl auf 4. Für die Übung unten, alles, was ich tun möchte, ist es, die Cluster in 5 Gruppen von 3 zu bekommen oder mehr Einzelpersonen (ich kann die maximale Größenbeschränkung allein bewältigen, aber wenn Sie versuchen möchten, dies auch anzugehen, wäre es hilfreich!).

Hier ist mein Beispiel, mit dem Datensatz 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 

Wie Sie sehen können, bezeichnet es nur zwei Cluster. Für meine Übung möchte ich mich davor hüten, einen expliziten Höhenbegriff zu verwenden, um die Bäume zu schneiden, da ich stattdessen eine k Anzahl von Bäumen haben möchte.

+0

Es ist ein alter Beitrag, aber sei vorsichtig, 0 bedeutet "nicht geclustert" und nicht "der # 0 Cluster"! In diesem Beispiel gibt es nur 1 Cluster. –

Antwort

7

1- herauszufinden, die am besten geeigneten Unähnlichkeitsmaß (zB "euclidean", "maximum", "manhattan", "canberra", "binary" oder "minkowski") und Verknüpfungsmethode (zB "ward", "single", "complete", "average", "mcquitty", "median" oder "centroid") basierend auf der Art Ihrer Daten und dem (den) Ziel (en) der Clusterbildung. Weitere Details finden Sie unter ?dist und ?hclust.

2- Zeichnen Sie den Dendogrammbaum, bevor Sie mit dem Schneiden beginnen. Weitere Details finden Sie unter ?hclust.

3- Verwenden der Hybrid adaptive Baumschneideverfahren in dynamicTreeCut Paket, und stimmen die Formparameter (maxCoreScatterminGap und/maxAbsCoreScatter und minAbsGap). Siehe Langfelder et al. 2009 (http://labs.genetics.ucla.edu/horvath/CoexpressionNetwork/BranchCutting/Supplement.pdf).


Für Ihr Beispiel

1- Ändern "euclidean" und/oder "complete" entsprechende Methoden,

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

2- Plot Dendrogramm,

plot(orangeClust) 

3- Verwenden der Hybridbaumschnittmethode und stimmen Formparameter,

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 

Als Richtwert für die Formparameter Tuning, sind die Standardwerte

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 

Wie Sie sehen können, beide maxCoreScatter und minGap zwischen 0 und 1 sein sollte, und maxCoreScatter zunehmenden (abnehm minGap) erhöht die Anzahl der Cluster (mit kleineren Größen). Die Bedeutung dieser Parameter wird in Langfelder et al. 2009

Zum Beispiel, um mehr kleinere Cluster

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 

Schließlich Ihre Clustering Einschränkungen (Größe, Höhe, Anzahl, ... usw.) sollten angemessen und interpretierbar sein, und die erzeugen Cluster sollten mit den Daten übereinstimmen. Dies führt Sie zu dem wichtigen Schritt der Cluster-Validierung und Interpretation.


Viel Glück!

Verwandte Themen