FASTQ 质量值换算器
FASTQ 第四行那串看不懂的符号就是质量值。这个工具做两件事: 把 Q 值和错误率互相换算;把一整串质量值解析成平均质量、≥Q20/Q30 占比和期望错误数。
Q 值就是错误率取对数
PHRED 质量值的定义只有一行:
Q = −10 × log₁₀(Pe) Pe 是该碱基被读错的概率
所以 Q 每涨 10,错误率就降一个数量级:
| Q 值 | 错误率 | 准确率 | 每 1000 bp 期望错 |
|---|---|---|---|
| Q10 | 0.1 | 90% | 100 个 |
| Q20 | 0.01 | 99% | 10 个 |
| Q30 | 0.001 | 99.9% | 1 个 |
| Q40 | 0.0001 | 99.99% | 0.1 个 |
「Q30 以上占 90%」这类指标之所以常用,是因为 Q30 对应千分之一的错误率, 对多数应用来说已经够低了。
平均质量不能直接对 Q 取平均
这是最常见的错误,而且错得不小。
Q 值是对数,对数的算术平均没有物理意义。要算一条读长的平均质量, 必须先把每个 Q 还原成错误率,对错误率求平均,再转回 Q:
正确: Q_mean = −10 × log₁₀( mean(Pe) )
错误: Q_mean = mean(Q)
差别有多大?拿一条一半 Q40、一半 Q20 的读长(各 50 个碱基):
| 算法 | 结果 |
|---|---|
| 直接对 Q 取算术平均 | Q30.0 |
| 先转错误率再平均 | Q23.0 |
差了 7 个 Q 单位。 原因是低质量碱基的错误率极高,在错误率的平均里占绝对主导, 而在 Q 的算术平均里它只是普通的一项。
更极端一点,[Q40, Q40, Q40, Q10] 算术平均是 Q32.5,正确算法只有 Q16.0——
一个 Q10 的碱基就把整条读长的平均质量拉到了 Q16。
这不是吹毛求疵:如果你按算术平均去筛读长,会把一批实际含有大量错误的读长放进下游分析。
三种互不兼容的 FASTQ 编码
质量值用单个 ASCII 字符存储,但历史上出现过三种编码,而且不能可靠地自动区分:
| 变体 | 分数类型 | ASCII 偏移 | 分数范围 |
|---|---|---|---|
| Sanger / Illumina 1.8+ / SRA | PHRED | 33 | 0 – 93 |
| 早期 Solexa / Illumina | Solexa | 64 | −5 – 62 |
| Illumina 1.3 – 1.7 | PHRED | 64 | 0 – 62 |
注意中间那一行:早期 Solexa 用的不是 PHRED 分数,而是
Q = −10 × log₁₀(Pe / (1 − Pe)),可以取负值。两套分数在高质量端近似相等,
低质量端差别明显——PHRED 10 对应 Solexa 9.5,而 PHRED 2 对应 Solexa −2.3。
现在拿到的数据几乎都是 Phred+33。只有处理 2011 年之前的老数据才会遇到 +64。
关于「自动判断编码」
本工具会尝试判断,但只在能确定时才下结论:
- 出现 ASCII 码低于 64 的字符 → 只可能是 Phred+33;
- 最高字符高于
J(74)→ 判为 Phred+64,因为 Illumina 1.8+ 的 Q 值上限约 41(对应J); - 两者都不满足 → 直接告诉你无法判定,请手动指定。
不猜。短读长或高质量读长本来就可能落在两种编码的重叠区, 猜错会让所有 Q 值整体偏移 31,比不给答案糟糕得多。
期望错误数比平均质量更好用
结果里的「期望错误碱基数」是所有 Pe 直接相加。它的含义很直白: 这条读长里预计有几个碱基是错的。
用它筛读长比用平均质量更合理——长读长和短读长的平均质量可比性差, 而「预计错几个碱基」在任何长度下都是同一个尺度。 长读长质控工具普遍采用这个指标,原因就在这里。
数据出处
三种编码的偏移量与分数范围取自 Biopython 的 Bio.SeqIO.QualityIO 模块源码,
该模块依据的是 FASTQ 格式的定义性论文:
Cock PJA, Fields CJ, Goto N, Heuer ML, Rice PM (2010)
The Sanger FASTQ file format for sequences with quality scores, and the
Solexa/Illumina FASTQ variants. Nucleic Acids Research 38(6):1767–1771,
DOI 10.1093/nar/gkp1137。
PHRED 与 Solexa 的换算结果已与 Biopython 的 solexa_quality_from_phred() 逐点对拍。
相关工具
常见问题
Q30 到底是什么意思?
Q30 表示这个碱基被测错的概率是 0.001,即千分之一,准确率 99.9%。「Q30 占比 90%」是说这批数据里有 90% 的碱基质量达到或超过 Q30。Q 每增加 10,错误率就降低一个数量级:Q20 是 1%,Q30 是 0.1%,Q40 是 0.01%。
为什么平均质量不能直接对 Q 取算术平均?
因为 Q 是错误率的对数,对数的算术平均没有物理意义。正确做法是先把每个 Q 还原成错误率,对错误率求平均,再转回 Q。差别很大:一条一半 Q40、一半 Q20 的读长,算术平均给出 Q30.0,正确算法只有 Q23.0。低质量碱基的错误率极高,在错误率的平均里占主导,而在 Q 的算术平均里只算普通一项。
我的质量串为什么判不出编码?
因为两种编码的字符范围确实有重叠。只有出现 ASCII 码低于 64 的字符(只可能是 +33),或最高字符高于 J(74,+33 下几乎不会出现)时才能确定。落在重叠区时本工具会明说判不出来,请你手动指定,而不是猜一个——猜错会让所有 Q 值整体偏移 31。
Phred+64 的数据现在还会遇到吗?
很少。Illumina 从 1.8 版起改用 Phred+33,SRA 上的数据也统一是 Phred+33。只有处理 2011 年之前的老数据,或者某些历史流程的中间文件,才会碰到 +64。更麻烦的是更早的 Solexa 编码,它用的根本不是 PHRED 分数,公式都不一样。
Solexa 分数和 PHRED 分数有什么区别?
PHRED 是 Q = −10·log₁₀(Pe),Solexa 是 Q = −10·log₁₀(Pe/(1−Pe)),后者可以取负值,最低到 −5。两者在高质量端近似相等(PHRED 30 和 Solexa 30 基本一样),低质量端差别明显:PHRED 10 对应 Solexa 9.5,PHRED 2 对应 Solexa −2.3。把 Solexa 数据当成 PHRED 读,低质量碱基的质量会被系统性地估错。
「期望错误数」怎么用?
它是这条读长里所有碱基错误率的直接加和,含义就是「预计有几个碱基是错的」。用它筛读长比用平均质量更合理:不同长度的读长,平均质量之间可比性差,而「预计错几个碱基」在任何长度下都是同一个尺度。长读长的质控工具普遍用这个指标。
这个工具会上传我的数据吗?
不会。全部计算都在你的浏览器里完成,质量串不会离开你的电脑。不过 FASTQ 文件通常很大,这个工具是给你抽查单条读长用的,整个文件的质控请用 FastQC 这类本地工具。