0

在 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?

4

2 回答 2

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 包,看看哪种解决方案最适合您。这是一个可能是您要求的示例:

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)

使用以下输出:

在此处输入图像描述

还可以考虑查看最近发布的 dendextend 教程,您可能希望使用该branches_attr_by_labels函数(在教程中它位于“基于标签调整分支”部分下),并能够操作树状图以创建诸如此类的图:

在此处输入图像描述

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

于 2014-08-19T19:18:45.587 回答
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

暂时不用担心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 个分支非常混乱。

于 2014-07-24T21:51:07.417 回答