系统发育分析各类方法

系统发育关系重建的方法是有很多的,耳熟能详的就有最大似然法(ML)、贝叶斯推断法(BI)、邻接法(NJ,距离法的一种代表性方法)、最大简约法(MP)等等,作为一个 Phylotranscriptomics 学者,学会各种建树方法也是很有必要的 —— 事实上,在很多文章中也能看到作者会采用好几种不同的方法来进行物种树重建(甚至乎会采用不同的进化模型)。这篇文讲的就是一个在研究中经常出现的软件 Astral。

在讲之前需要先明确一个概念,Astral 是一种 Coalescent-based method,这也是一个经常会在文章里面出现的词,此外还有 Concatenated-based method,关于两者的概念 ChatGPT 的说法:

  1. Coalescent-based method: Coalescent-based 方法是一种模拟基因座的共同祖先的过程来构建进化树的方法。在这种方法中,每个基因座可能有自己独立的进化历史,而不是假设整个基因组有一个统一的历史。这种方法通常用于处理物种树和基因树的不一致性,比如基因水平转移、混合和不完全谱系分选。这是一种比较复杂的方法,通常在研究种群遗传学和进化过程时使用。
  2. Concatenated-based method: Concatenated-based 方法是将多个基因或基因片段首尾连接起来,形成一个长的序列,并使用这个长序列来构建一个单一的进化树。这种方法基于这样的假设,即所有基因或基因片段在整个进化过程中遵循相同的历史(Juse 注:关于这一点我并不完全苟同,事实上很多软件例如 IQTREE 的分区模型都会将序列分成不同的区域并为它们应用不同的进化模型)。它是一种较为简单和直接的方法,通常用于较大的数据集。

换一种更简洁直白的说法,在我狭隘的理解中,前者是一种基于基因树的方法,而后者是一种基于串联序列(超矩阵)的方法。

Astral 运行方法

关于 Astral 的安装,可以前往其 github :Astral github

关于 Astral 的运行,在这里你或许能得到最全面的了解:Astral tutorial

本文将以尽量最简洁的方式介绍 Astral 的运行及注意事项。

正如前文所说,Astral 是一种基于基因树的物种树重建方法,所以它是需要一组基因树作为输入来推断物种树的,原理大致如下:

汇总多个基因树的信息重建物种树,并使得这个物种树与这组基因树的 Quartet Score 最大化(在考虑四个物种时,一棵树可以有三种不同的拓扑结构,Astral 则会尝试寻找一个最能解释基因树数据的物种树拓扑结构)。

关于基因树,大部分文章都是使用 ML 方法(可选软件有 IQTREE or RAxML)推断得到的,假设我们现在已经有一组基因树并且它们以 .treefile 结尾,那么我们可以用这种方法将它们合并:

1
$ cat *treefile >> all.treefile

然后使用 Astral 进行物种树重建(将 astral.5.7.8.jar 替换成自己的版本及路径):

1
$ java -jar astral.5.7.8.jar -i all.treefile -o astral.treefile 2> astral.log

最后生成的文件中,astral.treefile 为 Astral 的建树结果,astral.log 则包括各种信息。

astral.log 中有一行需要注意:

  • Final normalized quartet score is: 0.xxxx

这一行后的数字代表有多少基因树中的 quartet tree 出现在最终的物种树中,这一指标也可以作为物种树和基因树间一致性的衡量标准,如果其值过低,则可能表明了严重的 ILS/Introgression (不完全谱系分选 / 渐渗,皆为基因树不一致的重要成因) 现象。

也有方法可以改善 Quartet Score —— 修剪掉基因树中自展值低的分支,可以通过 nw_ed 完成该操作:

1
2
3
4
# 安装
$ conda install -c bioconda newick_utils
$ nw_ed all.treefile 'i & b<=10' o > all-BS10.treefile # 自展值低于 10 则剪去
$ java -jar astral.5.7.8.jar -i all-BS10.treefile -o astral-BS10.treefile 2> astral-BS10.log

注:conda 安装不成功的也可前往其 github 页面并根据引导使用 make 安装。

其他可能需要注意的地方

关于这一部分更详尽也请前往 Astral github tutorial 页面。

①、Astral 并不通过 bootstrapping 得到分支支持率,而是使用了一种称为局部后验概率的方法进行计算,这种计算方法得到的支持率描述了给定的 quartet tree 拓扑在基因树数据中的支持程度(可以简单地将其理解成物种树中这个分支的拓扑结构受基因树拓扑的支持程度)。当然我们也可以选择使用 bootstrapping 方法得到支持率(这个情况下我们也可以叫它自展值):

指定 -b-r 参数,其中 -b 指定某个文件,该文件中每一行都指定一个基因树自举文件的路径;-r 指定重复次数,默认为 100。

注:作者特意表明了在他们所探索的情况中,局部后验概率方法是比 bootstrapping 更可靠的。

②、关于内存的问题:如果数据集过大(包含非常多的物种或基因树),那么可能就需要给 Java 提供更多的可用内存确保 Astral 能正常运行:

1
$ java -Xmx3000M -jar astral.5.7.8.jar -i in.tree

其中 -Xmx3000M 指定了 3GB 的可用内存,也可以直接替换成 -Xmx3G 等。该值可视自身情况进行调整。其他一些基于 Java 开发的生信软件也可以通过该方法分配内存。

后记

Astral 本身的操作难度并不高,但大道至简,这并不妨碍它出现在各个文章之中并作为代表物种树使用。

如果数据集有着严重的 ILS 和 Introgression 现象,那么就需要谨慎地对待 Astral 的结果。