【问题标题】:selecting number of leaf nodes of dendrogram in heatmap.2 in R在R中的heatmap.2中选择树状图的叶节点数
【发布时间】:2014-09-15 03:56:54
【问题描述】:

在 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的更简单的方法?

【问题讨论】:

  • 如果您也发布示例数据以制作完整的reproducible example,这会有所帮助。通常,每个休假对应于一行/列数据。你想删除那些与叶子无关的行/列吗?对于 heatmap.2,通常有 1:1 的对应关系。

标签: r heatmap dendrogram hclust dendextend


【解决方案1】:

只是为了澄清并提供一些数据... 我不想删除任何行;而不是绘制/解释 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

暂时不用担心heatmap,距离矩阵和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)

用 plot(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 个分支非常混乱。

【讨论】:

    【解决方案2】:

    问题是你写“选择叶子节点的数量”是什么意思。

    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)
    

    输出如下:

    考虑一下最近发布的tutorial of dendextend,您可能想要使用branches_attr_by_labels 函数(在教程中它位于“根据标签调整分支”部分下) ,具有操纵树状图以创建如下图的能力:

    如果您想要删除节点,只留下其中的几个进行绘制,您可能应该只为数据的子集创建热图。您还可以查看 dendextend 中的 prune 函数(用于查看较小的树状图的一般目的),但如果您想将其用于热图,最好只使用数据的相关子集。

    【讨论】:

    • 我正在运行您的示例,但出现此错误:Error: could not find function "%&gt;%" 我运行此:Rowv &lt;- x %&gt;% dist %&gt;% hclust %&gt;% as.dendrogram %&gt;% set("branches_k_color", k = 3) %&gt;% set("branches_lwd", 4) %&gt;% rotate_DendSer(ser_weight = dist(x))
    • 我能做些什么来修复它?而且dendextend教程的链接也失效了。
    猜你喜欢
    • 2021-12-23
    • 2014-01-29
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多