Rmarkdownでクラスター分析をして、それからデンドログラムを書きたい話
久しぶりにRのお勉強をしました。忙しくって忘れていた「統計って楽しいですね」という感情を久々に思い出すことができました。コンソールにらめっこしてるの、時間があればいいですよね。ただ、基礎的な部分がお粗末すぎて時間がみるみる溶けていくので、やることが山のようにあるときはできませんが。
- 作者: 豊田裕貴
- 出版社/メーカー: オーム社
- 発売日: 2017/01/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
クラスター分析ですが、デンドログラムを表示させるのに、単純にplotで表示させるとRMarkdownでは不便です。
hoge.d <- dist(hoge) #hogeデータセットから距離行列hoge.dデータセットを算出 hoge.dendro <- hclust(hoge.d, method = "ward.D2") #ウォード法(Ward.D2)を指定して、hoge.dendroへ渡す。 plot(hoge.dendro, hang = -1, main = "ウォード法") #デンドログラムの描画 rect.hclust(hoge.dendro, k=○) #四角で"k="で指定した数で分けるクラスタをマーキング
3行目のplot関数できちんとデンドログラムを表示することができますが、Rmarkdownの出力では、4行目のデンドログラム内のマーキングを表示することができませんでした。
rect(m[which[n]] + 0.66, par("usr")[3L], m[which[n] + 1] + 0.33, でエラー: plot.new has not been called yet
ちなみに、3行目と4行目を+でつないでもエラーが発生します。
plot(hoge.dendro, hang = -1, main = "ウォード法") + rect.hclust(hoge.dendro, でエラー:
二項演算子の引数が数値ではありません
こういうRmarkdownでデンドログラムを表現するときに便利なのが、ggdendro関数です。
library(ggplot2) library(ggdendro) ggdendrogram(hoge.dendro, rotate = "FALSE", size = 2) #デンドログラムの描画
これでデンドログラムを書くことができました。ちなみに、rotate = "TRUE"とすると、デンドログラムが横向きになります。
次に、デンドログラムをggplot2の俎上に載せていきます。
d.hoge.dendro <- as.dendrogram(hoge.dendro) #分析結果をデンドログラムクラスとする hoge.plot <- dendro_data(d.hoge.dendro, type = "rectangle") #デンドログラム作成準備 p <- ggplot(segment(hoge.plot)) #デンドログラムを作成 + geom_segment(aes(x = x, y = y, xend = xend, yend = yend)) #セグメント(棒)のデータを描画 p #デンドログラムをggplotで表示
先程のものにクラスタの区切りを分かりやすくするために線を引きます。
p <- ggplot(segment(hoge.plot), mapping = aes(x = x, y = y, xend = xend, yend = yend)) #後ろのgeom_hogehogeにマッピング情報を継承するために書き方を変更している + geom_segment() #棒データ取得 + geom_hline(yintercept = 180, linetype = "dashed", colour = "RED") #y = 180の"dashed"点線で赤色の直線を引く p
今回はy = 240になるように直線を引きました。クラスタを3つに分けているということが視覚的に分かりやすいですね。
参考資料
- 作者: 豊田裕貴
- 出版社/メーカー: オーム社
- 発売日: 2017/01/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
RユーザのためのRStudio[実践]入門−tidyverseによるモダンな分析フローの世界−
- 作者: 松村優哉,湯谷啓明,紀ノ定保礼,前田和寛
- 出版社/メーカー: 技術評論社
- 発売日: 2018/06/29
- メディア: 大型本
- この商品を含むブログ (1件) を見る