[英]How to draw plot.dendrogram with labels at different levels (like plot.hclust)?
[英]Creating dendrograms manually: how to fix “'merge' matrix has invalid contents” in plot.hclust?
我正在手動創建一個hclust
object (即創建一個包含所需插槽的列表,然后將其 class 更改為hclust
)。 合並模式、分叉高度、葉節點的排序和葉節點的標簽是已知的。 我的目標(和測試方法)是 plot 得到的樹狀圖。 我無法使用我的參數創建可繪制的hclust
object。
hclust object 的組件在此處的hclust
hclust
文檔中進行了描述(請參閱值部分)。
以下是我用來生成的R
代碼和我的樹狀圖 plot 的可重現塊。
tree <- list()
tree$merge <- matrix(c( -1, -7, # row 1
-2, -6, # row 2
-3, -12, # row 3
-4, -14, # row 4
-5, -8, # row 5
-9, -11, # row 6
-13, -20, # row 7
-15, -19, # row 8
1, 8, # row 9
2, 5, # row 10
3, 6, # row 11
2, -18, # row 12
1, 3, # row 13
2, 4, # row 14
-10, 7, # row 15
-16, -17, # row 16
1, 2, # row 17
15, 16, # row 18
1, 15), # row 19
ncol = 2,
byrow = TRUE)
tree$height <- c(0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.11167131, 0.11167131, 0.11167131, 0.12832304, 0.17304035, 0.17304035, 0.17304035, 0.17304035, 0.22965349, 0.22965349, 0.23334799)
tree$labels <- as.character(1:20)
tree$order <- c(1, 7, 15, 19, 3, 12, 9, 11, 2, 6, 5, 8, 18, 4, 14, 13, 20, 10, 16, 17)
class(tree) <- "hclust"
plot(tree)
tree$merge
矩陣的每一行對應一個分岔。 負整數是指葉節點的索引,而正整數是指按tree$merge
中的行索引的現有集群。
運行代碼會導致以下錯誤消息。
Error in plot.hclust(tree) : 'merge' matrix has invalid contents
預期結果的草圖如下圖所示, heights
值由額外的虛線標記。 (該圖未按比例繪制。)
hclust
樹的有效性由.validity.hclust
function 檢查。 它的源代碼在這里給出。 查看第 121-135 行。
您收到錯誤意味着您的樹由於其merge
矩陣而無效。 它具有非唯一元素(例如,1 和 2)。 在正確構造的merge
矩陣中,所有條目都是唯一的,並且從-N_obs
到N_obs-2
(不包括零),其中N_obs
是(正)觀察數。 這通過代碼中的以下if
測試進行檢查:
if(identical(sort(as.integer(merge)), c(-(n:1L), +seq_len(n-2L))))
TRUE
else
"'merge' matrix has invalid contents"
從hclust
的參考:
合並一個 n - 1 × 2 矩陣。
合並的第 i 行描述了聚類步驟 i 中聚類的合並。 如果行中的元素 j 為負,則在此階段合並觀察 - j。 如果 j 為正,則合並是與在算法的(早期)階段 j 形成的集群。 因此,合並中的負條目表示單例的聚集,而正的條目表示非單例的聚集。
所有負數都是單例(觀察),正數是現有集群的合並,指的是算法的合並步驟。
因此,請修改您的hclust
object。 下面是一些代碼,可以讓您了解正確的hclust
object 的樣子:
iris2 <- iris[1:20,-5]
species_labels <- iris[,5]
d_iris <- dist(iris2)
tree_iris <- hclust(d_iris, method = "complete")
仔細看看tree_iris$merge
。
更新
在我有更多時間后,我決定修復你的代碼。 我修改了tree
的merge
條目。 這是重現您的樹狀圖的工作代碼的樣子:
tree <- list()
tree$merge <- matrix(c( -1, -7, # row 1
-2, -6, # row 2
-3, -12, # row 3
-4, -14, # row 4
-5, -8, # row 5
-9, -11, # row 6
-13, -20, # row 7
-15, -19, # row 8
1, 8, # row 9: 1,7,15,19
2, 5, # row 10: 2,6,5,8
3, 6, # row 11: 3,12,9,11
10, -18, # row 12: 2,6,5,8 + 18
9, 11, # row 13: 1,7,15,19 + 3,12,9,11
12, 4, # row 14: row 12 + row 4
-10, 7, # row 15: row 7 + 10
-16, -17, # row 16
13, 14, # row 17: row 13 + row 14
15, 16, # row 18: row 15 + row 16
17, 18), # row 19: row 17 + row 18
ncol = 2,
byrow = TRUE)
tree$height <- c(0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.06573653, 0.11167131, 0.11167131, 0.11167131, 0.12832304, 0.17304035, 0.17304035, 0.17304035, 0.17304035, 0.22965349, 0.22965349, 0.23334799)
tree$labels <- as.character(1:20)
tree$order <- c(1, 7, 15, 19, 3, 12, 9, 11, 2, 6, 5, 8, 18, 4, 14, 13, 20, 10, 16, 17)
class(tree) <- "hclust"
plot(tree)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.