621_分子进化选择压力分析¶
一句话概述: dN/dS(ω值)是衡量基因是否受到自然选择的核心指标——ω>1表示正选择(基因在快速进化适应新环境),ω<1表示纯化选择(基因功能很重要不能变),ω≈1表示中性进化。PAML和HyPhy是分析选择压力的两大主力工具。
核心知识点速查表¶
| 概念 | 白话解释 |
|---|---|
| dN | 非同义替换率——导致氨基酸改变的突变速率 |
| dS | 同义替换率——不改变氨基酸的"沉默"突变速率 |
| ω (dN/dS) | 两者的比值,衡量选择方向和强度 |
| 正选择(ω>1) | 有利突变被自然选择保留(适应性进化) |
| 纯化选择(ω<1) | 有害突变被淘汰(功能保守) |
| 中性进化(ω≈1) | 突变不影响适应性(随机漂变) |
| Branch model | PAML分支模型——检测特定谱系是否受正选择 |
| Site model | PAML位点模型——检测哪些位点受正选择 |
| Branch-site model | 分支-位点模型——特定谱系的特定位点 |
一、安装¶
# === PAML安装 ===
conda install -c bioconda paml # 安装PAML
codeml # 验证(会报错缺少控制文件,说明安装成功)
# === HyPhy安装 ===
conda install -c bioconda hyphy # 安装HyPhy
hyphy --version # 查看版本
# === ETE Toolkit(PAML的Python封装,更易用)===
pip install ete3 # 安装ETE3
二、数据准备¶
# === 第1步:准备密码子比对 ===
# 需要:蛋白序列比对 + CDS核苷酸序列 → 密码子比对
# 先用MAFFT比对蛋白序列
mafft --auto proteins.fasta > proteins_aligned.fasta
# 用PAL2NAL将蛋白比对映射回密码子比对
pal2nal.pl \
proteins_aligned.fasta \ # 蛋白比对
cds.fasta \ # CDS核苷酸序列
-output paml \ # 输出PAML格式
> codon_alignment.phy # 输出文件
# === 第2步:准备系统发育树 ===
# 用IQ-TREE建树(用密码子模型)
iqtree2 -s codon_alignment.phy -m MFP -bb 1000 -nt AUTO
# 将树转为无分支长度的NEWICK格式(PAML需要)
# 树格式示例:((human,chimp),mouse,rat);
三、PAML/CODEML分析¶
3.1 位点模型(Site Models)——哪些位点受正选择?¶
# === 准备CODEML控制文件 ===
cat > site_model.ctl << 'EOF'
seqfile = codon_alignment.phy * 密码子比对文件
treefile = tree.nwk * 系统发育树文件
outfile = site_model_results * 输出文件
noisy = 3 * 输出详细程度
verbose = 1 * 详细输出
runmode = 0 * 用户提供的树
seqtype = 1 * 密码子序列
CodonFreq = 2 * F3x4密码子频率模型
clock = 0 * 无分子钟
aaDist = 0 * 默认氨基酸距离
model = 0 * 一个ω比值给所有分支
NSsites = 0 1 2 7 8 * 测试的位点模型
* 0=M0(单ω), 1=M1a(近中性)
* 2=M2a(正选择), 7=M7(beta分布)
* 8=M8(beta+正选择)
icode = 0 * 标准遗传密码
fix_kappa = 0 * 估计kappa
kappa = 2 * kappa初始值
fix_omega = 0 * 估计omega
omega = 0.5 * omega初始值
getSE = 0 * 不计算标准误
RateAncestor = 0 * 不重建祖先序列
Small_Diff = .5e-6 * 收敛精度
cleandata = 1 * 删除有gap的位置
fix_blength = 0 * 估计分支长度
EOF
# === 运行CODEML ===
codeml site_model.ctl # 运行(可能需要几分钟到几小时)
3.2 解读位点模型结果¶
# 查看结果文件
grep "lnL" site_model_results # 提取各模型的似然值
# === 似然比检验(LRT)===
# 比较M1a vs M2a(检测正选择)
# 比较M7 vs M8(检测正选择,更严格)
# === R语言做LRT ===
# M1a vs M2a
lnL_M1a <- -5123.45 # 从结果文件中获取
lnL_M2a <- -5118.90
LRT <- 2 * (lnL_M2a - lnL_M1a) # 似然比统计量
df <- 2 # 自由度差(M2a比M1a多2个参数)
p_value <- 1 - pchisq(LRT, df) # p值
cat("M1a vs M2a:\n")
cat(" LRT =", LRT, "\n")
cat(" p-value =", p_value, "\n")
if (p_value < 0.05) {
cat(" 结论: 存在正选择位点!\n")
} else {
cat(" 结论: 无显著正选择证据\n")
}
# 如果M2a显著优于M1a,查看BEB(Bayes Empirical Bayes)结果
# BEB后验概率>0.95的位点被认为是正选择位点
3.3 分支-位点模型(Branch-site Model)¶
# 在树文件中标记前景分支(在分支上加 #1)
# 例如:((human #1,chimp),mouse,rat);
cat > branch_site.ctl << 'EOF'
seqfile = codon_alignment.phy
treefile = tree_foreground.nwk * 标记了前景分支的树
outfile = branch_site_results
seqtype = 1
CodonFreq = 2
model = 2 * 分支-位点模型
NSsites = 2 * 模型A
fix_omega = 0 * 备择假设:估计omega
omega = 1.5 * omega初始值
EOF
codeml branch_site.ctl # 运行备择模型(Model A)
# 然后修改控制文件运行零假设
# fix_omega = 1, omega = 1(固定omega=1)
# 比较两个模型的LRT
四、HyPhy分析¶
4.1 BUSTED——检测整体选择¶
# BUSTED: 检测比对中是否存在正选择的证据
hyphy busted \
--alignment codon_alignment.fasta \ # 密码子比对
--tree tree.nwk \ # 系统发育树
--output busted_results.json # JSON输出
4.2 MEME——检测位点水平正选择¶
# MEME: 混合效应模型,允许ω在分支间和位点间都变化
hyphy meme \
--alignment codon_alignment.fasta \
--tree tree.nwk \
--output meme_results.json
# MEME比PAML的位点模型更灵活
# 不需要预先指定前景分支
4.3 FUBAR——快速位点选择检测¶
# FUBAR: 比FEL更快更敏感
hyphy fubar \
--alignment codon_alignment.fasta \
--tree tree.nwk \
--output fubar_results.json
# 输出:每个位点的dN和dS后验均值
# 后验概率>0.9的位点被认为受选择
4.4 RELAX——选择压力松弛/增强检测¶
# RELAX: 检测特定分支是否经历了选择放松或增强
hyphy relax \
--alignment codon_alignment.fasta \
--tree tree_labeled.nwk \
--test Foreground \ # 检测前景分支
--output relax_results.json
# K>1: 选择增强(更强的纯化或正选择)
# K<1: 选择松弛(约束减弱)
五、PAML vs HyPhy对比¶
| 特性 | PAML (CODEML) | HyPhy |
|---|---|---|
| 语言 | C | C++ |
| 界面 | 控制文件(学习曲线高) | 命令行(较友好) |
| 位点模型 | M0-M8 | FEL, FUBAR, MEME |
| 分支模型 | 支持 | aBSREL |
| 分支-位点模型 | Model A | MEME, BUSTED |
| 检测负选择 | 有限 | FEL, FUBAR支持 |
| 前景分支 | 需预先指定 | MEME/aBSREL自动搜索 |
| 输出格式 | 文本 | JSON(易解析) |
| 引用率 | 极高 | 高 |
六、常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Error reading sequence file | 比对格式不对 | 用PAML格式(phylip-sequential) |
Check tree file | 树格式错误 | 确认Newick格式和物种名匹配 |
omega stuck at boundary | 初始值不好 | 试不同omega初始值(0.5, 1.5, 3) |
Convergence problem | 模型太复杂 | 多试几个初始值 |
Alignment has stop codons | 密码子比对有终止密码子 | 用PAL2NAL时加-nogap |
七、面试高频题¶
Q1:dN/dS的生物学含义是什么?¶
答: dN是导致氨基酸改变的突变率(非同义替换),dS是不改变氨基酸的突变率(同义替换)。dS可以理解为"中性突变的基线速率"。ω=dN/dS就是相对于中性的实际进化速率:ω>1说明改变氨基酸的突变被选择保留了(正选择/适应性进化);ω<1说明改变氨基酸的突变被淘汰了(纯化选择/功能保守);ω≈1说明突变是中性的。
Q2:为什么要用密码子比对而不是核苷酸比对?¶
答: 因为密码子是进化的基本单位——三个碱基编码一个氨基酸。如果用普通核苷酸比对,gap可能插在密码子中间,破坏阅读框。密码子比对确保gap以三个碱基为单位插入。正确做法是:先比对蛋白序列(蛋白比对更准确),再用PAL2NAL映射回密码子。
Q3:PAML的位点模型怎么做假设检验?¶
答: 用嵌套模型的似然比检验(LRT):(1) M1a vs M2a——M1a假设只有ω<1和ω=1两类位点(无正选择),M2a增加了ω>1的类别。LRT显著说明存在正选择位点。(2) M7 vs M8——M7用β分布描述ω在0-1间的变化(无正选择),M8增加一个ω>1的类别。M7 vs M8被认为更严格。显著后看BEB结果找具体哪些位点受正选择(后验概率>0.95)。
Q4:在微生物学中,选择压力分析有什么应用?¶
答: (1) 检测致病基因的适应性进化——如毒力因子、抗生素抗性基因是否在正选择下快速进化;(2) 分析宿主-病原体互作的"军备竞赛"——表面抗原通常受正选择以逃避免疫;(3) 鉴定功能重要的保守位点——强纯化选择下的位点可能是药物靶点;(4) 比较共生菌与自由生活菌的进化模式——共生菌往往经历基因组缩减和选择放松。
参考资料:PAML Beginner's Guide: Álvarez-Carretero et al., MBE 2023 | HyPhy: Kosakovsky Pond et al., MBE 2005 | Yang, MBE 2007 | github.com/abacus-gene/paml-tutorial