Rで解析:デンドログラム描写の決定版!「dendextend」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

デンドログラム描写には欠かせないパッケージ「dendextend」です。本パッケージがあればデンドログラムの描写には困らないと思います。Rパッケージ付属のdistコマンドでは距離の計算に”pearson”が使用できないので、「amap」パッケージをインストールしています。

パッケージのバージョンは1.15.2。実行コマンドはwindows 11のR version 4.1.2で確認しています。

スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("dendextend")
install.packages("dendextendRcpp")
install.packages("amap")

実行コマンド

下記コマンドを実行してください。詳細はコメントを確認してください。その他コマンドはパッケージヘルプを確認してください。

#パッケージの読み込み
library("dendextend")
library("dendextendRcpp")
library("amap")

#####準備#####################
#データ例の作成
#25*4のデータ
TestData <- matrix(sample(1:100, 100, replace = TRUE), 25, 4)
TestData <- data.frame(row.names = paste0("TEST", 1:25), TestData)
colnames(TestData) <- paste0("Data", 1:4)

#&#36317;&#38626;&#35336;&#31639;;stats, amap&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#21033;&#29992;
#&#21015;
RowDist <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                   method = "complete"))
#&#34892;
ColDist <- as.dendrogram(hclust(Dist(t(TestData), method = "pearson", nbproc = 200),
                                   method = "complete"))
##############################

##########&#12487;&#12531;&#12489;&#12525;&#12464;&#12521;&#12512;&#12398;&#20307;&#35009;,&#33394;,&#12469;&#12452;&#12474;&#12434;&#22793;&#26356;:set&#12467;&#12510;&#12531;&#12489;###########
#set(dendrogram&#12458;&#12502;&#12472;&#12455;&#12463;&#12488;, labels_xxx&#12458;&#12503;&#12471;&#12519;&#12531;, &#12458;&#12502;&#12471;&#12519;&#12531;&#12395;&#21512;&#12431;&#12379;&#12383;&#35373;&#23450;)
#set&#12467;&#12510;&#12531;&#12489;&#26368;&#19979;&#37096;&#12395;&#12414;&#12392;&#12417;&#12390;&#12503;&#12525;&#12483;&#12488;&#12467;&#12510;&#12531;&#12489;
#&#20869;&#23481;&#12398;&#22793;&#26356;:labels&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist1 <- set(RowDist, "labels", c(1:50))
#&#33394;&#12398;&#22793;&#26356;:labels_col&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist2 <- set(RowDist, "labels_col", c(1, 2, 3))
#&#25991;&#23383;&#12469;&#12452;&#12474;&#12398;&#22793;&#26356;:labels_cex&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist3 <- set(RowDist, "labels_cex", c(0.5, 0.7))
#&#12494;&#12540;&#12489;&#12395;&#12489;&#12483;&#12488;&#12434;&#36861;&#21152;:nodes_pch&#12458;&#12503;&#12471;&#12519;&#12531;
#&#26411;&#31471;&#12398;&#12415;&#12399;leaves_pch&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist4 <- set(RowDist, "nodes_pch", 17)

###PlotRowDist5-6&#12414;&#12391;&#38918;&#30058;&#12395;&#12458;&#12503;&#12471;&#12519;&#12531;&#12434;&#36861;&#21152;###
#&#26465;&#20214;&#12399;c()&#12391;&#35079;&#25968;&#35373;&#23450;&#12391;&#12365;&#12414;&#12377;
#&#12489;&#12483;&#12488;&#12398;&#12469;&#12452;&#12474;&#12434;&#22793;&#26356;:nodes_cex&#12458;&#12503;&#12471;&#12519;&#12531;
#&#26411;&#31471;&#12398;&#12415;&#12399;leaves_cex&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist5 <- set(PlotRowDist4, "nodes_cex", c(2, 3))
#&#12489;&#12483;&#12488;&#12398;&#33394;&#12434;&#22793;&#26356;:nodes_col&#12458;&#12503;&#12471;&#12519;&#12531;
#&#26411;&#31471;&#12398;&#12415;&#12399;leaves_col&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist6 <- set(PlotRowDist5, "nodes_col", c("blue", "red"))
###############################################

###PlotRowDist7-9&#12414;&#12391;&#38918;&#30058;&#12395;&#12458;&#12503;&#12471;&#12519;&#12531;&#12434;&#36861;&#21152;###
#&#32218;&#12398;&#31278;&#39006;&#12434;&#35373;&#23450;:branches_lty&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist7 <- set(RowDist, "branches_lty", c(4, 7))
#&#32218;&#12398;&#31278;&#39006;&#12434;&#35373;&#23450;:branches_lwd&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist8 <- set(PlotRowDist7, "branches_lwd", c(4, 1))
#&#32218;&#12398;&#33394;&#12434;&#35373;&#23450;:branches_col&#12458;&#12503;&#12471;&#12519;&#12531;
PlotRowDist9 <- set(PlotRowDist8, "branches_col", c("red", "green"))

###PlotRowDist1-9&#12434;&#12503;&#12525;&#12483;&#12488;####################
par(mfrow = c(3,3))
#Mac&#26085;&#26412;&#35486;&#25991;&#23383;&#21270;&#12369;&#38450;&#27490;
#par(family = "HiraKakuProN-W3")
#&#12503;&#12525;&#12483;&#12488;
for(n in 1:9){
  
  plot(eval(parse(text = paste0("PlotRowDist", n))), main = paste0("PlotRowDist", n))
  
}
###############################################

#&#25351;&#23450;&#12375;&#12383;&#12463;&#12521;&#12473;&#12479;&#12395;&#20998;&#39006;:branches_k_color&#12458;&#12503;&#12471;&#12519;&#12531;
#valu&#12458;&#12503;&#12471;&#12519;&#12531;&#12391;&#33394;&#12434;&#25351;&#23450;&#12391;&#12365;&#12414;&#12377;
PlotRowDist10 <- set(RowDist, "branches_k_color",
                        value = c("blue", "red", "yellow", "black"), k = 4)

#&#25351;&#23450;&#12375;&#12383;&#12521;&#12505;&#12523;&#20869;&#23481;&#12398;&#12494;&#12540;&#12489;&#12398;&#33394;,&#22826;&#12373;,&#32218;&#31278;&#22793;&#26356;:by_labels_branches_XXX&#12458;&#12503;&#12471;&#12519;&#12531;
#&#33394;&#12398;&#22793;&#26356;:by_labels_branches_col
PlotRowDist11 <- set(RowDist, "by_labels_branches_col",
                        value = c("TEST16", "TEST18"), TF_values = c("red", "blue"))
#&#32218;&#12398;&#22826;&#12373;&#12434;&#22793;&#26356;:by_labels_branches_col
PlotRowDist12 <- set(RowDist, "by_labels_branches_lwd",
                        value = c("TEST16", "TEST18"), TF_values = c(4, 1))
#&#32218;&#12398;&#22826;&#12373;&#12434;&#22793;&#26356;:by_labels_branches_lty
PlotRowDist13 <- set(RowDist, "by_labels_branches_lty",
                        value = c("TEST16", "TEST18"), TF_values = c(4, 1))

###&#12381;&#12398;&#20182;&#12398;&#35013;&#39166;&#12467;&#12510;&#12531;&#12489;#####
#&#25351;&#23450;&#12375;&#12383;&#12487;&#12540;&#12479;&#12434;&#21462;&#12426;&#38500;&#12367;:prune&#12467;&#12510;&#12531;&#12489;
PlotRowDist14 <- prune(RowDist, leaves = paste0("TEST", 1:20))

###PlotRowDist10-14&#12434;&#12503;&#12525;&#12483;&#12488;####################
par(mfrow = c(3, 2))
#Mac&#26085;&#26412;&#35486;&#25991;&#23383;&#21270;&#12369;&#38450;&#27490;
#par(family = "HiraKakuProN-W3")
#&#12503;&#12525;&#12483;&#12488;
for(n in 0:4){
  
  plot(eval(parse(text = paste0("PlotRowDist1", n))), main = paste0("PlotRowDist1", n))
  
}
###############################################

#&#12503;&#12525;&#12483;&#12488;&#38936;&#22495;&#12398;&#21021;&#26399;&#21270;
par(mfrow = c(1, 1))

#&#25351;&#23450;&#12375;&#12383;&#12463;&#12521;&#12473;&#12479;&#12395;&#20998;&#39006;&#12375;&#26528;&#12391;&#22258;&#12416;:rect.dendrogram&#12467;&#12510;&#12531;&#12489;
plot(RowDist)
PlotRowDist15 <- rect.dendrogram(RowDist, k = 4,  border = c(2, 3, 4), lty = 5, lwd = 2)

#&#12487;&#12531;&#12489;&#12525;&#12464;&#12521;&#12512;&#12434;&#20006;&#12409;&#12390;&#34920;&#31034;&#12398;&#28310;&#20633;:dendlist&#12467;&#12510;&#12531;&#12489;
#&#32080;&#21512;&#26041;&#24335;&#12434;&#22793;&#12360;&#12390;&#27604;&#36611;
RowDist1 <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                    method = "complete"))
RowDist2 <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                    method = "average"))
RowDist1_2 <- dendlist(RowDist1, RowDist2)

#&#12487;&#12531;&#12489;&#12525;&#12464;&#12521;&#12512;&#12434;&#20006;&#12409;&#12390;&#27604;&#36611;:tanglegram&#12467;&#12510;&#12531;&#12489;
tanglegram(RowDist1_2, common_subtrees_color_branches = TRUE)

#corrplot&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#21033;&#29992;&#12375;&#12383;&#32080;&#21512;&#26041;&#27861;&#12398;&#30456;&#38306;:cor.dendlist&#12467;&#12510;&#12531;&#12489;
#&#32080;&#21512;&#26041;&#24335;&#12398;&#28310;&#20633;
RowDist1 <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                    method = "complete"))
RowDist2 <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                    method = "average"))
RowDist3 <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                    method = "single"))
RowDist4 <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                    method = "centroid"))

RowDist1_2_3_4 <- dendlist("complete" = RowDist1, "average" = RowDist2, "single" = RowDist3, "centroid" = RowDist4)

#&#24517;&#35201;&#12394;&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#12452;&#12531;&#12473;&#12488;&#12540;&#12523;&#12392;&#35501;&#12415;&#36796;&#12415;
#install.packages("corrplot")
library("corrplot")
#&#12487;&#12540;&#12479;&#12398;&#12503;&#12525;&#12483;&#12488;
corrplot(cor.dendlist(RowDist1_2_3_4), "pie", "lower")

#########gplots&#12497;&#12483;&#12465;&#12540;&#12472;&#12398;&#12300;heatmap.2&#12301;&#12467;&#12510;&#12531;&#12489;&#12392;&#12398;&#32068;&#12415;&#21512;&#12431;&#12379;#####
#install.packages("gplots")
if(!require("gplots", quietly = TRUE)){
  install.packages("gplots");require("gplots")
}

#&#12487;&#12540;&#12479;&#20363;&#12398;&#20316;&#25104;
#25*4&#12398;&#12487;&#12540;&#12479;
TestData <- matrix(sample(1:100, 100, replace = TRUE), 25, 4)
row.names(TestData) <- paste0("TEST", 1:25)
colnames(TestData) <- paste0("Data", 1:4)

#&#36317;&#38626;&#35336;&#31639;;stats, amap&#12497;&#12483;&#12465;&#12540;&#12472;&#12434;&#21033;&#29992;
#&#21015;
RowDist <- as.dendrogram(hclust(Dist(TestData, method = "pearson", nbproc = 200),
                                   method = "complete"))
#&#33394;&#12434;&#25351;&#23450;
RowDist <- set(RowDist, "branches_k_color",
                  value = c("blue", "red", "green", "black"), k = 4)
#&#34892;
ColDist <- as.dendrogram(hclust(Dist(t(TestData), method = "pearson", nbproc = 200),
                                   method = "complete"))
#&#33394;&#12434;&#25351;&#23450;
ColDist <- set(ColDist, "branches_k_color",
                  value = c("blue", "red", "green", "black"), k = 4)

#heatmap.2&#12467;&#12510;&#12531;&#12489;&#12391;&#12498;&#12540;&#12488;&#12510;&#12483;&#12503;&#12434;&#12503;&#12525;&#12483;&#12488;
heatmap.2(TestData, Rowv = RowDist, Colv = ColDist, cexCol = 1,
          col = colorRampPalette(c("#d9bb9c", "#4b61ba"))(10))

出力

・PlotRowDist1-9をプロット

PlotRowDist1-9

・PlotRowDist10-14をプロット

PlotRowDist10-14

・rect.dendrogramコマンド

rect.dendrogram

・tanglegramコマンド

tanglegram

・cor.dendlistコマンド

cor.dendlist

・gplotsパッケージの「heatmap.2」コマンドと組み合わせ

heatmap2

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました