PAML

2014 年 3 月 11 日 改訂
井上 潤

PAML は最尤法に基づいて解析を行うソフトウェアです.系統樹探索よりも,仮説の検証や配列データの進化パターン検証 (positive selection site の探索) などを得意としていると思います.多様な解析が可能,という点では,右に出るアプリケーションは無いと思います.HyPhy も同様の機能を備えるようになっていますが,HyPhy を使いこなすにはもう少しプログラミングなどの知識が必要なようです.PAML の難点は,Unix ベースのため操作が困難である点と,解析速度があまり速くない点です.

GUI ではなくすべてコマンドベースの操作であるため,わかりにくい部分もあります.しかしマニュアルは完成度が高く,よく読めば細かい操作が可能になるだけでなく,解析のメカニズムを理解するのにも役立ちます.

Yang さんご自身はパムル,たまにピーエーエムエルと呼んでいます.


気づいた点
  • ver. 3.15 では,データセットからアミノ酸の rate matrix を推定することができます. tree ファイルにトポロジーを保存してこれを選択して,model=9 にして codeml を走らせると,rate matrix が書かれた AAratefile.dat というファイルが outfile として作成されます.この際に outfile では 0 として推定された matrix の要素が AAratefile.dat では 0.1 となっています.詳細は PDF として配布されている paml FAQ をご覧下さい.なお ver. 3.14 ではこの操作はできないようです.

  • 系統樹を読み込ませる場合は,根幹の分岐を 3 分岐にします.根幹以外に多分岐が含まれていても,問題なく使うことができます.自分で作成した系統樹は TreeView で確認しながら解析を走らせるようにすると,無用なトラブルを避けることができます.

  • 種数と配列の長さの横に,「I」を付けることで,Interleaved の配列も読みとってくれます.

PAML のコンパイル

基本的なコンパイル

PAML をダウンロードします. Windows バージョンはコンパイルせずにそのまま使えます.Windows バージョンは,解凍すると bin というフォルダにアプリケーション (.exe という拡張子がついています) が入っています.

ダウンロードした paml3.14b.OSX_G5.tar をダブルクリックし,解凍します. Mac の CPU が G4 や G3 の場合は,古いバージョンを解凍して試して下さい.

解凍してできた paml3.14 をホームディレクトリー (私であれば,inoue という名前のディレクトリーになっている) に移します.

ターミナルを開きます.

カレントディレクトリー内部にあるファイルが確認できます.

ls

paml3.14 ディレクトリーに入ります.

cd paml3.14

src ディレクトリーに入ります.

cd src

「.o」という拡張子が着いたファイルがあれば消去します.

rm *.o

コンパイルを行います.

make -f Makefile

コンパイルを行います.詳しくはマニュアル (あるいは readme ファイル) を参照して下さい.Mac の性能にもよると思いますが.数分かかります.
*注意: Mac Mountain Lion では,どうも cc コンパイラが動かないようです.Makefile 2 行目を「CC = gcc」とすると,問題なくコンパイルされました (2012 年 9 月).

さらに

mv baseml basemlg codeml evolver pamp yn00 mcmctree chi2 ../bin

で上位のディレクトリ (「..」が上部ディレクトリを表します) にコンパイルされた baseml, basemlg,.... といった 8 つのアプリケーションを移動します.mv というコマンドは移動を意味するので,src ディレクトリ (今自分がいるディレクトリ) の上部ある bin ディレクトリにプログラムを移動します.実際には,プログラムを単純にファインダー上の操作でドラッグ&ドロップすることでプログラムをコピー&ペーストして使うこともできます.

余談ですが,プログラムの名前を変えても正常に動作するので,ソースコードを変更してコンパイルした場合にちがう名前のプログラム (ex. codeml_F) にする事も可能です.もちろんこの場合も,コントロールファイルやシーケンスファイル,tree ファイルをプログラムと同じフォルダに入れておく必要があります.


PC にあわせたコンパイル

Win や Mac など PC (CPU?) にあわせたコンパイルを行うことが出来ます.これによって,計算速度が速くなるようです.

src フォルダに入っている Makefile を書きかえます.このファイルの最初に,CFLAGS と書かれた行がいくつかありますが,「#」を取ることによって,その行がアクティブになります.

Mac の Mountain Lion では 2 行目の 「CC= cc」 を「CC=gcc」 にしないとコンパイルがうまく行きませんでした [2012 年 10 月].


PRGS = baseml codeml basemlg mcmctree pamp evolver yn00 chi2
CC = cc # cc, gcc, cl

#CFLAGS = -O4 -funroll-loops -fomit-frame-pointer -finline-functions

#MAC OSX G5:
#CFLAGS = -mcpu=G5 -O4 -funroll-loops -fomit-frame-pointer -finline-functions

#MAC OSX intel:
#CFLAGS = -march=pentium-m -O4 -funroll-loops -fomit-frame-pointer -finline-functions

#CFLAGS = -O4
#CFLAGS = -fast
CFLAGS = -m64 -march=opteron -mtune=opteron -ansi -O3 -funroll-loops -fomit-frame-pointer -finline-functions
#CFLAGS = -march=athlon -mcpu=athlon -O4 -funroll-loops -fomit-frame-pointer -finline-functions
#CFLAGS = -march=pentiumpro -mcpu=pentiumpro -O4 -funroll-loops -fomit-frame-pointer -finline-functions


上の例では,「#」のない bold の行だけがアクティブになっています.あとは 通常通り make と入力してコンパイルを行います.


PAML の基本的な使い方

examples/lysin (examples 内部にある lysin というディレクトリ)にある例題で説明します.src に作成された codeml を lysin フォルダに移動し,自身もターミナルで lysin フォルダに移動して下さい.

 PAML に含まれているソフトウェアは,Win でも Mac でもダブルクリックすると起動するようにできています.私の経験では,ダブルクリックよりもターミナル (Win ではコマンドプロンプト) 上でコマンドを打って操作した方が問題なく動くことが多いです.ここではその方法を説明します.

./codeml

と打つと,codeml.ctl というコントロールファイルを自動的に読み込んで解析が始まります.ターミナルで自分のいるディレクトリにあるアプリケーションを起動する場合,アプリケーションが同じディレクトリにあることを示すために,「./」を初めに入れておく必要があります.

 また,コントロールファイルの名前を例えば lysin.ctl にした場合は,

./codeml lysin.ctl

と入力して下さい.

 Mac では拡張子が隠されてしまって,「lysin.nuc」が「lysin」とファインダー上で表示されていることがあります.この場合はターミナルで「ls」と入力してファイル名がコントロールファイルで正しく指定されているか確認して下さい.command +I でも名前の確認が可能です.

 また,各種 infile の改行コードが Mac (CR) 形式で保存されている場合も,解析がうまく動かないことがあります.mi (無料) や BBEdit (有料) などのエディターで改行コードを Unix (LF) (あるいは Win) に変更してから解析を行って下さい.


枝ごとに dN/dS 値を推定

codeml を使って dN/dS 値を推定することで,タンパク質コーディング遺伝子 (cDNA 配列) の適応進化を検出する解析ができます.

dN: 非同義置換率 (非同義座位あたりの非同義置換数)
dS: 同義置換率 (同義座位あたりの同義置換数)
ω= dN/dS

dN/dS < 1 ならば負の自然淘汰 (機能的制約),dN/dS = 1 ならば中立的な進化状態 (機能的制約のゆるみ),dN/dS > 1 ならば正の自然選択 (適応的な進化),が起こっているのではないかと推測します (松井ら,2008).
 codeml では,branch models, site models, branch-site models 3 種類の解析が可能ですが,ここでは枝ごとにωを推定する branch models を解説します.


Branch models (枝モデル)
model=1 にすることで,枝ごとに ω を推定する branch model を選択します.example/lysozyme には,Yang (1998) で branch model の解析に用いられたデータ (small data set) が保存されています.README.txt にも説明が多少あります.
 この exmple/lysozyme ディレクトリにターミナルで移動してください.コンパイルして得られた codeml を同じディレクトリに移してください.その後,以下を入力すると,

./codeml lysozymeSmall.ctl

解析が始まるはずです.

 結果が保存されている mlc ファイルを開いてください.下の方に「dN & dS for each branch」というタイトルで,枝ごとに推定された値が記録されています.10..11 の行に,Yang (1998) の Table 1, Small data set, E,に書かれている 3.506 (mlc ファイルでは 3.5057) が得られているはずです.dS が極端に小さいか 0 の場合は,999 という値になってしまうようです.
 branch 番号はわかりにくいので,「w ratios as labels for TreeView:」の下の行にある newick format を FigTree などで読み込んで系統樹を書いてみると良いでしょう.

Yang, Z. 1998. Likelihood ratio tests for detecting positive selection and application to primate lysozyme evolution. Molecular Biology and Evolution 15:568-573.




サイトごとの 尤度推定
  • output ファイルの一つである lnf ファイルに,"site pattern" として出てきます (codeml では確認しましたが,おそらく baseml も同様だと思います).このためすべてのサイトを調べるには,output file と照らし合わせていくしかありません.GSF に Yang さんご自身のコメントがあります.

  • HyPhy では,すべてのサイトの尤度を一度に推定することが可能です.HyPhy の場合は,おそらくバッチファイルを特別に作成する必要があります.私はどのように作成したか忘れてしまいましたが,おそらく作者に問い合わせて作ったと思います.

Shimodaira-Hasegawa test

partition 別に rate matrix,塩基 (アミノ酸) 組成,gamma カテゴリ,の各パラメータを推定させて SH test を行うことができます.tree file に系統樹を複数書いておくと,自動的に SH test と KH test を RELL ブートストラップを用いて行ってくれます.
  ここで言うパーティションとはコドンに分けている場合もあれば,遺伝子ごとに分けた場合も意味しています.
basemlSHtest.tar.gz

Tree file
対立仮説として用いる Newick 形式の tree は樹長付きでも,そうでなくても,どちらでも良いようです.tree file は最初の行に OTU の 数と tree の数を記入します.tree ファイルにこの最初の行がないと,パラメータの推定だけで解析が終わってしまいます.コントロールファイルは以下のコラムを参照して作成してください.
 すべての枝が 2 分岐からなる系統樹を用意する必要があります.MrBayesRAxML で制約付きの系統樹を推定することができます.以前は,根幹の分岐だけは 3 分岐にする必要があるように書いていましたが,2 分岐でも解析は動くようです.

Partition 解析
sequence file に partition の設定を記入します (マニュアルと プログラムと一緒にダウンロードされてくる example を参照して下さい).

解析の速度
baseml の場合,40 OTU, 10000 塩基のデータを 4 partition, 5 gamma categories で 23 本の系統樹を比較したところ,一晩で解析が終わりました.
 codeml で 40 OTU, 3000 残基のデータを 13 partition, 5 gamma categories で 23 本の系統樹を比較したところ,解析が終了するのに数日かかりました.

バージョンによって解析が走らないことがありました
Mac や Unix version では,3.14 では解析が可能ですが,3.15 ではうまく作動しない,という現象が見られます.Win では 3.15 でもうまく作動するようです.GSF で Yang さんご自身がこの問題を指摘されています [この問題は解決されたようです.4.4c では問題なく作動しました.2012 年 7 月].

2012 年 7 月 改訂.




baseml のコントロールファイル

*multidistribute のパラメータ推定用のファイルにも詳しい書き込みをしていますので,こちらも参照してください.


seqfile = horai.nuc
treefile = horai3.trees

outfile = RevModel.out * main result file
noisy = 9 * 0,1,2,3: how much rubbish on the screen
verbose = 0 * 1: detailed output, 0: concise output
runmode = 0 * 0: user tree; 1: semi-automatic; 2: automatic
* 3: StepwiseAddition; (4,5):PerturbationNNI

model = 7 * 0:JC69, 1:K80, 2:F81, 3:F84, 4:HKY85
* 5:T92, 6:TN93, 7:REV, 8:UNREST, 9:REVu; 10:UNRESTu
[GTR]
Mgene = 4 * 0:rates, 1:separate; 2:diff pi, 3:diff kapa, 4:all diff

[partition ごとに rate と塩基組成を推定]

* ndata = 5
clock = 0 * 0:no clock, 1:clock; 2:local clock; 3:CombinedAnalysis
fix_kappa = 0 * 0: estimate kappa; 1: fix kappa at value below
kappa = 5 * initial or fixed kappa

fix_alpha = 0 * 0: estimate alpha; 1: fix alpha at value below

[alpha をデータから推定]

alpha = 0.5 * initial or fixed alpha, 0:infinity (constant rate)
Malpha = 1 * 1: different alpha's for genes, 0: one alpha

[alpha を partition ごとに推定]

ncatG = 5 * # of categories in the dG, AdG, or nparK models of rates

[gamma カテゴリー を 5 に設定]

nparK = 0 * rate-class models. 1:rK, 2:rK&fK, 3:rK&MK(1/K), 4:rK&MK

nhomo = 0 * 0 & 1: homogeneous, 2: kappa for branches, 3: N1, 4: N2
getSE = 0 * 0: don't want them, 1: want S.E.s of estimates
RateAncestor = 1 * (0,1,2): rates (alpha>0) or ancestral states

Small_Diff = 7e-6
cleandata = 1 * remove sites with ambiguity data (1:yes, 0:no)?
* icode = 0 * (with RateAncestor=1. try "GC" in data,model=4,Mgene=4)
* fix_blength = -1 * 0: ignore, -1: random, 1: initial, 2: fixed
method = 0 * 0: simultaneous; 1: one branch at a time



codeml のコントロールファイル
*アミノ酸の解析では,mtREV24.dat などの rate matirx ファイルがコントロールファイルと同じフォルダに入っている必要があります.ダウンロードしたファイルにアミノ酸の各種 rate matirx ファイルが含まれています.
seqfile = stewart.aa * sequence data filename
treefile = stewart.trees * tree structure file name
outfile = mlc * main result file name

noisy = 9 * 0,1,2,3,9: how much rubbish on the screen
verbose = 0 * 0: concise; 1: detailed, 2: too much
runmode = 0 * 0: user tree; 1: semi-automatic; 2: automatic
* 3: StepwiseAddition; (4,5):PerturbationNNI; -2: pairwise

seqtype = 2 * 1:codons; 2:AAs; 3:codons-->AAs
CodonFreq = 2 * 0:1/61 each, 1:F1X4, 2:F3X4, 3:codon table
aaDist = 0 * 0:equal, +:geometric; -:linear, 1-6:G1974,Miyata,c,p,v,a
aaRatefile = mtREV24.dat * only used for aa seqs with model=empirical(_F)
* dayhoff.dat, jones.dat, wag.dat, mtmam.dat, or your own

[アミノ酸の rate matrix を選択]


model = 3
* models for codons:
* 0:one, 1:b, 2:2 or more dN/dS ratios for branches
* models for AAs or codon-translated AAs:
* 0:poisson, 1:proportional, 2:Empirical, 3:Empirical+F
* 6:FromCodon, 7:AAClasses, 8:REVaa_0, 9:REVaa(nr=189)

[データセットで観察されるアミノ酸組成を進化モデルに反映させます.F オプションと呼ばれています]


NSsites = 0 * 0:one w;1:neutral;2:selection; 3:discrete;4:freqs;
* 5:gamma;6:2gamma;7:beta;8:beta&w;9:beta&gamma;
* 10:beta&gamma+1; 11:beta&normal>1; 12:0&2normal>1;
* 13:3normal>0

icode = 0 * 0:universal code; 1:mammalian mt; 2-10:see below
Mgene = 2
* codon: 0:rates, 1:separate; 2:diff pi, 3:diff kapa, 4:all diff
* AA: 0:rates, 1:separate

[partition ごとにアミノ酸組成 (pi: パイ) を算出します]


* ndata = 10
clock = 0 * 0:no clock, 1:clock; 2:local clock; 3:CombinedAnalysis
fix_kappa = 0 * 1: kappa fixed, 0: kappa to be estimated
kappa = 2 * initial or fixed kappa
fix_omega = 0 * 1: omega or omega_1 fixed, 0: estimate
omega = .4 * initial or fixed omega, for codons or codon-based AAs

fix_alpha = 0 * 0: estimate gamma shape parameter; 1: fix it at alpha

[gamma shape パラメーターを推定させます]

alpha = 0.3 * initial or fixed alpha, 0:infinity (constant rate)
Malpha = 1 * 1:different alphas for genes

[partition (ここでは gene としています) ごとに alpha を推定させます]

ncatG = 5 * # of categories in dG of NSsites models

[gamma のカテゴリー数]


getSE = 0 * 0: don't want them, 1: want S.E.s of estimates
RateAncestor = 1 * (0,1,2): rates (alpha>0) or ancestral states (1 or 2)

Small_Diff = .5e-6
cleandata = 1 * remove sites with ambiguity data (1:yes, 0:no)?
* fix_blength = -1 * 0: ignore, -1: random, 1: initial, 2: fixed
method = 0 * 0: simultaneous; 1: one branch at a time


* Genetic codes: 0:universal, 1:mammalian mt., 2:yeast mt., 3:mold mt.,
* 4: invertebrate mt., 5: ciliate nuclear, 6: echinoderm mt.,
* 7: euplotid mt., 8: alternative yeast nu. 9: ascidian mt.,
* 10: blepharisma nu.
* These codes correspond to transl_table 1 to 11 of GENEBANK.


複数のデータセットで同じトポロジーの樹長を推定する

コントロールファイルの ndata をデータセット数にします.シーケンスファイルは phylip 形式をただ単位つなぎ合わせます.tree は unrooted (根幹 3 分岐) にします.例題

止めてしまった解析を途中からスタートする

baseml と codeml では,途中まで計算したパラメーターを初期値にして,解析を再スタートすることができます.rub ファイルに書かれたパラメーターを,in.baseml (in.codeml) というファイルに書いて再解析します.

rub というアウトプットに,the size (norm) of the gradient*,尤度と各種パラメーターが書き出されています.X: 以降がパラメーターなので,これをコピーして in.baseml (or in.codeml) というファイルに保存して解析をスタートされます.rub を比較することで,設定した初期値を使って解析がなされているか確認することができます.

in.baseml (in.codeml) の一行目が -1 となっていると,ここに書かれている各種パラメーターを fix して解析を行うことになるそうです.

詳しくは,マニュアル「Specifying initial values」をご覧下さい.
rub ファイルについては,「The rub file recording the progress of iteration」をご覧下さい.

* the size of the gradient について
例えば x 軸に樹長,y 軸に尤度をとって尤度を最適化すると,プラトーがみつかると gradiaent [傾き] はゼロになります.最尤推定がうまく行くと,rub ファイルの左から 2 番目に書かれている gradient がゼロに収束して行きます.そのよこの尤度は,一定の値になって行きます.

例題


その他

mtREV24 matrix の推定に用いられた配列と系統樹です.paml のパッケージには入っていないので載せておきます.molphy のパッケージに mt24.ptn として添付されているファイルを Nexus 形式に書き直しました.改行コードが Unix になっているので,MacClade で開く場合は,MacClade を立ち上げてから「開く」をメニューから選んで下さい.系統樹には根幹の分岐以外にも多分岐が含まれていますが,paml は多分岐を含んだ系統樹も読み込んで使ってくれます.