跳转至

长读测序错误纠正策略


一句话说明

长读测序(ONT/PacBio CLR)的原始错误率高达 5-15%,需要用纠错算法"洗干净"数据后才能做可靠分析,纠错方法分为自纠错(只用长读自己)和混合纠错(用短读帮长读改错)。


核心知识点

1. 长读测序的错误类型

平台主要错误类型原始准确率说明
ONT (R10.4.1)均匀随机错误~98% (Q20)新版本大幅改善
ONT (旧版 R9)同聚物(homopolymer)错误~90-95%AAAA 可能测成 AAA
PacBio CLR随机插入/缺失~85-90%但无系统偏差
PacBio HiFi极低错误>99.9%CCS 自纠错后

白话:ONT 的老毛病是连续相同碱基(如 GGGG)容易数错个数;PacBio CLR 是随机乱错但没有固定偏好。

2. 纠错策略分类

自纠错(Self-correction):只用长读数据 - 原理:同一区域被多条长读覆盖,取"多数投票"确定正确碱基 - 要求:覆盖度足够(通常 >30x) - 工具:Canu, CONSENT, FLAS - 优点:不需要额外短读数据 - 缺点:低覆盖区域纠错效果差

混合纠错(Hybrid correction):短读帮长读改错 - 原理:用高精度短读数据比对到长读上,修正错误碱基 - 工具:LoRDEC, proovread, FMLRC2 - 优点:纠错效果好,尤其是同聚物区域 - 缺点:需要额外的短读数据

组装后 polish(抛光):对组装结果进行纠错 - 原理:将读段重新比对到组装结果上,修正共识序列中的残余错误 - 长读 polish:Medaka (ONT), Arrow/DeepConsensus (PacBio) - 短读 polish:Pilon, NextPolish, Polypolish

3. HiFi 的 CCS 自纠错原理

  • PacBio HiFi 实际上是"硬件级自纠错"
  • 一条 DNA 模板被环化,聚合酶绕着读多圈(通常 10-30 passes)
  • 多圈的数据做共识序列(Circular Consensus Sequence),错误被平均掉
  • 最终准确率 >99.9%(Q30+)
  • 白话:就像让学生抄写同一篇课文 20 遍,每次都有几个错别字但位置不同,把 20 份对比取多数就能得到正确答案

4. 纠错对下游分析的影响

  • 基因组组装:纠错后 contig 的碱基准确率大幅提升
  • 基因预测:减少移码错误导致的假基因预测
  • 变异检测:减少假阳性 SNP/indel
  • 宏基因组 binning:提高 contig 的序列质量,改善 binning 精度

实战代码

# === 方案1:Medaka 纠错 ONT 组装结果(最常用) ===

# 1. 将ONT原始读段比对到组装结果
minimap2 -ax map-ont \                 # ONT比对模式
  assembly.fasta \                     # 组装结果
  ont_reads.fq.gz | \                  # ONT原始读段
  samtools sort -o aligned.bam         # 排序输出BAM
samtools index aligned.bam             # 建立索引

# 2. 用 Medaka 纠错(ONT官方推荐)
medaka_polish \                        # Medaka纠错命令
  -i ont_reads.fq.gz \                # 输入读段
  -d assembly.fasta \                  # 输入组装
  -o medaka_out/ \                     # 输出目录
  -m r1041_e82_400bps_sup_v5.0.0 \    # 模型(匹配测序化学版本)
  -t 16                               # 线程数

# === 方案2:短读 polish(Pilon) ===

# 3. 将短读比对到组装结果
bwa index assembly.fasta               # 建立BWA索引
bwa mem -t 16 \                        # BWA比对
  assembly.fasta \                     # 参考序列
  R1.fq.gz R2.fq.gz | \              # 配对短读
  samtools sort -o short_aligned.bam   # 排序

samtools index short_aligned.bam       # 建立索引

# 4. 运行 Pilon 纠错
java -Xmx64G -jar pilon.jar \         # 分配64GB内存
  --genome assembly.fasta \            # 输入组装
  --frags short_aligned.bam \          # 短读比对结果
  --output pilon_polished \            # 输出前缀
  --changes \                          # 输出修改记录
  --threads 16                         # 线程数

# === 方案3:多轮迭代纠错(推荐流程) ===

# 推荐顺序:长读 polish 2轮 → 短读 polish 2轮
# 第1轮 Medaka
medaka_polish -i reads.fq -d assembly.fa -o round1/ -t 16
# 第2轮 Medaka
medaka_polish -i reads.fq -d round1/consensus.fasta -o round2/ -t 16
# 第3轮 Pilon(用短读)
# ... 同上方案2的流程,输入改为 round2 的结果
# 评估纠错前后的组装质量
import subprocess                      # 系统命令调用

def compare_assemblies(before, after, ref):
    """比较纠错前后的组装质量"""
    # 使用 QUAST 评估
    cmd = (
        f"quast.py "                   # QUAST评估工具
        f"{before} {after} "           # 纠错前和后的组装
        f"-r {ref} "                   # 参考基因组
        f"-o quast_comparison/ "       # 输出目录
        f"--threads 8 "               # 线程数
        f"--labels before,after"       # 标签
    )
    subprocess.run(cmd, shell=True)    # 执行命令
    print("QUAST 报告已生成: quast_comparison/report.html")

# 统计 Pilon 修改数量
def count_pilon_changes(changes_file):
    """统计 Pilon 做了多少修改"""
    snps = 0                           # SNP修正数
    insertions = 0                     # 插入修正数
    deletions = 0                      # 删除修正数
    with open(changes_file) as f:      # 打开变更文件
        for line in f:                 # 逐行读取
            if "snp" in line.lower():  # SNP类型
                snps += 1
            elif "ins" in line.lower():  # 插入类型
                insertions += 1
            elif "del" in line.lower():  # 删除类型
                deletions += 1
    print(f"SNP修正: {snps}")          # 打印结果
    print(f"插入修正: {insertions}")
    print(f"删除修正: {deletions}")
    print(f"总修正: {snps + insertions + deletions}")

面试常问点

★ 长读测序纠错的主要方法有哪些?

参考答案:三种主要方法:(1) 自纠错——用长读之间的重叠区域进行多数投票纠错,如 Canu;(2) 混合纠错——用高精度短读数据帮长读改错,如 FMLRC2;(3) 组装后 polish——先组装再用读段回比修正共识序列,如 Medaka(长读)、Pilon(短读)。实际项目中推荐组合使用:先 Medaka polish 2 轮,再 Pilon polish 2 轮。

★ 为什么 HiFi 数据不需要额外纠错?

参考答案:HiFi 数据在测序仪内部就已经完成了纠错。DNA 模板被环化后聚合酶会绕环多次读取(10-30 passes),虽然每一次读取错误率约 10%,但通过对多次读取做共识序列(CCS),随机错误被平均掉,最终准确率能达到 99.9% 以上。这相当于"硬件级别的自纠错",省去了后续软件纠错的步骤。

★ 纠错时模型选择有什么讲究?

参考答案:必须匹配测序化学版本。比如 Medaka 有不同版本的模型(r1041_e82_400bps_sup 等),如果模型和实际使用的流通池化学版本不匹配,纠错效果会很差甚至更糟。使用前一定要根据测序仪型号、流通池版本、basecalling 模型来选择对应的纠错模型。


速查卡片

问题答案
ONT 原始准确率~95-98%(R10.4.1 + sup)
PacBio CLR 准确率~85-90%
PacBio HiFi 准确率>99.9%
长读 polish 工具Medaka (ONT), Arrow (PacBio)
短读 polish 工具Pilon, NextPolish, Polypolish
自纠错工具Canu, CONSENT
混合纠错工具FMLRC2, LoRDEC
推荐 polish 轮数Medaka 2轮 + Pilon 2轮
HiFi 纠错原理CCS 多圈共识序列
最常见错误类型同聚物长度错误 (ONT)