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 知识体系小结:质量值从哪来到哪去

下面这张图总结了质量分数的完整流转过程。

Phred 质量值流转体系 Phred 质量值:从信号到过滤的全链路 测序仪原始信号 荧光强度 / 电流信号 碱基识别 + 质量打分 Phred Q = -10*log₁₀(P) ASCII 字符编码 Phred+33 / Phred+64 FASTQ 文件 4 行记录:ID / 序列 / + / 质量 FastQC 质量评估 Per base quality / Per sequence 预处理过滤 滑动窗口 / 长度 / 平均质量 注意!不同平台、不同版本可能使用不同的编码方案 处理前务必确认:Sanger (Phred+33) vs Illumina (Phred+64)

从图中可以看到,质量值从原始信号开始,经过碱基识别、编码,最终进入 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 的硬阈值,结果一半数据被砍掉了,后来发现完全是过度过滤。

好了,质量分数体系这部分就到这儿。理解了这个底层逻辑,后面的质控流程就会顺很多。