R で階層型クラスター分析を行った際、Dendrogram の一部のツリーのみ拡大する方法です。
まず、全体を描画します。
hca <- hclust(dist(USArrests)) plot(hca) rect.hclust(hca, k = 3, border = "red") rect.hclust(hca, h = 50, which = 7, border = "blue")
上図青枠(7番目)のツリーを取り出すには下記のようにします。
plot(cut(as.dendrogram(hca), h=50)$lower[[7]], main="Lower tree")
上位のツリーを取り出す場合は下記の通りです。
plot(cut(as.dendrogram(hca), h=50)$upper, main="Upper tree")
注目する個体がどこのクラスターに含まれているか、
例えば、高さ50で切ったとき、Kansasが7番目のクラスターに含まれるのを確認するには下記のようにします。
target.label <- "Kansas" h.val <- 50 ct <- cut(as.dendrogram(hca), h.val)$lower print(paste(h.val, "で切った場合のクラスター数:", length(ct)))
[1] "50 で切った場合のクラスター数: 9"
flag <- FALSE # ループ抜けフラグ leaf.len <- 1 # 下位のクラスター数 for(i in 1:length(ct)) { if(is.leaf(ct[[i]])) { # 分枝は個体1つ if(target.label == labels(ct[[i]])) { flag <- TRUE leaf.len <- 1 break } } else { ct.leafs <- cut(ct[[i]], h=0)$lower # 下位のツリーを取得 leaf.len <- length(ct.leafs) for(j in 1:leaf.len) { if(!is.na(match(target.label, labels(ct.leafs[[j]])))) { flag <- TRUE break } } } if(flag) break } print(paste(target.label, "のインデックス:",i,"-",j))
[1] "Kansas のインデックス: 7 - 10
Kansasは、7クラスタ目の10番目にあることが分かります。
再び下位のツリーを描画してみます。
plot(ct[[i]], main = paste("Hight:", hi, ", Branch:", i, ", Number of leafs:", leaf.len))
cut()関数で、cutree()関数同様、枝の数(k)を指定できると良かったのですが、
高さ(h)しか指定できないようです。
最近のコメント