phangorn 构建系统发育树

2022-05-24 16:22:23 浏览数 (1)

最近小编在探索系统发育树的构建过程,今天也给大家介绍一个R包phanorn 。小编之前对树的构建知之甚少,如果你对系统发育树有更好的理解欢迎给我留言,有理解不对的地方也请批评指正~

phanorn 是一个用 R 语言进行系统发育重建和分析的软件包。phangorn 提供了使用基于距离的方法、最大简约或最大似然 (ML) 和执行 Hadamard 共轭来重建系统发育的可能性。该软件包扩展了通用 ML 框架,提供了估计混合和分区模型的可能性。此外,phangorn 提供了多种功能,用于比较树、系统发育模型或分裂、模拟字符数据和执行一致性分析。

首先安装 phangorn 包:

代码语言:javascript复制
install_github("KlausVigo/phangorn")

数据准备及读取

系统发育树的使用数据包括:形态学数据和序列数据(例如碱基序列),这里我们读取 phangorn 包内置数据集进行示例分析。

代码语言:javascript复制
library(ape)
library(phangorn)
fdir <- system.file("extdata/trees", package = "phangorn")
primates <- read.phyDat(file.path(fdir, "primates.dna"),
                        format = "interleaved")
代码语言:javascript复制
> class(primates)
[1] "phyDat"
> primates
14 sequences with 232 character and 217 different site patterns.
The states are a c g t

构建系统发育树

在读入 alignment 的数据后,我们可以使用多种方法构建系统发育树。系统发育树的构建方法主要包括:基于距离的UPGMA、NJ 以及最大简约法(MP)、最大似然法(ML)和贝叶斯法。下面主要介绍基于距离的方法及最大简约法。

基于距离的方法

ape 包中的 dist.dna 函数可用于计算许多 DNA 替换模型的距离。要使用函数 dist.dna,我们必须将数据转换为 DNAbin 类。在构造距离矩阵之后,我们使用 UPGMA 重建有根树,或者使用邻接法(NJ)重建无根树。

代码语言:javascript复制
dm  <- dist.ml(primates)
treeUPGMA  <- upgma(dm)
plot(treeUPGMA, main="UPGMA")
treeNJ  <- NJ(dm)
plot(treeNJ, "unrooted", main="NJ")

基于距离的方法计算速度非常快,后面将使用 UPGMA 和 NJ 树作为最大简约性和最大似然分析的起始树。

最大简约树

最大简约树是传统构建系统发育树中最常用的方法。简约原则即在其他条件相同的情况下,最好的假设是要求树发生最少进化改变。phangorn 包 parsimony 函数使用 sankoff 或 fitch 算法返回树的简约分数。

代码语言:javascript复制
> parsimony(treeUPGMA, primates)
[1] 751
> parsimony(treeNJ, primates)
[1] 746

optim.parsimony 使用最近邻交换 (NNI) 重新排列或子树修剪和重新移植 (SPR) 来找到最大简约树。

代码语言:javascript复制
> treePars  <- optim.parsimony(treeNJ, primates)
Final p-score 746 after  1 nni operations
> plot(treePars)

构建最大简约树的另一个版本是简约棘轮(parsimony ratchet),该方法可能能够找的比NNI/SPR重排方法更好树。

  1. 从原始数据集中构建 bootstrap 数据集Db
  2. 选择当前最好的树,并在Db上对树进行重排,将 bootstrap 树保存为Tb
  3. 使用Tb树在原始数据集上进行树的重排,如果这棵树的简约分数低于当前最好的那棵树,则这棵树为最好的树
  4. 迭代 1:3 直到达到给定的迭代次数或者多次迭代没有变化
代码语言:javascript复制
> treeRatchet  <- pratchet(primates, trace = 0)
> parsimony(c(treePars, treeRatchet), primates)
[1] 746 746

接着进一步计算树的分支长度,分支长度与替换/位点的数量成正比。

代码语言:javascript复制
treeRatchet  <- acctran(treeRatchet, primates)
plotBS(midpoint(treeRatchet), type="phylogram")

img

以上是关于树的构建,图片展示较为简单,系统发育树的个性化展示推荐大家可以使用Y叔的 ggtree 包。

参考链接

https://cran.r-project.org/web/packages/phangorn/vignettes/Trees.html#introduction

https://github.com/KlausVigo/phangorn

0 人点赞