Domanda

Prendere il seguente codice:

 heatmap(data.matrix(signals),col=colors,breaks=breaks,scale="none",Colv=NA,labRow=NA)

Come posso estrarre, pre-calcolare o ricalcolare l'ordine delle righe nella mappa termica prodotta? C'è un modo per iniettare l'uscita del hclust(dist(signals)) nella funzione heatmap?

È stato utile?

Soluzione

Grazie per il feedback, Jesse e Paolo. Ho scritto la seguente funzione ordinamento che si spera essere utile agli altri:

data        = data.matrix(data)
distance    = dist(data)
cluster     = hclust(distance, method="ward")
dendrogram  = as.dendrogram(cluster)
Rowv        = rowMeans(data, na.rm = T)
dendrogram  = reorder(dendrogram, Rowv)

## Produce the heatmap from the calculated dendrogram.
## Don't allow it to re-order rows because we have already re-ordered them above.

reorderfun = function(d,w) { d }
png("heatmap.png", res=150, height=22,width=17,units="in")

heatmap(data,col=colors,breaks=breaks,scale="none",Colv=NA,Rowv=dendrogram,labRow=NA, reorderfun=reorderfun)

dev.off()


## Re-order the original data using the computed dendrogram
rowInd = rev(order.dendrogram(dendrogram))
di = dim(data)
nc = di[2L]
nr = di[1L]
colInd = 1L:nc
data_ordered <- data[rowInd, colInd]
write.table(data_ordered, "rows.txt",quote=F, sep="\t",row.names=T, col.names=T)

Altri suggerimenti

Ci sono una varietà di opzioni. Se si esegue ?heatmap vedrete i vari parametri da affinare. Forse il più semplice è quello Rowv=NA set che dovrebbe sopprimere fila riordino e quindi passare nella matrice con le righe già nell'ordine che si desidera. Ma si può anche fornire manualmente una funzione di clustering, o dendrogrammi, tramite Rowv e hclustfun ecc ...

Sono d'accordo con Jesse. Per il vostro problema un'occhiata al Rowv, distfun e hclustfunarguments della funzione heatmap. Per più scelte le funzioni heatmap.2 nel pacchetto gplots, heatmap_plus nel pacchetto Heatplus e pheatmap nel pacchetto pheatmap potrebbe essere di qualche utilità.

Credo che questo post potrebbe essere utile:

Come righe d'ordine R heatmap di default?

Prendere la seguente matrice per esempio:

set.seed(321)
m = matrix(nrow=7, ncol = 7, rnorm(49))
> m
           [,1]       [,2]       [,3]        [,4]       [,5]        [,6]      [,7]
[1,]  1.7049032  0.2331354 -1.1534395 -0.10706154 -1.1203274  0.11453945 0.2503958
[2,] -0.7120386  0.3391139 -0.8046717  0.98833540 -0.4746847 -2.22626331 0.2440872
[3,] -0.2779849 -0.5519147  0.4560691 -1.07223880 -1.5304122  1.63579034 0.7997382
[4,] -0.1196490  0.3477014  0.4203326 -0.75801528  0.4157148 -0.15932072 0.3414096
[5,] -0.1239606  1.4845918  0.5775845  0.09500072  0.6341979  0.02826746 0.2587177
[6,]  0.2681838  0.1883255  0.4463561 -2.33093117  1.2308474 -1.53665329 0.9538786
[7,]  0.7268415  2.4432598  0.9172555  0.41751598 -0.1545637  0.07815779 1.1364147

È possibile ignorare l'ordine delle righe e colonne con i parametri Rowv e Colv. È possibile ignorare l'ordine con questi come dendrogrammi. Per esempio, è possibile calcolare un ordine utilizzando la funzione hclust, quindi passare che a heatmap come un dendrogramma:

 rhcr <- hclust(dist(m))
 chrc <- hclust(dist(t(m)))
 heatmap(m,Rowv = as.dendrogram(rhcr),
           Colv = as.dendrogram(rhcr))

 > rhcr$order
 [1] 1 3 6 2 7 4 5
 > chrc$order
 [1] 6 4 5 1 2 3 7

Dà:

Hclust heatmap

La funzione predefinita heatmap utilizza un passo ulteriore, tuttavia, attraverso il parametro reorderfun = function(d, w) reorder(d, w), che riordina la dendrogramma quanto possibili basi sulla riga / colonna medio. è possibile riprodurre l'ordine predefinito con questo passo ulteriore. Quindi, per ottenere lo stesso ordinamento come heatmap, si può fare:

rddr <- reorder(as.dendrogram(rhcr),rowMeans(m))
cddr <- reorder(as.dendrogram(chcr),colMeans(m))

> as.hclust(rddr)$order
[1] 3 1 6 2 4 5 7
> as.hclust(cddr)$order
[1] 6 4 5 1 2 3 7

Il che dà lo stesso risultato semplicemente heatmap(m):

predefinito heatmap

In questo esempio le colonne capita di non farsi riordinato, ma le righe fanno. Infine, per recuperare semplicemente l'ordine è possibile assegnare la mappa termica a una variabile e ottenere l'output.

> p <- heatmap(m)
> p$rowInd
[1] 3 1 6 2 4 5 7
> p$colInd
[1] 6 4 5 1 2 3 7

pheatmap vi permetterà di specificare il metodo che usa per fare il clustering, accettando gli stessi argomenti come hclust.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top