2022年7月27日水曜日

ggtreeでNEXUSファイルの系統樹を描く

午前
・データ整理
・統計ゼミ

午後
・データ整理

ggtreeでNEXUSファイル(.nex)の系統樹を描くのにどハマりした。

そもそもの発端は、RAxMLで作成した系統樹を「ggtree」の「reroot()」を使うと、こんな感じでいまいちだったことに始まる。
「reroot()」のコマンドはこんな感じ。
#系統樹はML_tree.treeとして保管されている(nwk形式)
tree <- read.tree("ML_tree.tree")
tree_reroot <- root(tree, outgroup = "26") #外群のOTU名が26
str(tree_reroot)
ggtree(tree_reroot) +  geom_tiplab()
一応、「geom_rootedge()」も試したが改善できず。
ggtree(tree_reroot) +  geom_tiplab() + geom_rootedge(3)
ということで、Rでrerootをすることを諦めた。そこで、FigTree.appでrerootしてからRで作図する作戦に変更。

で、ここからどハマりした。

まず、FigTree.appでrerootをすると、「.nwk」だとboot strap値が保存できなくなる(?)ので「.nex」で保存しなければならない。

「.nex」で保存したので、「read.nexus()」を使えば良いだろうと思ったのだが、boot strap値が読み込めない(ファイルにはboot strap値はあることを確認)。

ここまでで半日以上を潰した。

試行錯誤の末、「read.beast()」を使えば良いことが判明!

普段、BEASTで作成したファイルを「read.beast()」で使っているので、これで終わった、、、と思ったら、別の意味で終わった。
#系統樹はML_tree_reroot_nex.nexとして保管されている
ML_TREE <- read.beast("ML_tree_reroot_nex.nex")
ggtree(ML_TREE) +  geom_tiplab()
これで作図できるはずなのだが、エラーがでる。「ggtree(ML_TREE)」だけだと実行できるので、OTUを描画する「geom_tiplab()」でエラーが出ているらしい。

悪戦苦闘の結果、原因が判明した。

まず、「read.beast()」で読み込んだ場合、下記のようにOTUは「tip.label」、 boot strap値は「label」として保存される。
#系統樹はML_tree_reroot_nex.nexとして保管されている
ML_TREE <- read.beast("ML_tree_reroot_nex.nex")
ML_TREE@phylo$tip.label #OTU
[1] "25" "24" "18" "16" "15" "13"
ML_TREE@data$label #boot strap値
label1  label2  label3  label4  label5 
    58      55      42       4      49
しかし、なぜか、「ggtree()」を経由すると、OTUは「label.x」、boot strap値は「label.y」になっていることが分かった!
ML_TREE <- read.beast("ML_tree_reroot_nex.nex")
ML_TREE_ggtree <- ggtree(ML_TREE)
ML_TREE_ggtree$data
どうやら、「geom_tiplab()」は、データ「label」を探しているが見つからないのでエラーが出ているようだ。

ということで、「label.x」を「label」に入れることで解決できた。
ML_TREE <- read.beast("ML_tree_reroot_nex.nex")
ML_TREE_ggtree <- ggtree(ML_TREE)
ML_TREE_ggtree_data <- ML_TREE_ggtree$data 
ML_TREE_ggtree_data$label <- ML_TREE_ggtree_data$label.x
ggtree(ML_TREE_ggtree_data) + geom_tiplab()
「.nex」を「read.beast()」で読むと発生する問題なのか、FigTree.appでrerootしたファイルだからなのか詳細な原因は良く分からないが、BEASTで作成したファイルではこのような問題は起こったことはない。 boot strap値についても同じような対応が必要な気がするが、私はboot strap値を一度取り出して別の変数に入れているので、こちらについては大きな問題となっていない。