Подтвердить что ты не робот

Различия в значениях температуры/кластеризации по умолчанию в R (тепловая схема по сравнению с тепловой схемой 2)?

Я сравниваю два способа создания тепловых карт с дендрограммами в R, один с made4 heatplot и один с gplots of heatmap.2. Соответствующие результаты зависят от анализа, но я пытаюсь понять, почему значения по умолчанию настолько разные, и как заставить обе функции давать одинаковый результат (или очень похожий результат), чтобы я понял все параметры "черного ящика", которые идут в это.

Это пример данных и пакетов:

require(gplots)
# made4 from bioconductor
require(made4)
data(khan)
data <- as.matrix(khan$train[1:30,])

Кластеризация данных с помощью тепловой карты 2 дает:

heatmap.2(data, trace="none")

enter image description here

Использование heatplot дает:

heatplot(data)

enter image description here

очень разные результаты и масштабирование изначально. Результаты heatplot выглядят более разумными в этом случае, поэтому я хотел бы понять, какие параметры нужно подавать в heatmap.2, чтобы заставить его делать то же самое, поскольку heatmap.2 имеет другие преимущества/функции, которые я хотел бы использовать, и потому что Я хочу понять недостающие ингредиенты.

heatplot использует среднюю привязку с расстоянием корреляции, поэтому мы можем передать это в heatmap.2, чтобы обеспечить аналогичную кластеризацию (на основе: https://stat.ethz.ch/pipermail/bioconductor/2010-August/034757.html)

dist.pear <- function(x) as.dist(1-cor(t(x)))
hclust.ave <- function(x) hclust(x, method="average")
heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave)

приводит к: enter image description here

это делает dendrograms со стороны строки похожими, но столбцы по-прежнему различны, а также масштабы. Похоже, что heatplot как-то по умолчанию масштабирует столбцы, что heatmap.2 не делает этого по умолчанию. Если я добавлю масштабирование строк в heatmap.2, я получаю:

heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave,scale="row")

enter image description here

который все еще не идентичен, но ближе. Как воспроизвести результаты heatplot с помощью heatmap.2? В чем отличия?

edit2: кажется, что ключевое различие заключается в том, что heatplot выполняет пересканирование данных с помощью обеих строк и столбцов, используя:

if (dualScale) {
    print(paste("Data (original) range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
    data <- t(scale(t(data)))
    print(paste("Data (scale) range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
    data <- pmin(pmax(data, zlim[1]), zlim[2])
    print(paste("Data scaled to range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
}

это то, что я пытаюсь импортировать в свой вызов heatmap.2. Причина, по которой мне это нравится, заключается в том, что она делает контрасты больше между низкими и высокими значениями, тогда как просто передача zlim в heatmap.2 просто игнорируется. Как я могу использовать это "двойное масштабирование" при сохранении кластеризации по столбцам? Все, что я хочу - это повышенный контраст, с которым вы сталкиваетесь:

heatplot(..., dualScale=TRUE, scale="none")

по сравнению с низким контрастом, с которым вы получаете:

heatplot(..., dualScale=FALSE, scale="row")

любые идеи по этому поводу?

4b9b3361

Ответ 1

Основные отличия между функциями heatmap.2 и heatplot заключаются в следующем:

  • heatmap.2, по умолчанию используется меру евклидовой, чтобы получить матрицу расстояний и полный метод агломерации для кластеризации, тогда как тепловой план использует корреляцию и средний агломерационный метод, соответственно.

  • heatmap.2 вычисляет матрицу расстояний и запускает алгоритм кластеризации до масштабирования, тогда как массивы Heatplot (when dualScale=TRUE) уже масштабируют данные.

  • heatmap.2 переупорядочивает дендрограмму на основе средних значений строк и столбцов, как описано здесь.

Настройки по умолчанию (стр. 1) можно просто изменить в heatmap.2, предоставив пользовательские аргументы distfun и hclustfun. Однако с. 2 и 3 не могут быть легко решены без изменения исходного кода. Поэтому функция heatplot действует как обертка для тепловой карты. Во-первых, он применяет необходимое преобразование к данным, вычисляет матрицу расстояний, кластеризует данные, а затем использует функцию heatmap.2 только для построения тепловой карты с указанными выше параметрами.

Аргумент dualScale=TRUE в функции Heatplot применяется только к центрированию и масштабированию по строке (описание). Затем он переназначает крайности (описание) масштабированных данных в значения zlim:

z <- t(scale(t(data)))
zlim <- c(-3,3)
z <- pmin(pmax(z, zlim[1]), zlim[2])

Чтобы соответствовать выходному сигналу функции теплового модуля, я хотел бы предложить два решения:

я - добавить новую функциональность в исходный код -> heatmap.3

Код можно найти здесь. Не стесняйтесь просматривать изменения, чтобы увидеть изменения, внесенные в функцию heatmap.2. Итак, я представил следующие варианты:

  • преобразование z-score выполняется до кластеризации: scale=c("row","column")
  • крайние значения могут быть переназначены в масштабированных данных: zlim=c(-3,3)
  • опция отключения переупорядочения дендрограмм: reorder=FALSE

Пример:

# require(gtools)
# require(RColorBrewer)
cols <- colorRampPalette(brewer.pal(10, "RdBu"))(256)

distCor <- function(x) as.dist(1-cor(t(x)))
hclustAvg <- function(x) hclust(x, method="average")

heatmap.3(data, trace="none", scale="row", zlim=c(-3,3), reorder=FALSE,
          distfun=distCor, hclustfun=hclustAvg, col=rev(cols), symbreak=FALSE) 

enter image description here


II - определить функцию, которая предоставляет все необходимые аргументы для heatmap.2

Если вы предпочитаете использовать исходную тепловую карту .2, функция zClust (ниже) воспроизводит все шаги, выполняемые тепловым экраном. Он предоставляет (в формате списка) масштабированные матрицы данных, строки и столбцы дендрограммы. Они могут использоваться как вход для функции heatmap.2:

# depending on the analysis, the data can be centered and scaled by row or column. 
# default parameters correspond to the ones in the heatplot function. 
distCor <- function(x) as.dist(1-cor(x))
zClust <- function(x, scale="row", zlim=c(-3,3), method="average") {
    if (scale=="row") z <- t(scale(t(x)))
    if (scale=="col") z <- scale(x)
    z <- pmin(pmax(z, zlim[1]), zlim[2])
    hcl_row <- hclust(distCor(t(z)), method=method)
    hcl_col <- hclust(distCor(z), method=method)
    return(list(data=z, Rowv=as.dendrogram(hcl_row), Colv=as.dendrogram(hcl_col)))
}

z <- zClust(data)

# require(RColorBrewer)
cols <- colorRampPalette(brewer.pal(10, "RdBu"))(256)

heatmap.2(z$data, trace='none', col=rev(cols), Rowv=z$Rowv, Colv=z$Colv)

Несколько дополнительных комментариев относительно функциональности heatmap.2(3):

  • symbreak=TRUE рекомендуется при масштабировании. Он будет корректировать цветовую гамму, поэтому она разрывается на 0. В текущем примере отрицательные значения = синий, а положительные значения = красный.
  • col=bluered(256) может предоставить альтернативное решение для раскраски и не требует библиотеки RColorBrewer.