2011-01-24 16 views
5

Mi chiedo cosa fanno le altre persone con K-means che ordina i cluster. Sto facendo heatmap (principalmente dei dati ChIP-Seq) e ottenendo figure dall'aspetto piacevole con una funzione heatmap personalizzata (basata sulla funzione heatmap incorporata da R). Tuttavia, mi piacerebbe due miglioramenti. Il primo è ordinare i miei cluster sulla base del valore medio decrescente. Ad esempio, il seguente codice:Kmean inter e intra cluster ordering

fit = kmeans(data, 8, iter.max=50, nstart=10) 
d = data.frame(data, symbol) 
d = data.frame(d, fit$cluster) 
d = d[order(d$fit.cluster),] 

mi fornisce un data.frame ordinato su una colonna di cluster. Qual è il modo migliore per ordinare le righe in modo tale che gli 8 cluster siano in ordine di rispettivo significato?

In secondo luogo, si consiglia di ordinare le righe ALL'INTERNO di ogni cluster dal valore medio più alto al più basso? Ciò imporrà un aspetto più organizzato sui dati, ma potrebbe ingannare un osservatore non cauto a dedurre qualcosa che forse non dovrebbe. Se lo consigli, come lo faresti nel modo più efficiente?

+0

mezzi di che cosa? Una delle variabili utilizzate per il clustering o qualcos'altro? –

+0

Mezzi dei valori in ciascun cluster. Ad esempio, se ogni cluster è 30 righe in un data.frame e data.frame ha 10 colonne su cui viene eseguito k-means clustering, vorrei la media dei 300 valori in ogni cluster. Potrebbe anche usare il centroide. –

+0

Il centroide non è un numero per ogni cluster, è un punto nello spazio 10-d e quindi ciascun centroide del cluster ha 10 coordinate. –

risposta

4

Non è una risposta esatta a quello che chiedi, ma forse potresti prendere in considerazione la seriazione invece del k-means clustering. È un po 'come l'ordinazione piuttosto che il clustering, ma un risultato finale è una heatmap dei dati archiviati che suona simile a quello che sembra fare con k-means seguito da una heatmap appositamente ordinata.

C'è un pacchetto di R per la seriazione, chiamato seriation ed ha una vignetta, che si può ottenere directly from CRAN

Risponderò le specifiche del Q una volta che ho cucinato un esempio da provare.

Ok - risposta corretta dopo il commento sopra. Prima alcuni dati fittizi - 3 gruppi di 10 campioni ciascuno, su ciascuna delle 3 variabili.

set.seed(1) 
dat <- data.frame(A = c(rnorm(10, 2), rnorm(10, -2), rnorm(10, -2)), 
        B = c(rnorm(10, 0), rnorm(10, 5), rnorm(10, -2)), 
        C = c(rnorm(10, 0), rnorm(10, 0), rnorm(10, -10))) 

## randomise the rows 
dat <- dat[sample(nrow(dat)),] 
clus <- kmeans(scale(dat, scale = FALSE), centers = 3, iter.max = 50, 
       nstart = 10) 

## means of n points in each cluster 
mns <- sapply(split(dat, clus$cluster), function(x) mean(unlist(x))) 

## order the data by cluster with clusters ordered by `mns`, low to high 
dat2 <- do.call("rbind", split(dat, clus$cluster)[order(mns)]) 

## heatmaps 
## original first, then reordered: 
layout(matrix(1:2, ncol = 2)) 
image(1:3, 1:30, t(data.matrix(dat)), ylab = "Observations", 
     xlab = "Variables", xaxt = "n", main = "Original") 
axis(1, at = 1:3) 
image(1:3, 1:30, t(data.matrix(dat2)), ylab = "Observations", 
     xlab = "Variables", xaxt = "n", main = "Reordered") 
axis(1, at = 1:3) 
layout(1) 

Cedendo:

Original and reordered heatmaps

+0

Eccellente! Voglio fare un tentativo e assicurarmi di non incorrere in alcun problema prima di accettare. Grazie mille per essere tornato! –

+0

Nessun problema @Ron pubblica un commento o modifica la tua domanda e la vedrò come se l'avessi preferita -d Q –

+1

Ho appena avuto qualcuno che veniva da me cercando di farlo, ma non stavo ottenendo i risultati si aspettavano. Penso che potremmo aver bisogno di un ordine (rank ('piuttosto che' order (order') Per esempio se abbiamo 'mns <- c (0.18, 0.19, -0.27, 0.24, 0.32, -0.05)' we ' Se vuoi che il terzo gruppo sia elencato per primo, e il quinto gruppo elencato per ultimo. Se abbiamo 'clus <- 1: 6' allora' clus [ordine (ordine (mns) [clus])] 'dà l'ultimo elemento, ma 'clus [order (rank (mns) [clus])]' dà correttamente il quinto elemento Vogliamo ordinare i dati in base al grado della media del cluster. So che è una vecchia risposta, ma le persone sembrano ancora Qui. –