R 中热图/聚类默认值的差异(热图与热图.2)?
Posted
技术标签:
【中文标题】R 中热图/聚类默认值的差异(热图与热图.2)?【英文标题】:differences in heatmap/clustering defaults in R (heatplot versus heatmap.2)? 【发布时间】:2013-07-29 06:57:11 【问题描述】:我正在比较两种在 R 中使用树状图创建热图的方法,一种是使用 made4
的 heatplot
,另一种是使用 gplots
的 heatmap.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.2
和heatplot
函数的主要区别如下:
heatmap.2,默认使用euclidean度量来获取距离矩阵和完整聚类方法,而heatplot使用correlation 和平均聚集法。
heatmap.2 计算距离矩阵并在缩放之前运行聚类算法,而 heatplot(当 dualScale=TRUE
时)聚类已经缩放的数据。
heatmap.2 根据行和列的平均值对树状图重新排序,如 here 所述。
通过提供自定义distfun
和hclustfun
参数,可以在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])
为了匹配热图函数的输出,我想提出两个解决方案:
我 - 为源代码添加新功能-> 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)?的主要内容,如果未能解决你的问题,请参考以下文章