一、什么是 FastQC?质量控制为什么是命门?
说白了,FastQC 就是测序数据的“体检报告”。
你想想看,一台测序仪跑下来,动辄几亿条 reads。每条 read 的碱基质量、GC 含量、接头污染……这些指标肉眼根本看不过来。我刚开始做 NGS 分析的时候,就吃过这个亏——拿到数据直接往下跑比对,结果跑了一整天,比对率不到 40%。后来一查才发现,数据里混了一大段 adapter 没去掉。
从那以后,我养成了一个习惯:任何原始数据,第一件事就是跑 FastQC。这不是可选项,这是必选项。
FastQC 到底在干什么?
FastQC 是一个轻量级的 Java 工具。它不修改你的数据,只做一件事——统计和可视化。它会扫一遍你的 FASTQ 文件,然后输出一份 HTML 报告,告诉你数据质量好在哪里、坏在哪里。
我个人最喜欢它的地方,是它默认就有一套内置的阈值。每个指标都分三个等级:
- 绿色(PASS):完全正常,放心用
- 黄色(WARN):有点异常,建议看看
- 红色(FAIL):问题严重,必须处理
不过要提醒你一句:默认阈值不等于行业标准。我在不同项目里,经常需要根据文库类型、测序平台、后续分析目标来重新调整这些阈值。这就是咱们这门课的核心——不仅要会用 FastQC,更要懂得怎么设阈值、怎么审结果。
FastQC 分析的 11 个核心模块
FastQC 的报告里包含 11 个模块。我整理了一张表,方便你快速对照:
| 模块名称 | 它看什么 | 典型问题 |
|---|---|---|
| Per base sequence quality | 每个碱基位置的质量分布 | 前几个碱基质量差 / 末段质量下降 |
| Per sequence quality scores | 每条 read 的平均质量分布 | 部分 reads 整体质量偏低 |
| Per base sequence content | 每个位置的 A/T/G/C 比例 | 前 10bp 碱基偏好(随机引物问题) |
| Per sequence GC content | 整条 reads 的 GC 含量分布 | GC 偏差(文库扩增偏差或污染) |
| Per base N content | 无法识别的碱基 N 的比例 | 某段区域 N 比例异常高 |
| Sequence length distribution | reads 长度的分布情况 | 部分 reads 被截断或长度不一致 |
| Duplicate sequences | 重复 reads 的比例 | 过度扩增导致大量重复 |
| Overrepresented sequences | 出现频率异常高的序列 | 接头残留、rRNA 污染 |
| Adapter content | 接头序列的累积含量 | 接头没有完全切除 |
| Kmer content | 过代表的小段 Kmer 序列 | 系统性污染或扩增偏好 |
| Per tile sequence quality | 每个测序 tile 的质量分布 | 特定 tile 质量异常(仪器问题) |
为什么说质量控制不是“走形式”?
道理其实很简单:垃圾进,垃圾出。
我见过不少团队,数据 QC 这一步只是“跑一遍、截个图、归档了事”。结果跑到比对、变异检测那一步才发现不对劲。回头查原始数据,发现质量早就出问题了。
质量控制的意义,说白了就是:把问题暴露在最前面。你在第 1 步花 10 分钟发现问题,可能只要换个参数重新跑一遍。如果你在第 10 步才发现问题,那前面 9 步的时间全都白费了。
FastQC 的核心工作流程
下面这张图,是我自己一直在团队里用的 QC 流程。你可以把它当作入门路线图:
一段话讲清楚 FastQC 的基本用法
FastQC 使用起来非常简单。我一般会这么跑:
# 对单个 FASTQ 文件跑 FastQC
fastqc sample_1.fastq.gz
# 对双端测序数据同时跑
fastqc sample_1.fastq.gz sample_2.fastq.gz
# 指定输出目录(我建议都用 -o)
fastqc sample.fastq.gz -o ./qc_reports
# 一次跑整个目录下的所有 FASTQ 文件
fastqc *.fastq.gz -o ./qc_reports --threads 4
跑完后,每个 FASTQ 文件会生成两个文件:一个 .html 报告和一个 .zip 压缩包。我习惯把 .zip 保留着,方便后续用脚本做批量数据提取。
我通常用
--threads 参数指定多线程。特别是几十个 FASTQ 文件堆在一起的时候,单线程跑能等疯。另外,输出目录一定要用
-o 明确指定,不然文件会散落在当前目录下,后面整理起来很痛苦。
有一次跑一个 100G 的大 FASTQ 文件,我忘了加
--threads,默认单线程跑了整整 40 分钟。我以为是卡死了,想强行中断,但 kill 进程后才发现 FastQC 在写临时文件,硬中断会导致报告损坏。所以——大文件一定要开多线程,不要中途硬杀进程。
FastQC 报告怎么看?我教你一个“三分钟扫读法”
报告打开后,左边是模块列表,右边是具体图表。我不建议你从头到尾一点一点看。我的方法是:
- 先看 Summary 的颜色:一眼扫过去,绿色多就是好数据,红色多就是问题数据。
- 再重点看 Per base sequence quality:这是衡量数据整体质量最直接的图。如果 box plot 的中位数在 Q20 以下,基本可以判定数据不合格。
- 最后扫 Adapter content:如果接头含量曲线在末端明显翘起,说明需要进一步裁剪。
为什么这么看?因为绝大部分的数据问题,都可以通过这两个模块暴露出来。其他模块,比如 Kmer Content、Per tile quality,更多是辅助定位具体原因的场景。
我能从 FastQC 里得到什么?
我整理了一份清单,你可以对照着检查你的数据:
- 数据能不能用?——Per base sequence quality 整体通过检查
- 需不需要裁剪?——Adapter content 或 Per base sequence content 前面有偏差
- 有没有污染?——Overrepresented sequences 或 Kmer content 里出现非目标物种序列
- 扩增偏差大不大?——Duplicate sequences 比例过高,或者 GC content 分布异常
- 仪器有没有问题?——Per tile sequence quality 出现单个 tile 异常
这五个问题,基本就是质量控制要回答的核心问题。后面的章节,我们会逐一深入每个模块的阈值设定和审计策略。