2013-11-01 30 views
5

Sto provando a utilizzare il clustering di ricerca (in particolare hclust) per raggruppare un set di dati in 10 gruppi con dimensioni di 100 membri o meno e senza gruppo con più di 40 % della popolazione totale. L'unico metodo che conosco attualmente è utilizzare ripetutamente lo cut() e selezionare livelli sempre più bassi di h finché non sono soddisfatto della dispersione dei tagli. Tuttavia, questo mi costringe a tornare indietro ea raggruppare nuovamente i gruppi che ho potato per aggregarli in 100 gruppi membri, il che può richiedere molto tempo.Dendrogramma di taglio in n alberi con dimensione minima del cluster in R

Ho sperimentato con il pacchetto dynamicTreeCut, ma non riesco a capire come inserire queste (relativamente semplici) limitazioni. Sto usando deepSplit come modo per designare il numero di raggruppamenti, ma seguendo la documentazione, questo limita il numero massimo a 4. Per l'esercizio di seguito, tutto quello che sto cercando di fare è ottenere i cluster in 5 gruppi di 3 o più individui (posso affrontare la limitazione della dimensione massima per conto mio, ma se vuoi provare ad affrontare anche questo, sarebbe utile!).

Ecco il mio esempio, utilizzando il set di dati 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 

Come si può vedere, designa solo due cluster. Per il mio esercizio, voglio evitare di usare un termine di altezza esplicito per tagliare gli alberi, poiché preferisco il numero di alberi .

+0

È un vecchio post, ma attenzione, 0 significa "non in cluster" e non "il cluster n. 0"! In questo esempio, c'è solo 1 cluster. –

risposta

7

1- capire il più appropriato misura dissomiglianza (ad esempio, "euclidean", "maximum", "manhattan", "canberra", "binary" o "minkowski") e metodo linkage (ad esempio, "ward", "single", "complete", "average", "mcquitty", "median" o "centroid") in base alla natura dei dati e agli obiettivi del clustering. Vedi ?dist e ?hclust per maggiori dettagli.

2- Tracciare l'albero del dendogramma prima di iniziare la fase di taglio. Vedi ?hclust per maggiori dettagli.

3- Utilizzare il metodo ibrido adattivo albero del taglio in dynamicTreeCut pacchetto e regolare i parametri di forma (maxCoreScatter e minGap/maxAbsCoreScatter e minAbsGap). Vedi Langfelder et al. 2009 (http://labs.genetics.ucla.edu/horvath/CoexpressionNetwork/BranchCutting/Supplement.pdf).


Per esempio,

1- Modifica "euclidean" e/o "complete" metodo più appropriato,

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

2- Plot dendogramma,

plot(orangeClust) 

3- Usare il metodo di taglio ibrido dell'albero e parametri di regolazione della tonalità,

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 

Come guida per la sintonizzazione dei parametri di forma, i valori predefiniti sono

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 

Come si può vedere, sia maxCoreScatter e minGap deve essere compresa tra 0 e 1, e aumentando maxCoreScatter (diminuendo minGap) aumenta il numero di cluster (con dimensioni più piccole). Il significato di questi parametri è descritto in Langfelder et al. 2009.

Ad esempio, per acquistare più cluster più piccoli

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 

Infine, i vostri vincoli di clustering (dimensioni, altezza, numero, ecc ...) devono essere ragionevoli e interpretabile, e generato i cluster dovrebbero essere d'accordo con i dati. Questo ti guida al passaggio importante della validazione e dell'interpretazione del clustering.


Buona fortuna!

Problemi correlati