Ordine di righe in heatmap?
-
24-10-2019 - |
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?
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 hclustfun
arguments 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à:
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)
:
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.