4. 常见测序错误类型:替换、插入、缺失归纳总结
测序数据里的错误,说白了就三种:替换、插入、缺失。我做了这么多年测序分析,几乎每天都在跟它们打交道。你可能会想,为什么非要搞清楚这些错误类型?因为不同类型的错误,过滤策略完全不同——一刀切往往会把好数据也扔了。
先看一张图,把三种错误的来源和特点理清楚,后面我们再逐个拆解。
4.1 替换错误(Substitution)
替换错误就是读段里的某个碱基被换成了另一个。比如真正的A读成了C。这是最常见的错误类型,尤其在Illumina平台上占到总错误量的90%以上。
为什么会发生?我总结了几条核心原因:
- PCR聚合酶错配:文库构建时经过多轮PCR,Taq或高保真酶都有一定错配率。我记得早期项目用Taq酶做16S扩增子,替换率直接飙到1%,逼得我换用KAPA HiFi才降到0.1%以下。
- 荧光信号交叉:Illumina边合成边测序时,四种碱基的荧光光谱会有少量重叠,尤其在低质量碱基处容易判错。
- 碱基修饰损伤:比如C脱氨变成U,测序时会读成T。我在处理古老DNA时遇到过这种问题,需要用UNG酶处理。
替换错误通常不会造成移码,但对SNP / 变异检测影响极大。你看下面这个真实的read片段:
真正序列:ATCGATCGATCG
读到的 :ATCGAT**G**GATCG (第7位A→G 替换)
质量值 :??????????Q?? (低质量碱基往往伴随低Q值)
避坑指南:我曾经在过滤时只盯着平均质量值,结果发现一批reads Q30很高,但变异检测假阳性率却异常高。后来一查,这些reads的末尾20bp频繁出现A→G替换。所以现在我的脚本里会专门用每个位置的碱基分布柱状图来筛查系统性的替换热点。
4.2 插入错误(Insertion)
插入错误就是read里多出了一个或多出来的碱基。比如说原始序列是ACGT,你读成了ACXGT(插了个X)。
插入错误最典型的场景:
- 均聚物区(Homopolymer):连续相同的碱基,如
AAAAA。测序酶在这一段“打滑”,多合成一个A。PacBio和ONT平台尤其严重,Illumina相对少见。 - 衔接头污染:两端衔接头没有完全去除干净,在read中间插入一段未知序列。我有个同事曾经因为衔接头污染没清理干净,导致de novo组装出一堆假contig——排查了两天才找到根源。
- 测序错误本身:Sanger测序和长读长测序也偶尔出现。
插入错误会引发移码,对蛋白编码区的分析是致命打击。来看一个实际的例子:
参考序列:ATG CCA TGA(Met-Pro-Stop)
有插入 :ATG A**G**CCA TGA(Met-Arg-Pro-? 移码)
一个单碱基插入就能让后面所有氨基酸都变掉。所以很多RNA-seq和宏基因组分析会把有indel的reads直接过滤掉——虽然有些粗暴,但省心。
4.3 缺失错误(Deletion)
缺失错误就是read里少了一个或几个碱基。比如ACGT读成了AGT,少了中间的C。
常见原因:
- 同聚物区压缩:跟插入正好相反,酶在重复区“跳步”跳过去了。
- 校正过度:一些校正算法会把低质量碱基直接删掉,导致人工缺失——我早期用过某个软件,默认开启aggressive筛选,结果250bp的读段变成230bp,校正过度造成大量假阳性缺失。
- 剪接和结构变异:不过这里我们只讨论测序技术本身的缺失错误。
缺失错误对基因分型和拷贝数变异检测影响很大。举个例子:
真实序列:ATCGATCGATCG(12bp)
测序结果:ATCGA...ATCG(10bp,中间缺失2bp)
如果是剪接位点正好在缺失区域,可能错误地认为那是外显子跳过的证据。
4.4 三类错误的对比表
我习惯把三种错误放在一张表格里对比,方便查漏补缺。下面这个表你存下来,用的时候直接翻:
| 错误类型 | 核心原因 | 对读段影响 | 最常出现的平台 | 过滤策略参考 |
|---|---|---|---|---|
| 替换 | PCR错配、荧光串扰 | 单碱基变异,不导致移码 | Illumina | 根据Q值截断;检查位置特异性错误率 |
| 插入 | 均聚物滑移、衔接头 | 移码;可能引入假阳性ORF | PacBio / ONT | 过滤含连续≥5个相同碱基的区域 |
| 缺失 | 同聚物压缩、校正过度 | 移码;影响比对长度 | PacBio / ONT / Sanger | 比对后检查gap分布;设置最小比对长度 |
4.5 实战小结
看到这里,你应该已经能区分测序错误的三种类型了。说白了,替换是“把A看成了C”,插入是“多写了一个字母”,缺失是“漏写了一个字母”。
我个人习惯在拿到一个新的测序数据集后,第一件事就是跑一下FastQC,看看每个位置的碱基分布——通过那个图很容易发现系统性的替换错误(某位置出现非预期碱基比例高企)。如果发现某个位置错误率特别高,我会回去检查建库流程:是不是引物产生了bias?还是样本本身有修饰?
另外,不同平台错误的“风味”完全不同:Illumina偏爱替换,长读长测序偏爱indel。所以不要用一套参数去过滤所有数据——那是新手常犯的错误。我曾经在一个ONT项目中套用了Illumina的过滤脚本,结果把70%的reads都删掉了——后来调整了indel容忍度,才保住了大部分有效数据。
记住,过滤不是越狠越好,而是要在去除噪声和保留信号之间找到平衡点。下一分析步骤中,我们就要把这类错误信息转化为具体的过滤阈值和策略了。