如何在 heatmap.2 中展开树状图
Posted
技术标签:
【中文标题】如何在 heatmap.2 中展开树状图【英文标题】:How to expand the dendogram in heatmap.2 【发布时间】:2014-03-25 20:15:34 【问题描述】:我有以下带有树状图的热图。
完整数据为here。
问题是左边的树状图被压扁了。如何在不改变热图列大小的情况下解压(展开)它?
它是用这段代码生成的:
#!/usr/bin/Rscript
library(gplots);
library(RColorBrewer);
plot_hclust <- function(inputfile,clust.height,type.order=c(),row.margins=70)
# Read data
dat.bcd <- read.table(inputfile,na.strings=NA, sep="\t",header=TRUE);
rownames(dat.bcd) <- do.call(paste,c(dat.bcd[c("Probes","Gene.symbol")],sep=" "))
dat.bcd <- dat.bcd[,!names(dat.bcd) %in% c("Probes","Gene.symbol")]
dat.bcd <- dat.bcd
# Clustering and distance function
hclustfunc <- function(x) hclust(x, method="complete")
distfunc <- function(x) dist(x,method="maximum")
# Select based on FC, as long as any of them >= anylim
anylim <- 2.0
dat.bcd <- dat.bcd[ apply(dat.bcd, 1,function(x) any (x >= anylim)), ]
# Clustering functions
height <- clust.height;
# Define output file name
heatout <- paste("tmp.pafc.heat.",anylim,".h",height,".pdf",sep="");
# Compute distance and clusteirn function
d.bcd <- distfunc(dat.bcd)
fit.bcd <- hclustfunc(d.bcd)
# Cluster by height
#cutree and rect.huclust has to be used in tandem
clusters <- cutree(fit.bcd, h=height)
nofclust.height <- length(unique(as.vector(clusters)));
myorder <- colnames(dat.bcd);
if (length(type.order)>0)
myorder <- type.order
# Define colors
#hmcols <- rev(brewer.pal(11,"Spectral"));
hmcols <- rev(redgreen(2750));
selcol <- colorRampPalette(brewer.pal(12,"Set3"))
selcol2 <- colorRampPalette(brewer.pal(9,"Set1"))
sdcol= selcol(5);
clustcol.height = selcol2(nofclust.height);
# Plot heatmap
pdf(file=heatout,width=20,height=50); # for FC.lim >=2
heatmap.2(as.matrix(dat.bcd[,myorder]),Colv=FALSE,density.info="none",lhei=c(0.1,4),dendrogram="row",scale="row",RowSideColors=clustcol.height[clusters],col=hmcols,trace="none", margin=c(30,row.margins), hclust=hclustfunc,distfun=distfunc,lwid=c(1.5,2.0),keysize=0.3);
dev.off();
#--------------------------------------------------
# ENd of functions
#--------------------------------------------------
plot_hclust("http://pastebin.com/raw.php?i=ZaGkPTGm",clust.height=3,row.margins=70);
【问题讨论】:
你所说的 squiished 到底是什么意思? 大部分的树状图,我们看不清楚树的高度。 这不是因为大多数节点之间的关系比最底层的节点更密切吗?要“解压”树状图中“压扁”的部分,似乎需要进一步扩展已经未被压扁的区域。否则高度不再是相对的。也许您可以缩放高度(例如sqrt
),以使较大的值更接近大多数值,但这可能会导致树的误导。或者,使整个情节更宽。
【参考方案1】:
在您的情况下,数据有长尾,这是基因表达数据(对数正态)的预期。
data <- read.table(file='http://pastebin.com/raw.php?i=ZaGkPTGm',
header=TRUE, row.names=1)
mat <- as.matrix(data[,-1]) # -1 removes the first column containing gene symbols
从分位数分布可以看出,表达量最高的基因将范围从1.5扩展到300以上。
quantile(mat)
# 0% 25% 50% 75% 100%
# 0.000 0.769 1.079 1.544 346.230
当对未缩放数据执行层次聚类时,生成的树状图可能会显示出对具有最高表达式的值的偏差,如您的示例所示。在许多 (reference) 中,这需要对数或 z 分数转换。您的数据集包含values == 0
,这是对数转换的问题,因为log(0)
未定义。
Z-score 转换 (reference) 在heatmap.2
中实现,但需要注意的是,该函数在缩放数据之前计算距离矩阵并运行聚类算法。因此,scale='row'
选项不会影响聚类结果,有关详细信息,请参阅我之前的帖子 (differences in heatmap/clustering defaults in R)。
我建议您在运行heatmap.2
:之前扩展您的数据:
# scale function transforms columns by default hence the need for transposition.
z <- t(scale(t(mat)))
quantile(z)
# 0% 25% 50% 75% 100%
# -2.1843994 -0.6646909 -0.2239677 0.3440102 2.2640027
# set custom distance and clustering functions
hclustfunc <- function(x) hclust(x, method="complete")
distfunc <- function(x) dist(x,method="maximum")
# obtain the clusters
fit <- hclustfunc(distfunc(z))
clusters <- cutree(fit, 5)
# require(gplots)
pdf(file='heatmap.pdf', height=50, width=10)
heatmap.2(z, trace='none', dendrogram='row', Colv=F, scale='none',
hclust=hclustfunc, distfun=distfunc, col=greenred(256), symbreak=T,
margins=c(10,20), keysize=0.5, labRow=data$Gene.symbol,
lwid=c(1,0.05,1), lhei=c(0.03,1), lmat=rbind(c(5,0,4),c(3,1,2)),
RowSideColors=as.character(clusters))
dev.off()
另外,请参阅附加帖子 here 和 here,其中解释了如何通过 lmat
、lwid
和 lhei
参数设置热图的布局。
生成的热图如下所示(省略行和列标签):
【讨论】:
谢谢一百万。最后一个问题,z <- t(scale(t(mat)))
这里的 scale 函数和 Z-score 变换是一样的吧?
@pdubois,不客气。是的,scale
应用 z 分数转换。请参阅creating z-scores in R 上的这篇文章。注意它在输入矩阵上的用法:row-based 转换t(scale(t(mat)))
,或column-based 转换scale(mat)
。关注the use of z-scores 上的这篇文章,可视化基因表达的变化。【参考方案2】:
据我所知,您的数据集中可能有一些异常值(最底部的对象)。请尝试以下操作:
-
从数据集中删除异常值
对数标度您的距离,以减少对极端值的重视
【讨论】:
【参考方案3】:使用 'scale' 参数使用 'fheatmap' 包可以轻松转换 Zscore。查看“fheatmap”包。树状图的高度可以通过增加画布(pdf)的宽度来扩展。 http://cran.r-project.org/web/packages/fheatmap/index.html
【讨论】:
以上是关于如何在 heatmap.2 中展开树状图的主要内容,如果未能解决你的问题,请参考以下文章
如何手动创建树状图(或“hclust”)对象? (在 R 中)