3. 测序质量分数体系(Phred 质量值)
聊到 NGS 数据质控,质量分数是绕不开的核心概念。说白了,它就是给每个碱基的打分——告诉你这个 A、T、C、G 到底靠不靠谱。
我刚开始接触高通量测序时,也困惑过:为啥一个简单的字母(比如“A”)后面要跟一堆乱七八糟的字符?后来才发现,这背后藏着整套质量评估的逻辑。今天我们就把它掰开揉碎了讲清楚。
3.1 质量分数的由来:从 Sanger 测序说起
质量分数这个概念,最早来自 Sanger 测序时代。当时 Phred 软件被用来读取测序仪的信号,然后给每个碱基一个质量值。这个值定义很简单:
- Q 值 = -10 × log₁₀(P),其中 P 是碱基出错的概率。
- Q30,意味着出错概率 0.1%,正确率 99.9%。
- Q20,出错的概率 1%,正确率 99%。
你想想看,Q30 和 Q20 虽然只差 10,但错误率差了 10 倍。在变异检测这类任务里,这个差距就是天壤之别。
我个人的习惯是,拿到数据第一件事,先看 Q30 的比例。低于 80% 的,基本就不太敢用了。
| Q 值 | 错误概率 (P) | 碱基正确率 | 典型应用 |
|---|---|---|---|
| Q10 | 10% | 90% | 几乎不可用 |
| Q20 | 1% | 99% | 基础比对可接受 |
| Q30 | 0.1% | 99.9% | 变异检测标准 |
| Q40 | 0.01% | 99.99% | 高精度应用 |
核心记忆点:质量值是概率的对数映射。每提高 10 分,错误率降低一个数量级。Q30 = 千分之一误差,Q40 = 万分之一误差。
3.2 从数值到字符:质量值的编码
机器不会直接保存数字,它用 ASCII 字符来表示。
Phred+33 编码(Sanger 标准):质量值加 33 后转为 ASCII 字符。这是目前最通用的格式,FASTQ 文件基本都用它。
Phred+64 编码(旧的 Illumina 标准):质量值加 64 后转为 ASCII 字符。我记得大概 1.8 版本之前的 Illumina 平台还在用这个,现在基本淘汰了。
为什么会有这种差异?嗯……历史原因吧。不同的测序仪厂商有自己的数据格式,后来为了统一,大家逐渐接受了 Phred+33。
举个例子看懂编码:
碱基序列: A C G T
质量分值: 30 30 30 30
Phred+33: '?' '?' '?' '?'
ASCII 对照: 30 + 33 = 63,查 ASCII 表 63 对应 '?'
一个简单的规律:如果你打开 FASTQ 文件看到很多 !,那说明质量值很低(! 的 ASCII 码是 33,对应质量 0)。如果看到 I 或 J,那大概率是 Phred+64 编码的旧数据。
避坑指南:我曾经遇到过一个项目,把 Illumina 1.3 的老数据当 Sanger 标准处理了。结果下游分析里所有低质量碱基都变成了高质量,最后才发现是编码方式搞混了。处理历史数据时,一定要先确认质量值的编码方式。
3.3 如何判断你的数据用哪种编码?
最简单的办法是看质量字符的范围。
| 编码格式 | ASCII 范围 | 质量值范围 | 常见平台 |
|---|---|---|---|
| Sanger / Phred+33 | 33 - 126 (! ~ ~) | 0 - 93 | 现在几乎所有平台 |
| Illumina 1.3+ / Phred+64 | 64 - 126 (@ ~ ~) | 0 - 62 | 旧 Illumina GA II |
| Illumina 1.8+ / Phred+33 | 33 - 126 (! ~ ~) | 0 - 93 | 新 Illumina 平台 |
也可以直接看 FASTQ 文件的前几行:
@SEQ_ID
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65
注意看第三行和第四行之间的 +。如果加号后面空白,说明质量值编码用跟序列相同的行数。如果加号后面有字符,那可能是旧格式。
我的经验:用 FastQC 跑一遍是最稳妥的。它的“Per base sequence quality”图会显示质量分布的 Boxplot。如果 Y 轴数值范围在 0-40 左右,一般是 Phred+33;如果能看到 40 以上的数字,那就要警惕 Phred+64 了。
3.4 质量值在预处理中的实际应用
知道了每个碱基的可靠程度,我们就可以做精准的过滤了。
滑动窗口裁剪 (Sliding Window Trimming):这是我最常用的策略。它不直接设一个固定的长度,而是沿着序列从 5‘ 端到 3’ 端滑动,计算窗口内的平均质量。一旦平均质量低于阈值,就把这个窗口及其后面的序列都剪掉。
举个例子:
序列: A C G T A C G T A C G T
质量: 30 35 28 32 12 8 30 35 28 32 15 10
窗口大小: 4
质量阈值: 20
窗口1 (1-4): (30+35+28+32)/4 = 31.25 > 20 ✅
窗口2 (2-5): (35+28+32+12)/4 = 26.75 > 20 ✅
窗口3 (3-6): (28+32+12+8)/4 = 20.0 = 20 ✅
窗口4 (4-7): (32+12+8+30)/4 = 20.5 > 20 ✅
窗口5 (5-8): (12+8+30+35)/4 = 21.25 > 20 ✅
窗口6 (6-9): (8+30+35+28)/4 = 25.25 > 20 ✅
窗口7 (7-10): (30+35+28+32)/4 = 31.25 > 20 ✅
窗口8 (8-11): (35+28+32+15)/4 = 27.5 > 20 ✅
窗口9 (9-12): (28+32+15+10)/4 = 21.25 > 20 ✅
全部通过,保留全长。
但如果质量阈值设为 25,窗口 3 的平均质量只有 20,那就会在位置 3 之后开始裁剪。这就是滑动窗口灵活的地方。
3.5 知识体系小结:质量值从哪来到哪去
下面这张图总结了质量分数的完整流转过程。
从图中可以看到,质量值从原始信号开始,经过碱基识别、编码,最终进入 FASTQ 文件和预处理工具。每一步都环环相扣。
3.6 实战工具中的质量参数
最后分享几个实际工程中用到的参数设置。
Cutadapt 质量裁剪:
cutadapt -q 20,20 -o output.fastq input.fastq
# -q 20,20 表示 5'端和3'端都按 Q20 裁剪
Trimmomatic 滑动窗口:
java -jar trimmomatic.jar SE -phred33 input.fastq output.fastq \
SLIDINGWINDOW:4:20 MINLEN:50
# SLIDINGWINDOW:窗口大小:平均质量阈值
# MINLEN:裁剪后最短保留长度
fastp 默认策略:
fastp -i in.fastq -o out.fastq --cut_front --cut_tail --qualified_quality_phred 15
# 自动裁剪 5'和 3'端的低质量区
工程注意:质量阈值的设置要跟你的下游分析匹配。做 RNA-seq 时严一点(Q30 以上),做宏基因组时可以适当放宽(Q20 以上)。我曾经在 16S 数据上设了 Q30 的硬阈值,结果一半数据被砍掉了,后来发现完全是过度过滤。
好了,质量分数体系这部分就到这儿。理解了这个底层逻辑,后面的质控流程就会顺很多。