Я сравниваю два способа создания тепловых карт с дендрограммами в 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")
Использование heatplot
дает:
heatplot(data)
очень разные результаты и масштабирование изначально. Результаты 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)
приводит к:
это делает dendrograms со стороны строки похожими, но столбцы по-прежнему различны, а также масштабы. Похоже, что heatplot
как-то по умолчанию масштабирует столбцы, что heatmap.2
не делает этого по умолчанию. Если я добавлю масштабирование строк в heatmap.2, я получаю:
heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave,scale="row")
который все еще не идентичен, но ближе. Как воспроизвести результаты 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")
любые идеи по этому поводу?