选择R中热图2中树状图的叶节点数

时间:2014-07-23 19:36:48

标签: r heatmap dendrogram hclust dendextend

在Matlab中,您可以指定要作为dendrogram函数的一部分绘制的树形图中的节点数:dendrogram(tree,P)生成一个不超过P叶节点的树形图。

我尝试对R中的heatmap2进行同样的操作失败了。 stackoverflow和biostars的帖子建议使用cutree,但heatmap2卡在Rowv选项的帖子上。这里“TAD”是8列乘831行的数据矩阵。

# cluster it
hr <- hclust(dist(TAD, method="manhattan"), method="average")

# draw the heat map
heatmap.2(TAD, main="Hierarchical Cluster",
          Rowv=as.dendrogram(cutree(hr, k=5)),
          Colv=NA, dendrogram="row", col=my_palette, density.info="none", trace="none")

返回消息:

Error in UseMethod("as.dendrogram") : 
  no applicable method for 'as.dendrogram' applied to an object of class "c('integer', 'numeric')"

是否正在使用cutree探索绘制受限树状图的正确途径?有没有比matlab更简单的方法呢?

2 个答案:

答案 0 :(得分:0)

只是澄清并提供一些数据...... 我不想丢弃任何行;而不是绘制/解释831个分支,我想解释3个分支,因此希望行树形图被约束到3个分支(高度150)并且所有831行的相应热图要聚集到3个上部分支中原始树状图。

#Here is a random n=10 subset of my data; which for 10 observed fish has the %of time each spent within     
#a depth bin (Bin1-Bin8)

zz <- "ID Bin1 Bin2 Bin3 Bin4 Bin5 Bin6 Bin7 Bin8
1    0    0    0    0    0  0.0   0.0 100.0
2    0    0    0    0    0  0.0   0.0 100.0
3    0    0    0    0    0  0.0   0.0 100.0
4    0    0    0    0    0 70.8  29.2   0.0
5    0    0    0  100    0  0.0   0.0   0.0
6    0    0    0    0    0  0.0  93.3   6.7
7    0    0    0    0    0 27.5  72.5   0.0
8    0    0    0    0    0 53.5  46.5   0.0
9    0    0    0    0    0  0.0 100.0   0.0
10    0    0    0    0    0  0.0  72.1  27.9 "

TAD <- read.table(text=zz, header = TRUE)
IDnames <- TAD[,1]
x<-data.matrix(TAD[,2:ncol(TAD)])
rownames(x) <- IDnames

暂时不用担心热图,距离矩阵和hclustering是在数值矩阵x上完成的

TAD.dist <- dist(x, method="manhattan", diag=FALSE, upper=FALSE)
TAD.cluster <- hclust(TAD.dist, method="average", members=NULL)

这个结果树形图的图显示了所有十个分支,

plot(TAD.cluster)

但截止高度为150将限制为仅3个分支

hcd = as.dendrogram(TAD.cluster)
rowDend<- cut(hcd, h = 150)$upper
plot(rowDend)

用绘图(rowDend)绘制的树形图是我想在下面的热图的行树形图上看到的

heatmap.2 (x,
distfun = function(x) dist(x, method='manhattan', diag=FALSE, upper=FALSE),
hclustfun = function(x) hclust(x,method = 'average'),
dendrogram = "row",
#Rowv=rowDend, #this is where I thought I could restrain the row dendrogram
Colv="NA",
trace="none",
)

但是我找不到任何方法来限制热图中的行树形图以获得所需数量的可解释分支。绘制所有831个分支是非常混乱的。

答案 1 :(得分:0)

问题是当您编写“选择叶节点数”时,您的意思是什么。

heatmap.2中的Rowv参数需要树形图或TRUE / FALSE值。从帮助文件:

  

Rowv =确定是否以及如何重新排序行树形图。通过   默认情况下,它为TRUE,这意味着计算树状图并且   基于行方式重新排序。如果为NULL或FALSE,则没有树形图   计算并且没有重新排序。如果是树形图,则使用它   “原样”,即没有任何重新排序。如果是整数向量,那么   根据向量的顺序计算和重新排序树形图。

因此,当使用cutree(hr, k=5)时,您将获得一个整数向量(告诉您每个项目属于哪个群集,在产生5个群集的切割中)。在其上使用as.dendrogram将不会产生树形图,因此:Rowv=as.dendrogram(cutree(hr, k=5))会抛出错误。

如果您想突出显示树中的某些分支,为此,我邀请您查看dendextend package,了解哪种解决方案最适合您。以下是您可能要求的示例:

library(gplots)
data(mtcars) 
x  <- as.matrix(mtcars)

# now let's spice up the dendrograms a bit:
Rowv  <- x %>% dist %>% hclust %>% as.dendrogram %>%
   set("branches_k_color", k = 3) %>% set("branches_lwd", 4) %>%
   rotate_DendSer(ser_weight = dist(x))
Colv  <- x %>% t %>% dist %>% hclust %>% as.dendrogram %>%
   set("branches_k_color", k = 2) %>% set("branches_lwd", 4) %>%
   rotate_DendSer(ser_weight = dist(t(x)))

heatmap.2(x, Rowv = Rowv, Colv = Colv)

使用以下输出:

enter image description here

还要考虑最近发布的tutorial of dendextend ,您可能希望使用branches_attr_by_labels函数(在教程中,它位于以下部分:“基于调整分支在标签“)上,能够操纵树状图以创建如下图:

enter image description here

如果您想要删除节点,并且只留下一些节点,那么您应该只为数据子集创建热图。您还可以查看dendextend中的prune函数(用于查看较小树形图的一般用途),但如果您想将其用于热图,最好只使用相关的子集。数据