619_系统发育分析BEAST2¶
一句话概述: BEAST2是贝叶斯系统发育分析的标准软件,使用MCMC算法同时估计系统发育树、分歧时间和群体历史参数,能给树的每个节点标上"多少年前分化"的时间标尺。
核心知识点速查表¶
| 概念 | 白话解释 |
|---|---|
| BEAST | 贝叶斯进化分析采样树——同时估计树和参数 |
| MCMC | 马尔可夫链蒙特卡罗——贝叶斯推断的采样算法 |
| Molecular clock | 分子钟——假设DNA突变以恒定速率积累 |
| Strict clock | 严格分子钟——所有分支相同进化速率 |
| Relaxed clock | 松弛分子钟——不同分支速率可不同(更现实) |
| Calibration | 校准点——用化石或已知分化时间锚定时间尺度 |
| Posterior | 后验概率——综合数据和先验的最终推断 |
| ESS | 有效样本大小,>200才算收敛 |
| BEAUti | BEAST配套的图形界面配置工具 |
| 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
二、分析流程概述¶
三、用BEAUti配置分析¶
3.1 导入数据¶
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 | 先验设置不合理 | 检查校准先验的范围 |
OutOfMemoryError | Java内存不足 | 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