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)しか指定できないようです。





最近のコメント