Порядок строк в тепловой карте? - PullRequest
5 голосов
/ 16 марта 2011

Возьмите следующий код:

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

Как извлечь, предварительно рассчитать или пересчитать порядок строк в полученной тепловой карте?Есть ли способ внедрить вывод hclust(dist(signals)) в функцию heatmap?

Ответы [ 5 ]

12 голосов
/ 16 марта 2011

Спасибо за отзыв, Джесси и Паоло.Я написал следующую функцию упорядочения, которая, будем надеяться, будет полезна другим:

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 голосов
/ 16 марта 2011

Есть множество вариантов. Если вы запустите ?heatmap, вы увидите различные параметры, которые вы можете настроить. Возможно, проще всего установить Rowv=NA, который должен подавить переупорядочение строк, а затем передать в матрицу строки уже в нужном вам порядке. Но вы также можете вручную предоставить функцию кластеризации или дендрограммы через Rowv и hclustfun и т. Д.

2 голосов
/ 24 октября 2017

Я считаю, что этот пост может быть полезен:

Как R по умолчанию отображает строки порядка тепловых карт?

Возьмите следующую матрицу для примера:

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

Вы можете изменить порядок строк и столбцов с помощью параметров Rowv и Colv. Вы можете изменить порядок с этими как дендрограммы. Например, вы можете рассчитать ордер, используя функцию hclust, а затем передать его в heatmap как дендрограмму:

 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

Дает:

Тепловая карта Hclust

Функция тепловой карты по умолчанию использует один дополнительный шаг, однако, через параметр reorderfun = function(d, w) reorder(d, w), который переупорядочивает дендрограмму в максимально возможной степени, основываясь на среднем значении строки / столбца. Вы можете воспроизвести порядок по умолчанию с помощью этого дополнительного шага. Таким образом, чтобы получить тот же заказ, что и heatmap, вы можете сделать:

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

Что дает тот же вывод, что и просто heatmap(m):

Тепловая карта по умолчанию

В этом примере столбцы не переупорядочиваются, а строки. Наконец, чтобы просто получить порядок, вы можете присвоить тепловую карту переменной и получить вывод.

> p <- heatmap(m)
> p$rowInd
[1] 3 1 6 2 4 5 7
> p$colInd
[1] 6 4 5 1 2 3 7
2 голосов
/ 16 марта 2011

Я согласен с Джесси. Для вашей проблемы взгляните на аргументы Rowv, distfun и hclustfun функции heatmap. Для большего выбора могут быть полезны функции heatmap.2 в пакете gplots, heatmap_plus в пакете Heatplus и pheatmap в пакете pheatmap.

1 голос
/ 15 августа 2011

pheatmap позволит вам указать метод, который он использует для кластеризации, принимая те же аргументы, что и hclust.

...