簡體   English   中英

手動創建樹狀圖:如何修復 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_obsN_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

更新

在我有更多時間后,我決定修復你的代碼。 我修改了treemerge條目。 這是重現您的樹狀圖的工作代碼的樣子:

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.

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