【发布时间】: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()有一个相关距离是可能的
标签: r cluster-analysis heatmap hierarchical-clustering bioconductor