R 中热图/聚类默认值的差异(热图与热图.2)?

Posted

技术标签:

【中文标题】R 中热图/聚类默认值的差异(热图与热图.2)?【英文标题】:differences in heatmap/clustering defaults in R (heatplot versus heatmap.2)? 【发布时间】:2013-07-29 06:57:11 【问题描述】:

我正在比较两种在 R 中使用树状图创建热图的方法,一种是使用 made4heatplot,另一种是使用 gplotsheatmap.2。适当的结果取决于分析,但我试图理解为什么默认值如此不同,以及如何让两个函数给出相同的结果(或高度相似的结果),以便我理解所有的“黑盒”参数进入这个。

这是示例数据和包:

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)

导致:

这使得行侧树状图看起来更相似,但列仍然不同,比例也不同。看来heatplot 默认情况下会以某种方式缩放列,而heatmap.2 默认情况下不会这样做。如果我向 heatmap.2 添加行缩放,我得到:

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

这仍然不相同,但更接近。如何使用heatmap.2 重现heatplot 的结果?有什么区别?

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

对此有什么想法吗?

【问题讨论】:

在最后一个命令中,尝试添加symbreaks=FALSE 以获得与heatplot 相似的颜色。列树状图仍然需要工作。 @rmk 谢谢,但我不确定我是否理解symbreaks 的作用。关于col dendrogram差异的任何想法? symbreaks=FALSE 使颜色不对称,如 heatplot 中所示,其中 0 值不是白色(仍然有点蓝色)。至于树状图,我认为heatamap.2 可能是正确的。请注意,在 heatmap.2 中,EWS.T1 和 EWS.T6 是并排的,而在 heatplot 中,它的 EWS.T4 和 EWS.T6 是并排的。前者的距离为 0.2,而后者的距离为 0.5。 @rmk: 那么这是heatplot 中的错误吗? @rmk: 可以用heatplot 内部使用的distEisen 函数来解释差异吗?不幸的是,我想不出一种方法来传递heatplot 相关距离,因为它只需要dist() 的参数,而dist() 没有相关距离。如果heatplot() 有一个相关距离是可能的 【参考方案1】:

heatmap.2heatplot 函数的主要区别如下:

    heatmap.2,默认使用euclidean度量来获取距离矩阵和完整聚类方法,而heatplot使用correlation平均聚集法。

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

    heatmap.2 根据行和列的平均值对树状图重新排序,如 here 所述。

通过提供自定义distfunhclustfun 参数,可以在heatmap.2 中简单地更改默认设置(第1 页)。然而 p。如果不更改源代码,则无法轻松解决 2 和 3 问题。因此heatplot 函数充当 heatmap.2 的包装器。首先,它对数据进行必要的转换,计算距离矩阵,对数据进行聚类,然后使用 heatmap.2 功能仅使用上述参数绘制热图。

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

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

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

我 - 为源代码添加新功能-&gt; heatmap.3

代码可以在here找到。随意浏览修订以查看对 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) 功能的一些额外的 cmets:

应用缩放时建议使用symbreak=TRUE。它将调整色阶,因此它会在 0 附近中断。在当前示例中,负值 = 蓝色,而正值 = 红色。 col=bluered(256) 可能会提供另一种着色解决方案,它不需要 RColorBrewer 库。

【讨论】:

伟大而完整的答案。正是我需要的。非常感谢! 我将其作为教程编写,并将 TWL 的 zClust 的扩展版本添加到包中:stanstrup.github.io/heatmaps

以上是关于R 中热图/聚类默认值的差异(热图与热图.2)?的主要内容,如果未能解决你的问题,请参考以下文章

DEG聚类分析热图怎么看?

R 聚类热图-数据的标准化

热图绘制

不用R语言!用它也能轻松搞定聚类热图绘制(软件安装包+使用手册)

用R包中heatmap画热图

R数据可视化5:热图Heatmap