2. 测序质量分数原理:Q-score、错误率与 Phred 编码

质量分数是测序数据的生命线。没有它,你手里的 FASTQ 只是一堆意义不明的碱基。我个人习惯在拿到一个 FASTQ 文件后,第一件事不是看比对率,而是先看质量分数的分布。为什么?因为它直接决定了后续分析的下限。

很多人觉得这部分理论性太强,直接忽略。但我不建议这么做。你想想看,如果你连 Q20 和 Q30 代表什么都说不清楚,遇到数据质量波动时,就只能干瞪眼。

2.1 从概率到分数:Q-score 定义

先说个最基础的概念。测序仪在判断某个位置是 A、T、C、G 时,是有概率出错的。这个概率用 P 表示。Q-score 就是把这个概率换算成一个更直观的分数。

Q = -10 × log₁₀(P)

说白了,就是把小数换算成整数。让普通人也能一眼看出好坏。Q-score 越高,代表出错的概率越低,我们越有信心。

举个例子:如果某个碱基的错误概率 P = 0.001,那么它的 Q-score 就是 -10 × log₁₀(0.001) = 30。这就是 Q30 的由来。

我的习惯:不要死记公式,要理解它的反比关系——错误概率每降低一个数量级(十分之一),Q-score 就增加 10。

2.2 读懂 Phred 分数:Q20 与 Q30 是什么水平?

行业里通常把 Q20 和 Q30 作为金标准。我在项目中遇到过不少新手,看到 Q30 就觉得“哇好高”,但 Q30 到底意味着什么?

Q-score 错误概率 (P) 碱基准确度 通俗理解
Q10 10% 90% 几乎不可信,基本不能用
Q20 1% 99% 及格线,常规分析可用
Q30 0.1% 99.9% 金标准,变异检测放心用
Q40 0.01% 99.99% 极致完美,基本上是真理
实战中,我一般要求清洗后的数据 Q30 比例在 85% 以上。低于这个数就要小心了。如果是做罕见变异检测,我甚至要求 Q30 比例 > 90%。

2.3 ASCII 编码:Phred+33 与 Phred+64

问题来了:计算机怎么存储这些整数分数?直接用二进制?嗯,FASTQ 是纯文本格式,更倾向于用 ASCII 字符来表示。

于是就引出了偏移量的概念。Phred 分数加上一个固定数值,再转成 ASCII 字符。

ASCII_Char = Q-score + Offset

两种主流偏移:

  • Phred+33 (Sanger / Illumina 1.8+):现代标准。范围 0-40+,对应 ASCII 码 33 ('!') 到 73 ('I') 以上。
  • Phred+64 (旧 Solexa / Illumina 1.3-1.7):已经被淘汰,但旧数据依然存在。范围 0-40+,对应 ASCII 码 64 ('@') 到 104 ('h') 以上。
我曾经掉进过一个大坑:有一次我拿到一个公开发布的古老数据集,直接用标准流程分析,结果质量分布图看起来极其诡异。排查了半天才发现,是编码识别脚本误判了 +33 和 +64。你想想看,如果偏移量搞错了,算出来的 Q-score 就全是错的,后续过滤也就失去了意义。

2.4 实战:如何判断 FASTQ 文件使用哪种编码?

怎么判断手里的文件是 +33 还是 +64?我教大家一个土办法。看一眼 FASTQ 第四行(质量行)的 ASCII 字符范围。

# 查看 FASTQ 文件前几行
head -n 8 sample.fastq

# 输出示例 (Phred+33)
@SRR001666.1 071112_SLXA-EAS1_s_7:5:1:817:345 length=36
GGGTGATGGCCGCTGCCGATGGCGTCAAATCCCACC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIII9IG9IC

看到质量行第一个字符是 I (ASCII 73),说明 Q-score 至少是 40 (73-33=40)。如果出现 @ (ASCII 64) 或 B (ASCII 66) 这类低字符,你就要警惕是不是 Phred+64 了。

更严谨的做法是用 od 看一下字符的 ASCII 值:

head -n 1000 sample.fastq | awk 'NR%4==0' | od -c | head -n 5
我的判断口诀:
如果最小值是 ! (ASCII 33),99% 是 +33 编码。
如果最小值是 @ (ASCII 64) 或 B,极大概率是 +64。
如果大量出现 # $ % 等符号,放心,它是 +33。

嗯,这里要注意。现在大部分测序数据都是 Phred+33 了。但处理 NCBI SRA 下载的旧数据(2010 年以前)时,一定要留个心眼。

质量分数生成与编码流程图 测序仪原始信号 碱基检出 (Base Calling) 计算错误概率 P Q-score 计算 Q = -10 × log₁₀(P) Phred 偏移 (+33 / +64) FASTQ 第4行 ASCII 质量字符串 ASCII 编码对照表示例 Q-score 值: 0 10 20 30 40 Phred+33 ASCII: ! + 5 I Phred+64 ASCII: @ J h 注意:'I' 在 Phred+33 中代表 Q40 但在 Phred+64 中 'I' 代表 Q9

2.5 质量分数原理总结

至此,你应该理解 FASTQ 中的“数字”其实是经过“错误概率 -> Q-score -> ASCII 字符”三层转化而来的。这一块是后续做质量过滤的基础。

很多初学者只停留在“Q30 就是好”的层面,不理解背后的原理,遇到异常数据就抓瞎了。

我个人觉得,能看懂质量行、能辨别编码格式,是一位合格生信工程师的基本功。别嫌这些概念基础,在实际项目中,越是基础的东西,往往越是影响全局。