4. 测序质量控制:FastQC与MultiQC实战归纳总结

我每次拿到新的测序数据,第一件事就是跑 FastQC。这个习惯帮过我很多次。说白了,数据质量不行,再牛的分析方法也救不回来。

你想想看,一个碱基质量低,可能是测序仪的小波动。但要是整批数据都飘红,那就是实验设计或者文库构建出了问题。这时候硬着头皮往下做,结果只会骗自己。

所以我个人习惯,拿到原始数据,先花半小时跑个质控。嗯,这块我分成两阶段:先单样本看,再多样本汇总。咱们一个个说。

4.1 FastQC:每个样本都得过一遍

FastQC 这东西,简单粗暴。给一个 FASTQ 文件,它就给你出一份 HTML 报告。我在项目中遇到过很多次,有人只看一个「PASS / FAIL」就完事了,其实不对。

常用命令长这样:

fastqc sample1_R1.fastq.gz sample1_R2.fastq.gz -o qc_results

跑完以后,目录下多出两个 .html 文件和对应的 .zip。我习惯先用浏览器打开看一眼全局,再细看几个关键模块。

重点看这 6 个模块:

模块 正常状态 警告/失败 我一般怎么处理
Basic Statistics GC 含量在物种预期范围 ±5% GC 含量异常(比如 70%) 先检查文库构建,排除污染
Per base sequence quality 整条 read 的 box 都在绿色区间 前几个碱基飘红,或者尾部急剧下降 头端出问题要检查引物;尾部出问题直接截短
Per sequence quality scores 主峰在 Q30 以上 主峰低于 Q20 或出现双峰 低质量 reads 直接过滤掉
Per base N content 几乎看不到 N 某位点 N 含量超过 5% 确定是否接头残留,需要去接头
Adapter Content 整条 read 没有接头序列富集 末端有接头累积 去接头,不要犹豫
Overrepresented sequences 没有序列占比超过 0.1% 某序列占比异常高 检查是否为 rRNA/接头 dimer,考虑去除

我见过一个项目,某样本的「Per base N content」在 read 中间段突然飙到 15%。一开始大家以为是测序仪出毛病了。后来一排查——是那个位置正好跨过一个高 GC 区域,聚合酶跑不下去。解决办法很简单,换了个聚合酶,问题就没了。

4.2 MultiQC:把一堆报告捏成一个

单个样本的 FastQC 好办,但一个项目跑几十个样本,你一个个翻页面,不累吗?MultiQC 就是干这个的。它会扫描整个目录,把 FastQC、STAR、HISAT2、featureCounts 等等结果汇总成一个报告。

说白了,MultiQC 不是重新分析,而是把各个软件的日志和统计文件收集起来,画在一起。这样你一眼就能看出哪个样本有问题。

跑起来也简单:

multiqc qc_results -o multiqc_report

这条命令会在 multiqc_report 目录下生成 multiqc_report.html。你打开以后,会看到类似这样的表格:

样本名 总 reads 平均质量 GC 含量 dup 比例 接头比例
Sample_01 22.3 M Q36.5 42 % 18 % 0.2 %
Sample_02 18.7 M Q34.8 41 % 22 % 1.5 %
Sample_03 25.1 M Q37.2 43 % 15 % 0.1 %
Sample_04 12.5 M Q28.3 52 % 35 % 8.7 %

你看最后一行的 Sample_04,数据量只有 12.5 M,质量只有 Q28.3,GC 含量 52%,dup 比例 35%,接头比例接近 9%。这个样本单独拿出来,可能还能用。但放在整体里,明显是个 outlier。为什么?因为没有统一质控的话,样本间的差异很难判断是生物学差异还是技术噪音。

实战经验: 我在做药物处理 vs 对照组差异分析时,发现有个处理组的 dup 比例比对照组高了一截。一开始以为是生物学差异,后来在 MultiQC 表格里一查,发现是那批样本建库时 PCR 循环数多了。去掉这些样本后,差异基因数量从 120 个降到了 45 个,但其中有 38 个是重复出现的,靠谱多了。
小技巧: MultiQC 支持自定义报告标题和样本顺序,在命令里加 --title "项目名_质控报告" 和 --sample-names samples_order.txt,方便批量审阅。

4.3 实战中我踩过的坑

嗯,这里要注意,两个工具虽然好用,但有几个坑我得提一下。

  • FastQC 看的是「全基因组」,不是「转录组」。 你在 FastQC 里看到某个序列占比很高,不一定是污染。对于转录组来说,某些高表达基因(比如看家基因)的 reads 占比高是正常的。我建议结合 mapping 结果来判断。
  • MultiQC 的「General Statistics」只汇总了共享的模块。 如果你的样本有些跑过 truncate 有些没跑,那 GC 含量那列数据不一致,MultiQC 会自动合并,但会少很多细节。最好所有样本保持相同的预处理流程。
  • MultiQC 的页面很大。 上百个样本时,HTML 文件可能超过 50 MB。建议用 --zip-data 导出压缩数据,或者用 --no-data-dir 不保存数据目录,只保留 Web 页面。
我曾经踩过的一个坑: 有一次我用 MultiQC 看 96 个样本的 FastQC 报告,页面全部加载出来了,但「Per base sequence quality」那个图是全红的,把我吓一跳。后来发现是 MultiQC 在合并时,默认把所有样本的数据画在同一张图上,纵轴自动缩放过,导致看起来每个位点的质量都低。解决办法:在 MultiQC 配置里设置 --sample-colors 用不同色系区分样本组,或者只选代表性样本画图。

4.4 整体流程总结

我用一张图把这个质控流程串起来。你会看到整条线从原始数据开始,经过两个工具,最后落到决策上。

测序质控完整流程图:FastQC → MultiQC → 决策 原始测序数据 (FASTQ) 单端数据 Running FastQC 双端数据 Running FastQC (R1 & R2) 已比对数据 (BAM) Running FastQC (BAM mode) MultiQC 汇总 自动扫描 FastQC 报告 + 其他软件日志 综合质控报告 + 决策 过滤 / 截短 / 去接头 / 剔除样本 不要跳过 FastQC 直接跑 MultiQC

我个人习惯,拿到每个新项目,先写一个 Shell 脚本把 FastQC 和 MultiQC 串起来跑。这个步骤不能省。省了你吃亏。

#!/bin/bash
# 全流程批处理脚本
FASTQ_DIR="raw_data"
QC_DIR="qc_results"
MULTIQC_DIR="multiqc_report"

mkdir -p $QC_DIR
mkdir -p $MULTIQC_DIR

# 跑所有 FASTQ 文件的 FastQC
for f in $FASTQ_DIR/*.fastq.gz; do
    fastqc -o $QC_DIR $f
done

# 汇总
multiqc $QC_DIR -o $MULTIQC_DIR

跑完后打开 multiqc_report.html,从上往下扫一遍。如果某个样本在所有维度上都飘红,我建议直接干掉它。与其花时间清洗一个烂样本,不如多跑几次生信分析。

一句话总结: FastQC 让你看到每个样本的「脸」,MultiQC 让你看到整批样本的「队列」。先看脸,再排队,最后做决定。