R实战:系统发育树的数据集成操作及可视化
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 系统发育树文件格式

用来存储系统发育树及其节点和分支相关数据的文件格式有很多种,其中有3种较为常见的文件格式,即Newick[1]、NEXUS[9]和Phylip[10]。有些格式(如NHX格式)是从Newick格式扩展而来的。在进化生物学中,大多数软件都支持Newick和NEXUS作为输入格式,而有些软件(如BEAST和MrBayes)则通过引入的新规则或数据模块来存储进化推论,从而更新标准文件格式。也有一些软件(如PAML和r8s)所输出的日志文件只能被软件自身识别。

1.2.1 Newick树文件

Newick格式是计算机可读形式的树文件标准格式。图1.2所示为使用Newick文本编码树结构,叶节点于右侧对齐,在每个分支的中间标记分支的长度。

图1.2中的有根树可以表示为以下字符序列组成的Newick树文本格式。

树文本以分号结尾,其内部节点由一对匹配的括号表示,而括号里面是该节点的后代节点。例如,(t2:0.04,t1:0.34)表示为t2和t1的父节点,t2、t1均为其直系后代。同级的内部节点用逗号分隔,同时叶节点则用它们的名称表示。枝长(从父节点到子节点)由子节点后面的实数表示,两者之间用冒号分隔。与内部节点或分支相关联的单一数据(如自举值)可以被编码为节点标签,并用冒号前面简单的文本或数字表示。

图1.2 使用Newick文本编码树结构的示例

1984年,Meacham为Phylip[11]软件包开发了Newick格式。Newick是当下使用最为广泛的进化树格式,被应用于许多程序中,如Phylip、PAUP*[12]、TREE-PUZZLE[13]、MrBayes。Phylip格式中包含了Phylip多序列比对结果和基于此比对结果所构建的Newick树文本。

1.2.2 NEXUS格式

NEXUS格式[9]整合了Newick格式的树文本及相关信息,将它们分配到不同模块(blocks)中。NEXUS模块具有以下结构。

例如,可以将上面的示例树保存为以下NEXUS格式。

树的注解信息(Comments)会被存储在方括号中。一些模块[如TAXA(包含分类单元信息)、DATA(包含数据矩阵,如序列比对信息)和TREES(包含进化树,即Newick树文本)]可以被大多数程序识别。由于模块非常多样化,因此有一些模块只能被特定程序识别。例如,由PAUP*输出的Nexus文件中,包含PAUP*命令的paup模块;以及FigTree输出的Nexus文件中,包含可视化设置的figtree模块等。NEXUS格式用于将不同类型的数据分别存储到不同的模块中。支持读取Nexus文件的程序可以只解析它们能识别的模块,同时忽略它们不能识别的模块。这是一种很好的机制,因为它能使不同的程序解析相同的文件格式,不会由于文件中存在不受支持的数据类型而造成解析过程中断。但是,大多数程序仅支持解析TAXA、DATA和TREES模块。因此,开发一款能够读取Nexus文件中的各种数据模块的程序或平台对于系统发育数据的整合是非常有用的。

DATA模块常用于存储序列比对结果。用户也可以利用Phylip格式来存储树和序列数据,其本质上就是Phylip多序列比对结果加上Newick树文本。

1.2.3 NHX格式

Newick、NEXUS和Phylip主要用于存储进化树和一些基本的内部节点或分支关联的单一数据。而基于Newick(又被称为New Hampshire)的NHX格式(New Hampshire eXtended),除了可以用于储存注释节点或分支中的单一数据,还可以通过引入NHX标签(tag)来将多个数据与树节点相关联(内/外部节点均可)。NHX标签必须被放置于枝长之后的“[&&NHX”和“]”之间,这样就可以做到与NEXUS格式兼容,因为NEXUS会将“[”和“]”之间的字符定义为注解信息。NHX也是PHYLDOG[14]和RevBayes[15]的输出格式。ATV(A Tree Viewer)[16]是一个Java工具,用于查看以NHX格式存储的注释数据,但此工具已经停止维护。

下面是NHX定义文档中的示例树。

1.2.4 Jplace格式

Matsen[17]为存储映射至进化树的NGS(二代测序)短读序列数据(用于宏基因组分类)设计了Jplace格式。Jplace格式基于JSON格式构建,其中包含5个键(key):树(tree)、域(fields)、放置信息(placements)、元数据(metadata)和版本(version)。其中,树(tree)包含从Newick树格式扩展的树文本,它将边(edge)标签放在枝长信息之后的方括号中(如果其包含分支标签信息),并将边编号(edge number)放在边标签之后的花括号中。域(fields)中包含所放数据的头信息(header information)。放置信息(placements)是一个由多个pquery组成的列表。每个pquery包含两个键,一个是p,另一个是n(或nm)。其中,p表示具体的放置信息,n表示名称(或nm表示多个名称)。p是由该pquery中的放置信息组成的列表。

下面是一个Jplace格式的示例。

PPLACER[18]和EPA(Envolutionary Placement Algorithom)[19]都是以Jplace格式输出结果的。但是这两个程序并不包含对进化放置信息进行可视化的工具。PPLACER中的placeviz用于将Jplace格式的文件转换为phyloXML或Newick格式的文件,并使用Archaeopteryx进行可视化。

1.2.5 利用软件输出文件

RAxML[20]通过存储自举值(bootstrap)为内部节点标签,便可将其输出为Newick格式的文件。RAxML的另一种输出格式,是将自举值放在枝长后的方括号内。大多数支持解析Newick格式的软件都无法支持解析此种以枝长后的方括号存储自举值的格式,它们会忽略方括号中所包含的内容。

BEAST[21]用于输出NEXUS格式的文件,它也同样在树模块中引入方括号来存储经BEAST推断所得的进化证据。如果方括号内特征值的长度大于1(例如,最高概率密度或替换速率的范围),则还会在其方括号内添加花括号来存储这些信息。这些括号被放置在节点和枝长之间(在标签与冒号之间)。由于Newick格式中并没有定义方括号,且方括号在NEXUS格式中也是作为注解信息的保留字符存在的,因此标准的NEXUS解析器会将这些信息忽略。

下面是BEAST输出的TREE模块的示例。

BEAST会根据在BEAUti中所使用的分析模型,输出包含相应的进化推论的文件。例如,分子钟分析中包含了rate、length、height、posterior,以及对应的用于不确定性估计的HPD与极差。其中,rate表示估计的分支的进化速率,length表示以年为单位的枝长,height表示从节点到根的时间,posterior表示贝叶斯进化枝的可信度值。上面示例是通过分子钟分析输出的树文件,其中就应该包含以上这些推论,但为了节省空间,上面示例只显示了所估算的枝长length。此外,MEGA(Molecular Evolutionary Genetics Analysis)[22]也支持以BEAST兼容的NEXUS格式导出进化树。

MrBayes[23]是一个使用MCMC方法进行后验概率分布抽样的软件。利用该软件输出文件可通过两组方括号来对节点和分支分别进行注释。下面示例分别注释了节点的进化枝后验概率与分支的枝长估计值。

为了节省空间,此示例中的大部分推论信息都被删除,只保留了表示进化枝概率的prob和表示枝长平均值的length_mean。此文件的完整版本还包含了表示概率推断的prob_stddev、prob_range、prob(percent)、prob+-sd,以及每个分支的length_median、length_95%_HPD。

大部分支持解析NEXUS格式的软件在解析BEAST和MrBayes的输出文件时,都会将其中的进化推论当作注解信息而忽略。虽然FigTree支持解析BEAST与MrBayes输出文件中的进化推论,并可以使用它们在可视化层面对进化树进行注释,但想要以此将这些数据提取出来进行进一步分析仍然非常困难。

HyPhy[24]可用于系统发育分析,如祖先序列重建等。在进行祖先序列重建时,HyPhy会将包含所构建的祖先序列及Newick树文本的NEXUS格式文件作为主要的输出对象。但输出的文件并没有完全遵循NEXUS格式的标准。其中TAXA模块只储存了祖先节点的标签,而不含有外部节点的标签。MATRIX模块只储存了祖先节点的序列比对结果。由于其中不含有节点标签,因此无法被重新指定回存储于TREES模块中的树。以下为HyPhy的示例输出(为了节省空间,只显示了序列比对的前72bp)。

其他应用程序也可以输出有关联数据的进化树并含有丰富信息的文本。例如,通过r8s[25]会在日志文件中输出3棵树,即分别以时间、替换率和绝对替换率作为枝长标尺的TREE、RATE和PHYLO。

PAML(Phylogenetic Analysis by Maximum Likelihood)[26]是一个用于DNA或蛋白质序列系统发育分析的程序。BASEML和CODEML作为两个主要的程序,实现了多种模型在系统发育分析中的应用。BASEML可以通过许多可用的核苷酸替换模型(包括JC69、K80、F81、F84、HKY85、T92、TN93和GTR)来估计树拓扑结构、枝长和替换参数。CODEML可以通过密码子替换模型[27]估计同义和非同义替换发生的速率,以及进行正向选择的似然比检验。

BASEML用于输出mlb格式的文件,其中包含输入序列(分类单元)的比对结果、枝长信息的进化树,以及替代模型和其他所估算出的参数。同时,BASEML还用于输出一个rst补充结果文件,其中包含序列比对结果(如果进行了祖先序列重建,则会包含祖先序列)和序列比对中每个位点进化的朴素经验贝叶斯(Naive Empirical Bayes,NBE)概率。CODEML用于输出mlc格式的文件,其中包含树结构,以及所估算出的同义替代速率和非同义替代速率。与BASEML类似,CODEML也用于输出一个rst补充结果文件,不同之处在于其中位点被定义为密码子而不是核苷酸。解析这些文件的过程十分乏味,而且经常需要对数据进行许多后期处理,也需要用户拥有编程方面的专业知识(如Python[2]或Perl[3])。

有很多进化树的文件都通过引入方括号来存储额外信息。例如,RAxML格式用方括号存储自举值、NHX格式用方括号存储注释、Jplace格式用方括号存储边标签、BEAST格式用方括号存储进化估计等。但是不同软件中方括号的位置并不一致,而且不同软件会使用不同的规则来将相关数据存储到方括号中,这就使得解析相关数据变得非常困难。大多数软件只支持解析特定兼容文件中树的拓扑结构,而忽略了方括号内存储的信息。同时,对于一些包含无效字符的文件格式(如Jplace格式的tree域中的花括号),标准的解析器无法将树的拓扑结构解析出来。

由于不同的进化推理软件会产生不同的输出文件格式,所以我们很难提取出所需的系统发育信息或分类单元相关信息,并将其显示到同一棵进化树上进行进一步分析。虽然FigTree支持输出BEAST格式,但不支持大多数其他软件所输出的含有进化推理或关联数据的文件格式。而对于那些含有丰富输出的文本文件(如r8s、PAML等),任何用以查看进化树的软件都无法解析其中的树结构。用户需要具有很强的专业知识才能从输出文件中手动提取出进化树及其他所需的结果数据。同时,这种手动操作不仅十分缓慢,而且非常容易出错。

我们很难从这些在系统发育分析领域常用软件的不同输出格式中获取含有进化数据的系统发育树。有些输出格式(如PAML和Jplace)缺少支持解析这些文件的软件或编程库,而其他输出格式(如BEAST和MrBayes)只能解析出树结构而不能解析出其中的进化推论,因为大多数软件会将这些存储于方括号内的信息当作注解信息而省略。虽然FigTree能对BEAST和MrBayes所推断的进化统计数据结果进行可视化,但是不支持将这些数据提取出来以进行进一步的分析。不同的软件包实现不同的算法用于不同的分析[例如,用于dN/dS选择压力分析的PAML、用于祖先序列分析的HyPhy和用于天际线分析(skyline analysis)的BEAST]。因此,在进行基因组序列数据分析时,我们需要一个能高效灵活地整合不同的分析推断结果的工具,以便于更加全面地理解、比较数据,并进行进一步的分析。这也是我们想要开发一个编程函数库以解析来自各种来源的进化树及数据的动力所在。