3. 输入数据质量评估:FASTQ质量控制指标、对参数选择的影响、FASTP参数调优
拿到测序数据,第一件事是什么?
直接跑比对?别急。我见过太多人兴冲冲地把低质量数据灌进 BWA,结果变异检测一塌糊涂,回头查才发现是原始数据的锅。
FASTQ 的质量决定了 GATK 流程的上限。这章我们就聊聊怎么用 FASTP 这把“手术刀”,把数据收拾干净。
3.1 关键质量控制指标
FASTP 跑完后会生成一份详细的 html 报告。但报告里的数字,你得看得懂。下面这几个指标,我个人习惯每次必看:
| 指标 | 含义 | 警戒线 |
|---|---|---|
| Q20 / Q30 比例 | 碱基质量得分 >= 20 / 30 的百分比 | Q20 < 90%,Q30 < 80% 需要警惕 |
| GC 含量 | 碱基 G+C 占总碱基的比例 | 偏离物种理论值 ±5% 以上可能异常 |
| N 含量 | 无法识别的碱基比例 | 超过 5% 说明测序质量极差 |
| Adapter 污染率 | 被检测到接头的 reads 比例 | 超过 1% 必须切除 |
| Reads 长度分布 | 测序片段长度是否均一 | 主峰外出现明显拖尾或小峰就是问题 |
| 重复率 | 完全相同的 reads 占总 reads 比例 | PCR 重复过高(>20%)影响变异频率计算 |
我的习惯:Q30 低于 80% 的数据,我会直接标记为“风险样本”。在 GATK 流程里,它可能导致大量假阳性 SNP,让你后期验证时怀疑人生。
3.2 这些指标如何影响 GATK 参数选择?
质量指标不是摆设,它们直接决定了你后续要怎么调参数。说白了,数据好就粗调,数据差就细整。
- Q20/Q30 偏低:BaseRecalibrator 得分就更重要了。如果原始错误率太高,校准后的模型可能也掰不回来。这时候我会适当提高
--min-base-quality-score,默认是 10,我可能会提到 15 甚至 20。 - Adapter 污染 + 短插入片段:在 MarkDuplicates 里,
OPTICAL_DUPLICATE_PIXEL_DISTANCE需要根据你的测序平台调整。污染导致的大量嵌合体 reads,意味着你要在 SplitNCigarReads 里用更严格的--filter-mismatching-base-and-quals。 - 纯在的高重复率(>30% 文库重复):意味着你的文库复杂度不够。这时候我不建议在 HaplotypeCaller 里用默认的
--min-pruning,可以适当收紧,比如从 2 提到 3。 - GC 含量严重异常:可能是外源 DNA 污染。我会在比对前就把它踢掉,否则 GATK 的
ContaminationModel会算出一个奇怪的结果,让你误以为有体细胞变异。
为什么会这样?
因为 GATK 的很多统计模型都假设输入数据是“干净”的。数据越脏,你就越需要用保守的参数去补偿。嗯,这里要注意,不是所有问题都靠调参能解决。
3.3 FASTP 参数调优实战
FASTP 的配置,我觉得用 JSON 文件最清晰。下面是我做全外显子测序(WES,150 bp PE)时常用的一个配置骨架:
{
"in1": "sample_R1.fastq.gz",
"in2": "sample_R2.fastq.gz",
"out1": "clean_R1.fastq.gz",
"out2": "clean_R2.fastq.gz",
"unpaired1": "unpaired_R1.fastq.gz",
"unpaired2": "unpaired_R2.fastq.gz",
"insert_size": true,
"average_qual": 20,
"qualified_quality_phred": 15,
"unqualified_percent_limit": 40,
"n_base_limit": 5,
"length_required": 100,
"cut_by_quality5": true,
"cut_by_quality3": true,
"cut_window_size": 4,
"cut_mean_quality": 20,
"correction": true,
"overrepresentation_analysis": true,
"html": "report.html",
"json": "report.json",
"thread": 8
}
几个我特别在意的参数,展开说说:
average_qual与qualified_quality_phred:前者是整个 read 的平均质量门槛(我设 20),后者是每个碱基的“及格线”(设 15)。为什么要设两个?因为极端差 read 会被第一条过滤掉,而中等 read 中的差尾巴会被窗口修剪清理掉。cut_window_size与cut_mean_quality:滑动窗口质量修剪。窗口大小是个平衡点。窗口太小(比如 2)会切掉太多碱基,太大(比如 6)又不够敏感。我个人经验,4 是个稳妥值。correction:开启碱基错误校正。校正后能略微提升 Q30,但会增加计算时间。如果数据量不大,我这步是开着。
我曾经踩过的坑:有一次我把
average_qual 设成了 30,结果 60% 的 reads 都被剔除了,文库利用率惨不忍睹。后来才反应过来,这是 Q 值平均,不是最低值。别学我,先跑一个小样本看看统计结果。
3.4 从 FASTP 到 GATK 的参数决策树
你可能会问,这么多参数,我怎么才知道该重点调哪个?
下面这张图,是我自己项目里用的决策逻辑。从 FASTP 报告出发,一路走到 GATK 参数:
这张图传递的核心理念是:数据质量问题越严重,你就越需要用保守的 GATK 参数来补偿。
3.5 实战中的“坑”
做这个流程几年来,几个最常见的“坑”分享给你:
- 盲调参数:一开始就把 FASTP 的
qualified_quality_phred调到 30,结果读长不够了,又强行调低 GATK 的minReads。其实根本问题是数据量撑不住,要回头去看文库构建。 - 忽略单端与双端的区别:FASTP 对双端数据有
--correction的配对校正,单端就没法用。我遇到过有人把单端数据当双端配对着跑,结果 adapter 检测完全错乱。 - 不关注未配对的输出:
unpaired1和unpaired2如果不清理会占用大量磁盘。我在做大规模 WGS 时,未配对文件经常膨胀到几百 GB。定期清理或者直接用标准输出流处理掉。 - 忽略 overrepresentation:FASTP 的
overrepresentation_analysis能帮你发现 PCR 扩增偏差。有一次我开着它,发现某个区域的覆盖度异常高,一查果然是建库时 PCR 循环数太多导致的。
一句话总结:FASTP 调参的核心是“读懂报告,对症下药”,不要对着参数表抄作业。你的数据质量报告,就是最好的参数说明书。