一、什么是 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 质量异常(仪器问题)
我的习惯:先扫一眼 Per base sequence quality 和 Adapter content。这两个模块是“一票否决制”——只要有一个 FAIL 了,后面的分析都可能被污染。

为什么说质量控制不是“走形式”?

道理其实很简单:垃圾进,垃圾出。

我见过不少团队,数据 QC 这一步只是“跑一遍、截个图、归档了事”。结果跑到比对、变异检测那一步才发现不对劲。回头查原始数据,发现质量早就出问题了。

质量控制的意义,说白了就是:把问题暴露在最前面。你在第 1 步花 10 分钟发现问题,可能只要换个参数重新跑一遍。如果你在第 10 步才发现问题,那前面 9 步的时间全都白费了。

FastQC 的核心工作流程

下面这张图,是我自己一直在团队里用的 QC 流程。你可以把它当作入门路线图:

FastQC 质量控制工作流程 原始 FASTQ 数据 FastQC 11 模块分析 PASS / WARN / FAIL 判定 直接进入下游分析 需质控处理(去接头/裁剪) QC 报告 + 审计记录 说明:黄色 WARN 状态视阈值调整幅度决定是否人工复核,并非必须回到处理阶段。

一段话讲清楚 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 报告怎么看?我教你一个“三分钟扫读法”

报告打开后,左边是模块列表,右边是具体图表。我不建议你从头到尾一点一点看。我的方法是:

  1. 先看 Summary 的颜色:一眼扫过去,绿色多就是好数据,红色多就是问题数据。
  2. 再重点看 Per base sequence quality:这是衡量数据整体质量最直接的图。如果 box plot 的中位数在 Q20 以下,基本可以判定数据不合格。
  3. 最后扫 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 异常

这五个问题,基本就是质量控制要回答的核心问题。后面的章节,我们会逐一深入每个模块的阈值设定和审计策略。