mcmctree进行分化时间的估算

以下内容参考了博客https://www.cnblogs.com/bio-mary/p/12818888.html、前研究组师妹的总结资料和MCMCTree tutorials。

"MCMCTree performs Bayesian estimation of species divergence times using soft fossil constraints under various molecular clock models."

MCMCTree是PAML包的一部分,功能是在多种分子钟模型下,利用较宽松的的化石约束,用贝叶斯方法估算物种分化时间。

安装MCMCTree

在Linux系统下的安装很简单,用conda安装paml就可以:

conda install -c bioconda paml

准备文件

"The program uses for input a sequence alighment (nucleotide or protein), a phylogenetic tree with fossil calibrations, and a control file (ususally called mcmctree.ctl) that contains the instructions for the program. "

"MCMCTree is part of the PAML package."

运行mcmctree需要准备三个文件:比对序列文件、树文件和控制文件。

在paml软件包下有个example文件夹,里面有很多示例文件,用于mcmctree分析的示例文件在DatingSoftBound里面。序列文件名称:mtCDNApri123,树文件名称:mtCDNApri.trees,控制文件的名称mcmctree.ctl,该示例文件分析的是7个类人猿物种的线粒体蛋白编码基因。

1 比对序列文件(核苷酸或蛋白质)

我用的比对好的序列文件是.phy文件,在软件Geneious里完成的文件格式转化,先导入fasat文件,导出时弹出的对话框phylip alignment export中,选择Relaxed phylip-Full length names followed by a single space,意思是导出的文件中每条序列的序列名和序列之间有一个空格。但是mcmctree要求序列名和序列之间至少两个空格空格,如果序列少的化,可以手动增加空格。我的序列比较多,用的方法是:使用geneious里batch rename功能统一给序列名后面加个序列名里没有的字符,然后导出的phylip文件用编辑器打开,用空格替换那个字符。

下图是示例文件的展示,格式是txt。7表示的是物种树,3331是比对序列的长度。在示例文件中,比对序列被分成了3部分,对应第一、第二和第三密码子位点, 每一部分都如下所示。

序列文件示例

2 有化石校准信息的树文件

需要注意的是树文件必须是定根的、不带有枝长信息的二歧树(rooted binary tree)

paml软件包下面的example文件夹下的树文件(.tree)如下:

树文件示例

7代表的是物种树,1代表只有一颗树。蓝色框中显示的是化石时间标记,表示的是人(humna)和黑猩猩(chimpanzee,bonobo)的共同祖先出现的时间在0.06到0.08个100个百万年之间。

注:后来我一个师妹跟我说这种化石时间标记有程序bug,前面的>.06不能被程序读取,推荐了另一种化石时间标记方式:'B(.06,.08)'

(注意,这里化石时间标记的单位是100个百万年,而不是1个百万年)

树文件代表的树的拓扑结构如下:

示例树文件的拓扑结构

我们自己的树文件常常是带枝长信息,想要去除枝长信息的话可以用notepad等编辑器打开树文件,手动删除枝长信息,还有一种简单的方法,在linux系统中运行下面的命令行,tree.nwk是输入的带枝长信息的树文件,output_tree.nwk是输出的不带枝长信息的树文件

perl -ne '$_=~s/:[\d\.]+//g; print $_;' tree.nwk > output_tree.nwk

3 控制文件

控制文件常命名为mcmctree.ctl,含有对程序的指令。

控制文件示例

各类型参数的含义如下:

1)输入输出参数

seed=-1 :

#设置一个随机数(正整数或负整数)来运行程序,若设置为-1,表示使用系统当前时间为随机数,因此每次运行mcmctree得到的结果会有所不同。

建议用seed=-1运行程序至少两次,检验两次运行的结果是否相近。如果每次运行的结果差别很大,可能是多种原因导致的:缓慢收敛(slow convergence)、不良混合(poor mixing)、采样不完全(insufficient samples taken), 或程序错误。

如果需要一个可重复的结果,可以设置一个特定的奇数或偶数

seqfile:比对序列文件名

treefile:树文件文件名

mcmcfile:针对设定的参数运行的MCMC的报告文件,可以用Tracer软件查看。

outfile:一旦程序运行完成,总结性的结果文件会写入该文件,该文件记录了超度量树和进化速率等参数信息。

2)数据使用说明参数

ndata:比对序列的分区数,在本例中,根据核苷酸在密码子中的位置(第一位、第二位和第三位)分成了三个分区,因此ndata=3。

自己的核苷酸比对数据怎么根据密码子第1、2、3位的位置进行分区呢?推荐一个在线的工具Split codons:https://www.bioinformatics.org/sms2/split_codons.html

usedata:设置是否利用多序列比对的数据

usedata = 0:不适用多序列比对数据,不会进行likelihood计算,虽然能得到mcmc树且计算速度飞快,但分歧时间结果有问题

usedata = 1 使用多序列数据进行likelihood计算,正常进行MCMC,是一般的使用参数

usedata = 2 进行正常的approximation likelihood分析,此时不需要读取多序列比对数据,直接读取当前目录中的in.BV文件,该文件是使用usedata=3参数生成的out.BV文件重命名而来。

usedata = 3:程序利用多序列比对数据调用baseml/codeml命令对数据进行分析,生成out.BV文件。

由于mcmctree调用baseml/codeml进行计算的参数设置可能不太好,尤其是蛋白序列,推荐自己修改该软件自动生成的baseml/codeml配置文件,然后手动运行baseml/codeml命令,再整合其结果文件为out.BV文件。

seqtype:比对序列的类型,=0代表核苷酸序列,=1代表密码子序列,=2代表氨基酸序列

clock:选择使用的分子钟模型,

clock=1:global clock的方法,假设所有分支的进化速率一致

clock=2:使用独立速率模型(independent rates model),在该模型中,速率符合对数-正态分布(也就是说速率的对数符合正态分布)

clock=3: 使用correlated rates的方法,和方法类似,但是log(r)的方差和时间(t)相关

RootAge:如果我们在树文件中没有对根提供时间校准,那么用参数对根提供一个时间校准。在示例文件中使用了<1.0,意思是所有猿的最近共同祖先出现的时间不会大于100个百万年前。

cleandata:设置是否移除不明确的字符或gap后再进行数据分析。

cleandata = 0不需要

cleandata = 1 需要

3)位点替换模型参数

model: 设置要使用的替换模型

model = 0: JC69,计算很快

model = 1: K80,

model = 2: F81,

model = 3: F84,

model = 4: HKY85

model = 7: GTR

alpha:核酸序列中不同位点,其进化速率不一致,其变异速率服从Gamma分布,一般设置gamma分布的alpha值为0.5:alpha = 0.5,若该参数设置为0,则表示所有位点的进化速率一致。

ncatG = 5 :设置离散型GAMMA分布的categories值

BDparas= 1 1 0.1: 控制出生-死亡过程的参数,设置出生率、死亡率和取样比例。

若输入有根树文件中的时间单位发生变化,则需相应修改出生率和死亡率的值。例如时间单位由100Myr变换成1myr,则要设置成:.01.01 .01

kappa_gamma = 6 2 :设置替换模型参数kappa(转换/颠换比率)的GAMMA先验。

alpha_gamma = 1 1: 设置替换模型中gamma形状参数(用于反应位点上不同的速率)alpha的GAMMA先验。

注意:当usedata = 2时,alpha、ncatG、alpha_gamma、kappa_gamma四个GAMMA参数无效,因为此时不会用到多序列比对的数据

3)进化速率参数

rgene_gamma = 2 20 1:设置序列中所所有位点平均(碱基/密码子/氨基酸)替换率的Dirichlet-GAMMA分布参数:

alpha=2、beta=20、初始平均替换率为每100million年(取决于输入有根树文件中的时间单位)1个替换。若时间单位由100Myr变换为1Myr,则要设置成"2 2000 1"。总体上的平均进化速率为:2 / 20 = 0.1 个替换 / 每100Myr,即每个位点每年的替换数为 1e-9。

sigma2_gamma = 1 10 1:设置所有位点进化速率取对数后方差(sigma的平方)的Dirichlet-GAMMA分布参数:alpha=1、beta=10、初始方差值为1。

当clock参数值为1时,表示使用全局的进化速率,各分枝的进化速率没有差异,即方差为0,该参数无效;

当clock参数值为2时,若修改了时间单位,该参数值不需要改变;

当clock参数值为3时,若修改了时间单位,该参数值需要改变。

finetune = 1: .1 .1 .1 .1 .1 .1:冒号前的值设置是否自动进行finetune,一般设置成1,然后程序自动进行优化分析;冒号后面设置各个参数的步进值:times, musigma2, rates, mixing, paras, FossilErr。由于有了自动设置,该参数不像以前版本那么重要了,可能以后会取消该参数。

4)mcmc参数

print:设置打印mcmc的取样信息

print = 0:不打印mcmc结果

print = 1:打印除了分支进化速率的其他信息(各内部节点分歧时间、平均进化速率,sigma2值)

print = 2:打印所有信息

burnin = 2000 :将前2000次迭代burnin后,再进行取样(即打印出打印出该次迭代计算的结果信息,各内部节点分歧时间、平均进化速率,sigma2值和各分支进化速率等)

samplefreq = 10 :每10次迭代取样一次

nsample = 20000 :当取样次数达到该次数时,则取样结束(程序也运行结束)

burnin= 2000,samplefreq= 10,nsample= 20000:总的意思是程序会去除掉(burnin)前2000次迭代的结果,然后每10次迭代取一次样,直到取样次数达到20000次,因此MCMC会运算2000+10*20000次迭代。一般来说,程序需要进行10000-20000次取样,才能获得较好的数据总结。一般来说,如果想通过增加MCMC长度来提高收敛效果,一般是通过增加samplefreq,但保持nsample在一个比较合理的范围。

别人的博客曾进行过一个其个人的总结,照抄如下:

数据简单时,进行0.5M迭代次数,burnin比例40%:{ burnin 200k; sampfreq 10; nsample 50k }

数据中等时,进行1M迭代次数,burnin比例40%:{ burnin 400k; sampfreq 10; nsample 100k }

数据复杂时,进行5M迭代次数,burnin比例20%:{ burnin 1000k; sampfreq 10; nsample 500k }

数据巨大时,进行10M迭代次数,burnin比例20%:{ burnin 2000k; sampfreq 100; nsample 100k

在Linux系统下运行时,将序列文件、树文件和控制文件放在同一个路径下,在该路径下运行程序:

which mcmctree  #查找mcmctree的路径

~/miniconda3/bin/mcmctree mcmctree.ctl  #~/miniconda3/bin/mcmctree是程序的绝对路径,mcmctree.ctl是控制文件的名字


用approximate likelihood calculation进行物种分化时间的估算

在对较大的数据进行likelihood function计算时,计算成本昂贵,耗时长,下面介绍针对较大比对数据的approximate likelihood计算的方法。

总共分两步,在第一步中,枝长、gradient、Hessian由最大似然法估算出,在第二步中,利用gradient、Hessian进行分化时间的估算,这一步用Taylor expansion的方法创造出近似于最大似然法的功能。

总的操作步骤如下:

新建一个文件夹Hessian,将树文件、序列文件和控制文件拷贝过去,控制文件中的usedata = 3,然后运行程序。程序运行结束后生成文件中有一个out.BV文件

再建立一个新文件夹approx01,将上一步中的out.BV文件、树文件、序列文件和控制文件拷贝过去,out.BV文件重命名为in.BV,控制文件中的usedata = 3改为usedata = 2。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容