5.1 クラスタリングと樹状図 .1 階層的クラスタリング hclust()
5.1.4 一般的なデンドログラム構造 "dendrogram"
クラス
"dendrogram"
用の関数は,木構造を処理する一般的な関数を与える.階層的 クラスタリングや分類/回帰木を対象とする同様の関数の代替物として,木のプロットや 切断に対する共通のエンジンとなることを目指している.コードは依然テスト段階で,将 来変更される可能性がある.書式:
as.dendrogram(object, ...)
as.dendrogram(object, hang = -1, ...) #
クラスhclus
に対するS3
メソッド#
クラスdendrogram
に対するS3
メソッドplot(x, type = c("rectangle", "triangle"), center = FALSE,
edge.root = is.leaf(x) || !is.null(attr(x,"edgetext")), nodePar = NULL, edgePar = list(),
leaflab = c("perpendicular", "textlike", "none"),
dLeaf = NULL, xlab = "", ylab = "", xaxt = "n", yaxt = "s", horiz = FALSE, frame.plot = FALSE, ...)
cut(x, h, ...) #
クラスdendrogram
に対するS3
メソッドprint(x, digits, ...) #
クラスdendrogram
に対するS3
メソッドrev(x) #
クラスdendrogram
に対するS3
メソッド#
クラスdendrogram
に対するS3
メソッドstr(object, max.level = NA, digits.d = 3,
give.attr = FALSE, wid = getOption("width"), nest.lev = 0, indent.str = "", stem = "--", ...) is.leaf(object)
引数:
object
クラスdendrogram
のいずれかに変換できる任意のR
オブジェクトx
クラスdendrogram
のオブジェクトhang
数値スカラ関数で,親の高さから枝の高さを計算する.plot.hclust()
を見よtype
プロットタイプcenter
論理値.TRUE
ならノードは枝中の葉に関して中央位置にプロットされる.さもなければ
(
既定値)
全ての直接の子ノードの中間にプロットするedge.root
論理値.もしTRUE
なら,ルートノードに向かって辺を引くnodePar
ノードに対して使われるプロットパラメータのリスト( points
を見よ)
.既 定値のNULL
はノード位置にシンボルを描かない.リストは名前付きの成分pch, cex, col
そして(
もしくは) bg
を持つ.各々は内部ノードと葉に対する二つの別 個の属性を指示するために長さが2
であっても良いedgePar
エッジの線分と(
もしedgetext
があれば)
そのラベルに対して使われるプ ロット用パラメータのリスト.リストは名前付きの成分col,(
線分に対する)
lty
とlwd, p.col
,(
テキスト周りの多角形用の) p.lwd
とp.lty
そしてテキストの色用の
t.col
を含んで良い.nodePar
に対するのと同様に,各々は葉と内 部のノードを区別するために長さが2
であって良いleaflab
葉のラベルを指定する文字列.既定の"perpendicular"
はテキストを垂直 に書く."textlike"
はテキストを矩形内で水平に書く.そして,"none"
は葉 のラベルを書かないdLeaf
葉の頂点とそのラベル間のユーザ座標での距離を指定する数.もし既定のNULL
ならば文字幅もしくは高さの
3/4
が使われるhoriz
論理値で,樹状図を水平に描くかどうかを指示するframe.plot
論 理 値 で ,プ ロ ッ ト の 周 囲 に 枠 を 描 く か ど う か を 指 示 す る .plot.default
を見よh
木がカットされる高さ位置...,xlab,ylab,xaxt,yaxt
作画パラメータ,もしくは他のメソッドへの引き数digits
出力時の精度を指定する整数.print.default
を見よmax.level,digits.d,give.attr,wid,nest.lev,indent.str str()
へ の 引 数 .str.default()
を 見 よ .give.attr=FALSE
と し て も ,各 ノ ー ド に 対 す るheight
とmembers
属性は依然として示されるstem
各デンドログラムの枝に対して使う幹を指定する,str()
に対して使われる文 字列樹状図は直接に入れ子リストとして表現されており,各成分は木の枝に相当する.した がって,木
z
の最初の枝はz[[1]]
であり,対応する副木の二番目の枝はz[[1]][[2]]
である,等々.各ノードは,プロットと,性質による分割を効率的に行うため,幾つかの 情報を所持しているが,
members, height
そして葉に対するleaf
だけが必須である.members
枝中の葉の総数height
ノードがプロットされる高さである非負の数値midpoint
枝 の 左 端 し か ら の ノ ー ド の 数 値 距 離 .こ れ は 少 な く と もplot(*,center=FALSE)
に対して必要であるlabel
文字列.ノードのラベルx.member cut()$upper
に対して,「前の」メンバーの数.より一般的には,水平(
horiz=FALSE
の時,さもなければ垂直)
方向の整列に対して使われるmember
成 分に対する代入物edgetext
文字列.ノードヘ向かう辺に対するラベルnodePar
点のプロットに対するノード固有の特性を指定する長さ1
のベクトルの名前付きリスト.上の
nodePar
引き数を見よedgePar
長さ1
の成分からなる名前付きリスト.ノードへ向かう辺のプロットに対する属性を指定し,もしあれば
edgetext
を書く.上のedgePar
引き数を見よleaf
論理値.もしTRUE
ならノードは木の葉になるcut.dendrogram()
成分upper
とlower
を持つリストを返す.前者は元の木の簡略 版でやはりクラスdendrogram
.後者は木を分割して得られた枝を持つリスト で,各枝はクラスdendrogram
cut.dendrogram()
は成分upper
とlower
を持つリストを返す.最初の成分は元の 木の簡略版であり,やはりクラス"dendrogram"
である.後者は木を切断して得られた 枝からなるリストで,それぞれデンドログラムである."dendrogram"
オブジェクトにはstr
メソッドがある.最初のもの(
抜きだし)
は副枝の選択によりクラスが保存されることを保証する.クラス
"hclust"
のオブジェクトはメソッド関数as.dendrogram()
を用いてクラス"dendrogram"
に変換できる.rev.dendrogram()
は 単 に デ ン ド ロ グ ラ ムx
の ノ ー ド を 逆 転 し た も の を 返 す(reorder.dendrogram()
を参照せよ)
.is.leaf(object)
はobject
が葉(
もっとも簡単なデンドログラム)
かどうかをテス トする.plotNode()
とplotNodeLimit()
は補助関数である.警告:プロットを含むデンドログラムの操作は再帰的手順を使うため,特に深い木構造に 対しては
options("expressions")
を増やす必要があるかも知れない.このためには,C
のスタックサイズをOS
の既定値よりも大きめに設定することが必要とされる可能性 が高い(
これができるかどうかはOS
依存で,Windows
では不可)
.注意:
type="triangle"
を使う際はcenter=TRUE
を使う方が普通見栄えが良くなる.関連:デンドログラムの
labels
メソッドに関してはorder.dendrogram()
.# 樹状図に対するメソッド.米国の犯罪検挙率データUSArrests使用
> hc <- hclust(dist(USArrests), "ave") # 階層的クラスタリング
> (dend1 <- as.dendrogram(hc)) # 樹状図に変換しプロット
’dendrogram’ with 2 branches and 50 members total, at height 152.314
> str(dend1) # str()メソッド.dend1の全構造
--[dendrogram w/ 2 branches and 50 members at h = 152]
|--[dendrogram w/ 2 branches and 16 members at h = 77.6]
| |--[dendrogram w/ 2 branches and 2 members at h = 38.5]
| | |--leaf "Florida"
| | ‘--leaf "North Carolina"
(以下省略)
> str(dend1, max = 2) # 最初の2つの副レベルだけ表示
--[dendrogram w/ 2 branches and 50 members at h = 152]
|--[dendrogram w/ 2 branches and 16 members at h = 77.6]
| |--[dendrogram w/ 2 branches and 2 members at h = 38.5] ..
| ‘--[dendrogram w/ 2 branches and 14 members at h = 44.3] ..
‘--[dendrogram w/ 2 branches and 34 members at h = 89.2]
|--[dendrogram w/ 2 branches and 14 members at h = 44.8] ..
‘--[dendrogram w/ 2 branches and 20 members at h = 54.7] ..
# 見掛けを様々に変える(次の図を参照)
> plot(dend1)
# "triangle"タイプで,内部ノードも表示
> plot(dend1, nodePar=list(pch = c(1,NA), cex=0.8, lab.cex = 0.8), type = "t", center=TRUE)
> plot(dend1, edgePar=list(col = 1:2, lty = 2:3), dLeaf=1, edge.root = TRUE)
> plot(dend1, nodePar=list(pch = 2:1,cex=.4*2:1, col = 2:3), horiz=TRUE)
> dend2 <- cut(dend1, h=70) # 高さ70でカットした樹状図(次の図を参照)
> plot(dend2$upper)
> plot(dend2$upper, nodePar=list(pch = c(1,7), col = 2:1)) # 水平方向の葉が変
# dend2$lowerはデンドログラムでなく,リスト
> plot(dend2$lower[[3]], nodePar=list(col=4), horiz = TRUE, type = "tr")
# "inner","leaf"エッジを異なったタイプと色で
> plot(dend2$lower[[2]], nodePar=list(col=1),# non empty list edgePar = list(lty=1:2, col=2:1), edge.root=TRUE)
# 次の図を参照
> nP <- list(col=3:2, cex=c(2.0, 0.75), pch= 21:22, bg= c("light blue", "pink"),
lab.cex = 0.75, lab.col = "tomato")
> par(mfrow= c(2,2), mar = c(5,2,1,4))
> plot(d3, nodePar= nP, edgePar = list(col="gray", lwd=2), horiz = TRUE)
> addE <- function(n) { # 補助関数定義
if(!is.leaf(n)) { # leafでなければ属性"edgePar","edgetext"を追加 attr(n, "edgePar") <- list(p.col="plum")
attr(n, "edgetext") <- paste(attr(n,"members"),"members") }
n }
> d3e <- dendrapply(d3, addE) # d3のノードに再帰的に関数addE()を適用
> plot(d3e, nodePar= nP)
> plot(d3e, nodePar= nP, leaflab = "textlike")
050100150 FloridaNorth Carolina
California MarylandArizonaNew MexicoDelaware Alabama Louisiana
Illinois
New York MichiganNevada Alaska
MississippiSouth CarolinaWashingtonOregon
Wyoming OklahomaVirginiaRhode IslandMassachusettsNew Jersey
Missouri Arkansas
TennesseeGeorgiaColorado
Texas Idaho Nebraska Kentucky Montana
Ohio Utah Indiana Kansas
ConnecticutPennsylvaniaHawaiiWest VirginiaMaine
South Dakota North Dakota
Vermont
Minnesota Wisconsin
IowaNew Hampshire 050100150 FloridaNorth Carolina
California MarylandArizonaNew Mexico
Delaware Alabama Louisiana
Illinois
New York Michigan Nevada Alaska
MississippiSouth CarolinaWashingtonOregon
Wyoming OklahomaVirginiaRhode IslandMassachusettsNew Jersey
Missouri Arkansas
Tennessee
GeorgiaColoradoTexas Idaho
Nebraska Kentucky Montana Ohio Utah
Indiana Kansas
ConnecticutPennsylvaniaHawaiiWest VirginiaMaine
South Dakota North Dakota
Vermont
Minnesota Wisconsin IowaNew Hampshire
050100150 FloridaNorth Carolina
California MarylandArizonaNew Mexico
Delaware Alabama Louisiana
Illinois
New York MichiganNevada Alaska
MississippiSouth CarolinaWashingtonOregon
Wyoming OklahomaVirginiaRhode IslandMassachusettsNew JerseyMissouri ArkansasTennesseeGeorgiaColoradoTexas Idaho
Nebraska Kentucky Montana Ohio Utah
Indiana Kansas
ConnecticutPennsylvaniaHawaiiWest VirginiaMaine
South Dakota North Dakota
VermontMinnesota Wisconsin
IowaNew Hampshire
150 100 50 0
Florida North Carolina California Maryland Arizona New Mexico Delaware Alabama Louisiana Illinois New York Michigan Nevada Alaska Mississippi South Carolina Washington Oregon Wyoming Oklahoma Virginia Rhode Island Massachusetts New Jersey Missouri Arkansas Tennessee Georgia Colorado Texas Idaho Nebraska Kentucky Montana OhioUtah Indiana Kansas Connecticut Pennsylvania Hawaii West Virginia Maine South Dakota North Dakota Vermont Minnesota Wisconsin IowaNew Hampshire
050100150 Branch 1Branch 2 Branch 3 Branch 4 050100150 Branch 1Branch 2 Branch 3 Branch 4
40 30 20 10 0
Washington Oregon Wyoming Oklahoma Virginia Rhode Island Massachusetts New Jersey Missouri Arkansas Tennessee Georgia Colorado Texas
010203040 CaliforniaMaryland ArizonaNew Mexico Delaware Alabama Louisiana Illinois New YorkMichigan Nevada AlaskaMississippi South Carolina
25 20 15 10 5 0
Delaware Alabama Louisiana Illinois New York Michigan Nevada
0510152025
7 members
3 members
Delaware
2 members
Alabama Louisiana 4 members
2 members
Illinois New York 2 members
Michigan Nevada
0510152025
7 members
3 members
Delaware 2 members
Alabama Louisiana 4 members
2 members
IllinoisNew York 2 members
MichiganNevada
樹状図の様々なプロット例
5.1.5 樹状図のクラスタの周りに枠を描く rect.hclust()
関数
rect.hclust()
は,樹状図のクラスタの周りに枠を描く.書式:
rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL,
border = 2, cluster = NULL)
引数:
tree hclust()
が生成するようなオブジェクトk, h
スカラ.樹状図を,ちょうどk
個のクラスタが作られるように分割するか,高さh
で分割するwhich, x
周りに矩形を描くクラスタを選ぶためのベクトル.which
はクラスタを番号
(
木の左から右へ)
で選び,x
は対応する水平座標値を含むクラスタを選ぶ.既定値は
which=1:k
border
矩形の境界色のためのベクトルcluster
オプションとして,cutree(hclust.obj,k=k)
が返すようなクラスタ所属 情報を持つベクトルが既に計算済みなら,効率性のために指定できる返り値:
(
コンソールに表示されない)
リストで,各成分は対応するクラスタ中のデー タ点のベクトルを含む樹状図の枝の周りに矩形の枠を描き,クラスタを強調する.最初に樹状図があるレベル で分割され,それから矩形枠が選ばれた枝の周りに描かれる.
# 米国の犯罪検挙率データUSArrestsを使用(次の図を参照)
> hca <- hclust(dist(USArrests))
> plot(hca)
> rect.hclust(hca, k=3, border="red") # レベル3の枝をハイライト
Florida
North Carolina Delaware Alabama Louisiana
AlaskaMississippiSouth CarolinaMarylandArizonaNew MexicoCaliforniaIllinoisNew YorkMichiganNevadaMissouriArkansasTennesseeGeorgiaColoradoTexas
Rhode Island Wyoming Oregon
OklahomaVirginia Washington
MassachusettsNew Jersey
Ohio Utah
ConnecticutPennsylvaniaNebraska
Kentucky Montana
Idaho
Indiana Kansas
HawaiiMinnesotaWisconsinIowaNew HampshireWest VirginiaMaineSouth DakotaNorth DakotaVermont
050100150200250300
Cluster Dendrogram
hclust (*, "complete") dist(USArrests)
Height 樹状図の枝を矩形で囲む