第3章 数据质量控制:FastQC使用与结果解读
拿到测序下机的FASTQ文件,第一件事是什么?我个人经验是,千万别急着做比对或定量。先停下来,做一次全面的质量审计。你想想看,如果原始数据本身就有问题,后面的分析做得再漂亮,结果也是站不住脚的。这就像盖房子,地基没打好,装修再豪华也白搭。
我职业生涯中接手过不少“疑难杂症”的项目,最终发现很多奇怪的结果,根源都在质量控制环节被忽略了。所以,这一章我们花点心思,把FastQC这个工具玩透。它虽然小,但却是RNA-seq分析流程中不可或缺的守门员。
一句话总结: FastQC能快速帮你找出测序数据中的“毛病”,比如接头残留、碱基质量差、GC含量异常等。学会解读它的报告,能让你避开80%的数据质量问题。
3.1 为什么要做数据质量控制?
很多人觉得这步是形式主义。其实不然。测序过程受多种因素影响:文库制备质量、测序仪器状态、试剂批次差异、甚至是操作员的手抖了一下,都可能在数据中留下痕迹。FastQC的作用,就是将这些问题可视化、量化。
质量控制主要解决三个核心问题:
- 数据是否干净? – 有没有未去除干净的接头序列?
- 数据是否可靠? – 碱基的测序质量分数是否达标?
- 数据是否异常? – GC含量分布、重复序列比例等是否符合预期?
说白了,这个步骤是为你后续的比对和定量工作买了一份“保险”。跳过这步,风险你来扛。
3.2 FastQC 的安装与使用
FastQC的安装非常简单。我个人习惯在conda环境里管理所有生物信息学工具,这样不会污染系统环境,也方便版本管理。
3.2.1 安装方式
推荐使用conda安装,一行命令搞定:
conda install -c bioconda fastqc
当然,你也可以去官网下载二进制包,直接解压就能用。我早期用过这种方式,但后来发现conda能自动处理依赖,省心不少。
3.2.2 运行命令
基本用法非常直接。对一个双端测序的样本,运行:
fastqc sample_R1.fastq.gz sample_R2.fastq.gz -o ./qc_results/ -t 4
参数说明:
sample_R1.fastq.gz和sample_R2.fastq.gz:输入文件,支持gz压缩格式,直接读取。-o ./qc_results/:指定输出目录。-t 4:使用4个线程并行处理,对于大文件,这个参数很重要。
小技巧: 我常常会配合 find 命令批量处理一个目录下的所有FASTQ文件:
find . -name "*.fastq.gz" | parallel -j 4 fastqc -o ./qc_results/ {}
这样能极大提高效率,尤其是拿到一个批次几十个样本时。
运行成功后,会为每个输入文件生成两个文件:一个 .html 报告(浏览器直接打开),一个 .zip 压缩包(包含报告中的各模块数据)。
3.3 FastQC 输出结果解读
结果报告里包含十几个模块。每个模块都用红、黄、绿三种颜色来标识状态:绿色表示通过(Pass),黄色表示警告(Warn),红色表示不合格(Fail)。
不过别太迷信这个颜色。我见过很多样本,整体是绿色警告,但某个模块却严重异常。下面我挑几个最关键的模块,结合我踩过的坑,带你逐个看明白。
3.3.1 Per base sequence quality(每个碱基的测序质量)
这个模块是核心中的核心。它展示了读段(Read)中每个位置的碱基质量分布。
怎么看? 看中间的黄色箱线图和红色中位线。如果中位线大部分落在绿色区域(Q>28)就很好。如果前面的碱基(前5-10bp)质量偏低,那是正常的,因为测序仪启动时有预热过程。如果后半段质量急剧下降,就要小心了。
我曾经踩过的坑: 有一次处理一个单细胞数据,这个模块显示末端的质量掉到了Q20以下。我以为是测序问题,跑了两次质控都一样。后来发现,是建库时片段太短,测到了接头的部分序列。这提醒我,质量下降不一定是测序仪的问题,也可能是文库本身的问题。
处理建议: 如果后端质量太差,后续需要使用Trimmomatic或cutadapt进行质量修剪。
3.3.2 Per sequence GC content(每个序列的GC含量)
这个模块用来检测GC含量分布是否正常。理论上,基因组DNA的GC含量呈正态分布,中心在物种GC含量附近(人类约41%)。
异常信号: 如果出现双峰(两个波峰),通常意味着有外源污染。比如,你的样本是人的,但混入了细菌的DNA,就会出现两个GC波峰。如果出现尖锐的单峰,说明片段筛选非常均匀,也可能有问题。
我遇到一个病例: 一个肿瘤样本的GC含量分布图谱非常奇怪,后来通过溯源发现,是样本在取样时混入了小鼠的异种移植组织。所以,这个模块是识别样本污染的好工具。
3.3.3 Adapter Content(接头含量)
这个模块直接告诉你,你的数据里还有多少未被清除的接头序列。如果该模块显示红色Fail,说明建库时片段偏短,或者接头清除不彻底。
怎么办? 后续必须进行接头切除。你可以使用cutadapt,指定接头序列:
cutadapt -a AGATCGGAAGAGCACACGTCTGAACTCCAGTCAC \
-A AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTGGTCGCCGTATCATT \
-o trim_R1.fastq.gz -p trim_R2.fastq.gz \
sample_R1.fastq.gz sample_R2.fastq.gz
至于接头序列是什么?FastQC报告里会明确告诉你检测到的是哪种接头。或者,直接去illumina官网查一下通用接头序列。
3.3.4 Overrepresented sequences(过度代表序列)
这个模块会列出出现频率异常高的序列。如果这些序列被识别为已知接头,就是上述接头残留。如果未能识别,可能是PCR扩增偏好性导致的重复,或者是一定技术重复下的噪声。
注意: 在RNA-seq中,如果测序深度非常深,部分高表达基因的片段重复是正常的。但如果重复比例超过10%且集中在少数几条序列上,就要考虑是否建库时扩增次数过多了。
3.4 知识体系总览
下面这张图概括了FastQC质控的核心流程和判断逻辑,你看完应该就能把握全貌:
3.5 关键指标快速参考表
为了方便你快速判断,我把几个核心模块的合格标准汇总成一个表。你可以打印出来贴在工位上,或者存成书签。
| 模块名称 | 核心检测内容 | 如何判断合格 |
|---|---|---|
| Per base sequence quality | 每个位置的碱基质量中位数 | 中位线在绿色区域(Q>28);末端允许轻微下降 |
| Per sequence quality scores | 每条读段的平均质量 | 峰值位于Q30~Q40区域,不应出现大量低分读段 |
| Per base sequence content | 每个位置的A/T/G/C比例 | 前10bp波动内属正常,后续各碱基比例应稳定 |
| Per sequence GC content | 所有读段的GC含量分布 | 呈单峰正态分布,峰值在物种理论值附近 |
| Adapter Content | 序列与已知接头的比对 | 全程为绿色(0%),不能出现上升曲线 |
| Overrepresented sequences | 出现频率>0.1%的序列 | 若出现,应能被识别为接头或常见污染 |
我的个人习惯: 看报告时,我从不只盯着最后的汇总分。我会点开每个模块的详细图形,尤其关注Per base sequence quality和Adapter Content这两个图。如果这两个图都正常,其他模块大部分Pass,那这个样本就可以放心往下做了。
3.6 多样本批量质控与报告聚合
当样本量多起来(比如几十个),一个个看HTML报告显然不现实。这时候,我们可以用MultiQC工具来聚合所有FastQC报告,生成一个综合仪表盘。
用法很简单:
multiqc ./qc_results/ -o ./multiqc_report/
multiqc会自动扫描目录下的所有FastQC生成的zip文件,然后生成一个整合的HTML报告。在这个报告里,你可以横向对比所有样本的同一模块,快速识别出异常样本。
避坑指南: 有些朋友习惯直接看MultiQC的汇总图,但请记住,MultiQC只是一个视图工具,不会替你判断好坏。如果一个样本在某模块显示红色,最好还是回到FastQC原版报告里看细节图。我见过太多人随便瞄一眼MultiQC就草草放行,结果漏掉了关键问题。
3.7 数据不合格时的处理策略
如果你的数据没有全部通过,别慌。根据我处理过的上百个项目的经验,我给出几个常见问题的处理方法:
- 末端质量差(Per base quality Fail): 使用Trimmomatic或cutadapt裁剪前段和末端的低质量碱基。
- 接头残留(Adapter Content Fail): 使用cutadapt切除对应接头序列。
- GC含量异常(Per sequence GC Content Fail): 首先排除是否由接头或引物二聚体引起。如果是污染,需要评估污染源的比例和影响。有时需要重新建库。
- 过度代表序列(Overrepresented sequences Fail): 如果是接头,按上面处理。如果是非接头重复,且比例极高(>1%),建议标记并移除这些读段。
处理示例命令(质量修剪 + 接头切除一步完成):
cutadapt -a AGATCGGAAGAGCACACGTCTGAACTCCAGTCAC \
-A AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTGGTCGCCGTATCATT \
-q 20,20 --min-length 36 \
-o trim_R1.fastq.gz -p trim_R2.fastq.gz \
sample_R1.fastq.gz sample_R2.fastq.gz
这个命令做了三件事:1) 切除接头;2) 将质量低于Q20的碱基末段剪掉;3) 丢弃长度小于36bp的读段(防止比对时出错)。
再次强调: 处理完后的数据,一定要重新跑一次FastQC确认问题已解决。我见过有人修完接头后,没再质控,结果发现修坏了原本正常的序列。这个迭代过程不能省。