R中热图/聚类默认设置的差异(heatplot与heatmap.2)有哪些?

30
我正在比较在R中创建带有树状图的热图的两种方法:一个是使用made4heatplot,另一个是使用heatmap.2中的gplots。适当的结果取决于分析,但我正在尝试理解为什么它们的默认值如此之不同,以及如何使这两个函数给出相同(或类似)的结果,以便我可以理解进入其中的所有“黑匣子”参数。
以下是示例数据和包:
require(gplots)
# made4 from bioconductor
require(made4)
data(khan)
data <- as.matrix(khan$train[1:30,])

使用heatmap.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)

导致结果如下: enter image description here 这使得行侧树状图看起来更相似,但列仍然不同,比例也不同。看起来heatplot默认情况下以某种方式缩放列,而heatmap.2默认情况下不会这样做。如果我在heatmap.2中添加行缩放,我会得到:
heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave,scale="row")

enter image description here

这张图片看起来并不完全一样,但更接近了。我如何使用heatmap.2重现heatplot的结果?它们之间有什么区别吗?

编辑2:关键的区别似乎在于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"),对此有什么想法吗?

1
е°қиҜ•еңЁжңҖеҗҺдёҖдёӘе‘Ҫд»Өдёӯж·»еҠ symbreaks=FALSEпјҢд»ҘиҺ·еҫ—зұ»дјјдәҺheatplotзҡ„зқҖиүІгҖӮдҪҶжҳҜеҲ—ж ‘зҠ¶еӣҫиҝҳйңҖиҰҒж”№иҝӣгҖӮ - harkmug
1
@rmk 谢谢,不确定我理解symbreaks的作用。关于列树状图上有何不同,您有什么想法吗? - user248237
1
symbreaks=FALSE 使得颜色不对称,就像在 heatplot 中看到的那样,0 值的颜色不是白色(仍然有点蓝色)。至于树状图,我认为 heatmap.2 可能做得更好。请注意,在 heatmap.2 中,EWS.T1 和 EWS.T6 是并排的,而在 heatplot 中,则是 EWS.T4 和 EWS.T6。前者的距离为 0.2,而后者的距离为 0.5。 - harkmug
1
@rmk:那这是heatplot的一个bug吗? - user248237
1
@rmk:差异可以通过heatplot内使用的distEisen函数来解释吗?不幸的是,我想不到一种方法来传递相关距离给heatplot,因为它只接受作为dist()参数的内容,而dist()没有相关距离。如果heatplot()接受相关距离,那么这将是可能的。 - user248237
显示剩余5条评论
1个回答

42
heatmap.2heatplot函数之间的主要区别如下:
  1. heatmap.2默认使用欧氏距离计算距离矩阵和complete的凝聚方法进行聚类,而heatplot分别使用相关性average的凝聚方法。

  2. heatmap.2在缩放之前计算距离矩阵并运行聚类算法,而heatplot(当dualScale=TRUE)则对已经缩放的数据进行聚类。

  3. heatmap.2基于行和列均值重新排列树形图,如此处所述。

可以通过提供自定义distfunhclustfun参数轻松更改heatmap.2中的默认设置(第1点)。但是,要解决第2点和第3点,则需要更改源代码。因此,heatplot函数作为heatmap.2的包装器。首先,它对数据应用必要的转换,计算距离矩阵,聚类数据,然后仅使用heatmap.2功能绘制带有上述参数的热图。

heatplot函数中的dualScale=TRUE参数仅适用于基于行的居中和缩放(描述)。然后,它将已缩放数据的极端值(描述)重新分配给zlim值:

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

为了与热图函数的输出相匹配,我想提出两种解决方案:

I - 在源代码中添加新功能 -> 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) 

图片描述


II-定义一个函数,提供所有heatmap.2所需的参数

如果您更喜欢使用原始的heatmap.2,则下面的zClust函数可以重现heatplot执行的所有步骤。它以列表格式提供了缩放后的数据矩阵、行和列谱系树。这些可以作为输入提供给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库。

2
非常好的、详细的回答。正是我所需要的。非常感谢! - yuk
3
我将此撰写成教程,并将TWL的zClust的扩展版本添加到一个软件包中:http://stanstrup.github.io/heatmaps/ - Jan Stanstrup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接