🌲

大系統樹から任意の種で構成された部分系統樹を抜き出す

2024/07/02に公開

はじめに

系統樹は種の系統的関係を知る目的から表現型の起源を辿る目的など生物を考察する上で欠かせない。また個々の遺伝子系統樹はその遺伝子に対する機能的束縛や多様化を反映することから、その遺伝子の機能の保存性や機能分化を確かめたり、逆に候補領域の進化速度と中立な領域の進化速度を比較することによってシス制御領域などのノンコーディングな機能部位の発見にも応用されている(PhyloPやPhastCons等)。

近年、次世代シーケンサーの発達によってゲノムが安価かつ高品質に読めるようになったことから、様々な生物のゲノムが読まれており、このようなゲノムを何百種も用いた巨大な種系統樹が構築されている。ゲノムから作られた系統樹の枝の長さは、それぞれの種の平均的な進化速度として扱うことができ、前述の機能部位探索に対する参照として用いることができる。

しかしこうした系統樹を我々が実際に用いるときは、その巨大な系統樹に含まれる種すべてを用いるわけではなく興味のある一部の種のみを用いる。その場合巨大な系統樹から使わない種を剪定し枝の長さを再計算しなければならないのだが、これはもちろん手でやるには骨の折れる作業である。だが、そのような処理をするプログラムは簡単に書くことができる。

biopythonでの実装

このような大系統樹から部分系統樹(subtree)を抜き出すライブラリはいくつかあるのだが、今回は配列解析で汎用的に用いられているbiopythonで実装する。大系統樹の例としてZoonomia projectから発表された哺乳類447種のゲノムアライメントから作成された種系統樹(newick形式)を用いる。

wget https://cgl.gi.ucsc.edu/data/cactus/447-mammalian-2022v1.nh

ただ、447種もあるとやはり絵的に見せづらいので、小さくするためにもまずは指定の種を含むクレードを丸ごと抜き出す方法を見せる。Zoonomiaの系統樹のtaxaはすべて学名で書かれているため、例えば以下のようにヒト(Homo_sapiens)とオランウータン(Pongo_abelii)を指定し、Phyloで生成した系統樹のインスタンスにあるcommon_ancestorのmethodを実行すれば、大系統樹からヒト・オランウータンを含むクレード、つまりヒト科(hominidae)全体の系統樹が抜き出される。

from Bio import Phylo
import matplotlib.pyplot as plt

taxa=['Homo_sapiens','Pongo_abelii']

tree=Phylo.read('447-mammalian-2022v1.nh','newick')
hominidae=tree.common_ancestor(taxa)
Phylo.draw(hominidae)

次にこのヒト科の系統樹からヒトとオランウータンのみを含む系統樹を抜き出す。これはPhyloで生成した系統樹のインスタンスにあるpruneのmethodで興味のあるtaxa以外を切り取るだけである。剪定後の系統樹のノードと枝の長さはbiopythonが裏で計算してくれる。

from copy import deepcopy

pruned=deepcopy(hominidae)

for species in hominidae.get_terminals(): #hominidaeの系統樹にあるすべての種を取得
    if species.name not in taxa: #指定のtaxaではない種をhominidaeの系統樹から剪定
        pruned.prune(species.name) 

Phylo.draw(pruned)

もちろん、以下のように大系統樹から直接抜き出すこともできる。結果は同じである。

from copy import deepcopy

pruned=deepcopy(tree)

for species in tree.get_terminals():
    if species.name not in taxa:
        pruned.prune(species.name) 

Phylo.draw(pruned)

この通り、ヒトとオランウータン以外の種を切り取った後の枝の長さ(つまりヒト科共通祖先からヒトまたはとオランウータンまでの長さ)はちゃんと計算されている。ちなみにヒト科共通祖先からヒトまたはオランウータンまでの枝の長さは以下のようにして出力できる。

print(pruned.distance(pruned.common_ancestor(taxa),'Homo_sapiens'))
print(pruned.distance(pruned.common_ancestor(taxa),'Pongo_abelii'))
0.00804403
0.008106112

抜き出した系統樹はPhylo.write(pruned, somewhere, "newick")でnewick形式で保存できる。

以上。

Discussion