2011-03-16 22 views
5

Tome el siguiente código:¿Orden de filas en heatmap?

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

¿Cómo puedo extraer, antes de calcular o volver a calcular el orden de las filas en el mapa de calor producido? ¿Hay alguna manera de inyectar la salida de hclust(dist(signals)) en la función de mapa de calor?

+0

pregunta relacionada: [? ¿Qué mapa de calor/imagen para obtener parcela en hilera-ordenados sin ningún dendrograma] (https://stackoverflow.com/questions/10562078/r-which-heatmap-image-to-get- row-sorted-plot-without-any-dendrogram) – smci

Respuesta

12

Gracias por los comentarios, Jesse y Paolo. Escribí la siguiente función de ordenación que se espera que sea útil para otros:

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) 
4

Hay una variedad de opciones. Si ejecuta ?heatmap, verá los diversos parámetros que puede ajustar. Tal vez lo más fácil sea establecer Rowv=NA, que debería suprimir el reordenamiento de fila, y luego pasar la matriz con las filas ya en el orden que desee. Pero también puede proporcionar manualmente una función de agrupamiento, o dendrogramas, a través de Rowv y hclustfun etc ...

2

Estoy de acuerdo con Jesse. Para su problema, eche un vistazo a los argumentos Rowv, distfun y hclustfun de la función de mapa de calor. Para más opciones, las funciones heatmap.2 en el paquete gplots, heatmap_plus en el paquete Heatplus y pheatmap en el paquete pheatmap podrían ser de alguna utilidad.

1

pheatmap le permitirá especificar el método que se utiliza para hacer el agrupamiento, la aceptación de los mismos argumentos que hclust.

2

creo que este post podría ser útil:

How does R heatmap order rows by default?

Tome la siguiente matriz, por ejemplo:

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 

puede invalidar el orden de las filas y columnas con los parámetros Rowv y Colv. Puede anular el orden con estos como dendrogramas. Por ejemplo, se puede calcular un pedido utilizando la función hclust, a continuación, pasar eso a heatmap como un dendrograma:

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 

Da:

Hclust heatmap

La función de mapa de calor por defecto utiliza un paso adicional, sin embargo , a través del parámetro reorderfun = function(d, w) reorder(d, w), que reordena el dendrograma tanto como sea posible en base a la media de fila/columna. puede reproducir el orden predeterminado con este paso adicional. Así que para obtener el mismo orden como heatmap, que puede hacer:

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 

que da el mismo resultado que simplemente heatmap(m):

Default heatmap

En este ejemplo, las columnas suceden para no ser reordenado, pero las filas lo hacen. Finalmente, para recuperar el orden, puede asignar el mapa de calor a una variable y obtener el resultado.

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