我正在比较两种在 R 中使用树状图创建热图的方法,一种是made4
's heatplot
,另一种是gplots
of 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")
这仍然不相同,但更接近。我怎样才能重现heatplot
's 结果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 = "")
}
这就是我要导入到我对heatmap.2
. 我喜欢它的原因是因为它使低值和高值之间的对比度更大,而只是传递zlim
给heatmap.2
被简单地忽略了。如何在保留沿列的聚类的同时使用这种“双重缩放”?我想要的只是增加对比度:
heatplot(..., dualScale=TRUE, scale="none")
与您获得的低对比度相比:
heatplot(..., dualScale=FALSE, scale="row")
对此有什么想法吗?