跳转至

619_系统发育分析BEAST2

一句话概述: BEAST2是贝叶斯系统发育分析的标准软件,使用MCMC算法同时估计系统发育树、分歧时间和群体历史参数,能给树的每个节点标上"多少年前分化"的时间标尺。

核心知识点速查表

概念白话解释
BEAST贝叶斯进化分析采样树——同时估计树和参数
MCMC马尔可夫链蒙特卡罗——贝叶斯推断的采样算法
Molecular clock分子钟——假设DNA突变以恒定速率积累
Strict clock严格分子钟——所有分支相同进化速率
Relaxed clock松弛分子钟——不同分支速率可不同(更现实)
Calibration校准点——用化石或已知分化时间锚定时间尺度
Posterior后验概率——综合数据和先验的最终推断
ESS有效样本大小,>200才算收敛
BEAUtiBEAST配套的图形界面配置工具
Tracer查看MCMC收敛性的工具
TreeAnnotator生成最大可信度树(MCC tree)

一、安装

# === 下载安装BEAST2 ===
# 从 https://www.beast2.org/ 下载对应系统的安装包
# Linux:
wget https://github.com/CompEvol/beast2/releases/download/v2.7.8/BEAST.v2.7.8.Linux.x86.tgz
tar -xzf BEAST.v2.7.8.Linux.x86.tgz  # 解压
export PATH=$PATH:$(pwd)/beast/bin  # 添加到PATH

# 验证
beast -version  # 查看BEAST版本
beauti           # 打开BEAUti图形界面

# 安装辅助工具
# Tracer: https://github.com/beast-dev/tracer/releases
# FigTree: https://github.com/rambaut/figtree/releases

二、分析流程概述

FASTA比对 → BEAUti配置XML → BEAST运行MCMC → Tracer检查收敛 → TreeAnnotator总结树 → FigTree可视化

三、用BEAUti配置分析

3.1 导入数据

1. 打开BEAUti
2. File → Import Alignment → 选择比对好的FASTA/NEXUS文件
3. 在Partitions标签页确认数据正确

3.2 设置分子钟模型

Clock Model标签页:
- Strict Clock(严格钟): 所有分支速率相同,简单但不现实
- Relaxed Clock Log Normal(松弛钟-对数正态): 推荐!每条分支速率从对数正态分布中独立抽取
- Relaxed Clock Exponential: 速率从指数分布抽取

3.3 设置校准点

Priors标签页:
1. 点击 "+ Add Prior" 添加校准先验
2. 选择树上的节点(MRCA)
3. 设置时间先验分布(如正态分布:均值=10Ma,标准差=2Ma)
4. 至少需要一个校准点来锚定时间尺度

3.4 MCMC设置

MCMC标签页:
- Chain Length: 链长度(通常1000万-1亿)
- Store Every: 每N步记录一次(通常1000-5000)
- Log Every: 每N步记录日志
- 预估:简单数据10M步,复杂数据100M步

四、命令行运行BEAST

# === 运行BEAST ===
beast \
    -threads 8 \               # 使用8个线程
    -beagle_SSE \              # 启用SSE加速
    -overwrite \               # 覆盖已有结果
    analysis.xml               # BEAUti生成的XML配置文件

# === 后台运行(推荐,因为很耗时)===
nohup beast -threads 16 analysis.xml > beast.log 2>&1 &

# === 恢复中断的运行 ===
beast -resume analysis.xml     # 从上次中断处继续

五、检查MCMC收敛(Tracer)

# 打开Tracer查看.log文件
tracer analysis.log

# 关键检查项:
# 1. ESS (有效样本大小) — 所有参数的ESS必须>200
# 2. Trace plot — 链应该像"毛毛虫"一样上下波动,不应有趋势
# 3. Posterior — 后验概率应平稳
# 4. TreeLikelihood — 似然值应平稳
# === 用Python快速检查ESS ===
import re  # 正则表达式

# 读取BEAST日志的最后几行
with open("analysis.log", 'r') as f:
    lines = f.readlines()

# 跳过注释行
header = None
for i, line in enumerate(lines):
    if not line.startswith('#'):
        header = line.strip().split('\t')
        data_start = i + 1
        break

print("参数列表:")
for j, param in enumerate(header):
    print(f"  {j}: {param}")

# 注意:完整ESS计算需要用Tracer
# 这里只是快速检查链是否在运行
print(f"\n总步数: {lines[-1].split()[0]}")

六、生成最终树

# === 用TreeAnnotator生成最大可信度树(MCC tree)===
treeannotator \
    -burnin 10 \               # burn-in比例(去掉前10%的样本)
    -heights median \          # 节点高度用中位数
    analysis.trees \           # BEAST输出的树文件
    mcc_tree.nex               # 输出MCC树

# heights选项:
# median — 节点高度取中位数(推荐)
# mean — 取均值
# ca — 共同祖先高度(推荐用于分化时间估计)

可视化

library(ggtree)  # 加载ggtree
library(treeio)  # 读取BEAST树

# 读取BEAST的MCC树
tree <- read.beast("mcc_tree.nex")  # 读取

# 画时间标尺树
ggtree(tree, mrsd = "2024-01-01") +  # mrsd: 最近样本日期
    geom_tiplab(size = 3) +  # 叶节点标签
    geom_range("height_0.95_HPD",  # 95% HPD区间
               color = "steelblue", 
               alpha = 0.3,
               size = 2) +
    theme_tree2() +  # 时间轴主题
    scale_x_continuous(
        name = "Time (years ago)"  # x轴标签
    )

ggsave("beast_time_tree.pdf", width = 12, height = 8)

七、常用XML片段(手动编辑)

<!-- 松弛分子钟设置示例 -->
<branchRateModel id="RelaxedClock" 
    spec="beast.evolution.branchratemodel.UCRelaxedClockModel"
    rateCategories="@rateCategories" 
    tree="@Tree">
    <LogNormal id="LogNormalDistributionModel" 
        name="distr" 
        meanInRealSpace="true">
        <parameter id="ucldMean" name="M" value="1.0"/>
        <parameter id="ucldStdev" name="S" value="0.3"/>
    </LogNormal>
</branchRateModel>

八、常见报错与解决

报错信息原因解决方案
ESS < 100链没跑够增加chain length或合并多条链
Operator xxx has zero acceptance参数空间探索不够调整operator的tuning参数
Prior probability = -Infinity先验设置不合理检查校准先验的范围
OutOfMemoryErrorJava内存不足beast -java -Xmx8g analysis.xml
TreeLikelihood not improving模型太复杂或数据太少简化模型或增加数据
NaN in likelihood数值溢出检查比对质量和序列长度

九、面试高频题

Q1:贝叶斯建树和最大似然建树有什么区别?

答: ML法找一棵最优树,给出一个点估计。贝叶斯法通过MCMC采样,得到一个树的分布(后验分布),能给出每个参数的不确定性区间。BEAST最大的优势是能同时估计树拓扑、分支长度、分化时间和群体大小参数,而ML法通常需要分步处理。代价是BEAST运行时间长很多(小时到天级别)。

Q2:严格分子钟和松弛分子钟有什么区别?

答: 严格分子钟假设所有谱系以相同速率进化——这在近缘物种间可能成立,但远缘物种间通常不成立(比如鼠的进化速率比象快)。松弛分子钟允许不同分支有不同速率,更符合生物学现实。两种松弛钟:非相关松弛钟(每条分支独立抽样)和自相关松弛钟(相邻分支速率相关)。一般推荐用Uncorrelated Log-normal松弛钟。

Q3:如何判断BEAST的MCMC是否收敛?

答: 三个标准:(1) 所有参数的ESS(有效样本大小)≥200——用Tracer查看;(2) Trace plot呈"毛毛虫"状——没有趋势或跳跃;(3) 多条独立链给出相似的后验分布。如果没收敛:增加链长度、调整operator、简化模型、或跑多条独立链合并结果。

Q4:BEAST2的校准先验怎么设置?

答: 校准先验是用已知的进化事件给时间树一个"锚点"。来源:(1) 化石记录——已知某个分化事件至少发生在X百万年前;(2) 已发表的分化时间估计;(3) 地质事件(如板块分离)。设置时用概率分布(正态、对数正态或均匀分布)表达不确定性。至少需要一个校准点,多个更好。校准点选择不当会严重影响时间估计。


参考资料:BEAST 2: Bouckaert et al., PLOS Comp Biol 2019 | Taming the BEAST: taming-the-beast.org | BEAST X: Suchard et al., Nature Methods 2025 | beast2.org