长读测序错误纠正策略¶
一句话说明¶
长读测序(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) |