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

27 r cluster-analysis hierarchical-clustering heatmap bioconductor

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

这是示例数据和包:

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

使用heatmap.2对数据进行聚类得出:

heatmap.2(data, trace="none")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

使用heatplot给出:

heatplot(data)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最初的结果和缩放非常不同.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)
Run Code Online (Sandbox Code Playgroud)

导致: 在此输入图像描述

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

heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave,scale="row")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

它仍然不相同但更接近.我怎样才能重现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 = "")
}
Run Code Online (Sandbox Code Playgroud)

这就是我试图导入我的电话heatmap.2.我喜欢它的原因是因为它使低值和高值之间较大的反差,而只是路过zlim,以heatmap.2被简单地忽略.如何在保留沿列的聚类的同时使用这种"双重缩放"?我想要的是增加对比度:

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

与你得到的低对比度相比:

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

有什么想法吗?

TWL*_*TWL 40

heatmap.2heatplot功能之间的主要区别如下:

  1. heatmap.2,默认使用欧几里德测度来获得距离矩阵并完成聚类的聚集方法,而热图分别使用相关性平均聚集方法.

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

  3. heatmap.2重新排序基于行和列的平均值树状图,描述在这里.

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

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

z <- t(scale(t(data)))
zlim <- c(-3,3)
z <- pmin(pmax(z, zlim[1]), zlim[2])
Run Code Online (Sandbox Code Playgroud)

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

我 - 在源代码中添加新功能 -> 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) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


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)
Run Code Online (Sandbox Code Playgroud)

关于heatmap.2(3)功能的其他评论很少:

  • symbreak=TRUE应用缩放时建议使用.它将调整色标,因此它在0左右突破.在当前示例中,负值=蓝色,而正值=红色.
  • col=bluered(256) 可以提供替代的着色解决方案,它不需要RColorBrewer库.

  • 我把它写成教程,并将TWL的zClust的扩展版本添加到一个包中:http://stanstrup.github.io/heatmaps/ (3认同)
  • 完美的答案。正是我所需要的。非常感谢! (2认同)