跳转至

621_分子进化选择压力分析

一句话概述: dN/dS(ω值)是衡量基因是否受到自然选择的核心指标——ω>1表示正选择(基因在快速进化适应新环境),ω<1表示纯化选择(基因功能很重要不能变),ω≈1表示中性进化。PAML和HyPhy是分析选择压力的两大主力工具。

核心知识点速查表

概念白话解释
dN非同义替换率——导致氨基酸改变的突变速率
dS同义替换率——不改变氨基酸的"沉默"突变速率
ω (dN/dS)两者的比值,衡量选择方向和强度
正选择(ω>1)有利突变被自然选择保留(适应性进化)
纯化选择(ω<1)有害突变被淘汰(功能保守)
中性进化(ω≈1)突变不影响适应性(随机漂变)
Branch modelPAML分支模型——检测特定谱系是否受正选择
Site modelPAML位点模型——检测哪些位点受正选择
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
语言CC++
界面控制文件(学习曲线高)命令行(较友好)
位点模型M0-M8FEL, FUBAR, MEME
分支模型支持aBSREL
分支-位点模型Model AMEME, 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