簡體   English   中英

在R中的熱圖2中選擇樹狀圖的葉節點數

[英]selecting number of leaf nodes of dendrogram in heatmap.2 in R

在Matlab中,您可以指定要繪制的樹狀圖中的節點數量,作為dendrogram功能的一部分: dendrogram(tree,P)生成的樹狀圖最多可以包含P個葉節點。

我對R中的heatmap2進行相同操作的嘗試慘遭失敗。 stackoverflow和生物之星的帖子已建議使用cutreeheatmap2Rowv選項的帖子建議所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?

只是為了澄清並提供一些數據...我不想刪除任何行; 而不是繪制/解釋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

暫時無需擔心熱圖,距離矩陣和聚類在數值矩陣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個分支非常混亂。

問題是當您編寫“選擇葉節點的數量”時是什么意思。

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功能(在本教程中它是根據部分:“調整基於標簽的分支”),與操縱系統樹創建地塊的能力,例如這個:

在此處輸入圖片說明

如果要刪除節點,而只留下幾個要繪制的節點,則可能應該只為數據的一個子集創建熱圖。 您還可以查看dendextend中的prune函數(通常用於查看較小的樹狀圖),但是如果您想將其用於熱圖,最好只處理數據的相關子集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM