FastQC简介与质控报告概述

做生物信息学这一行,特别是处理二代测序数据时,跑FastQC几乎成了我这几年最习惯的「第一件事」。你想想看,从测序仪下来的数据,原始得就像刚挖出来的矿石——里面有没有杂质、质量怎么样、需不需要过滤,光靠肉眼是看不出来的。FastQC就是那个照妖镜,帮你把数据质量摊开来,一目了然。

说白了,FastQC是一个轻量级的质控工具。它能快速扫描FASTQ格式的高通量测序数据,然后生成一个HTML格式的报告。我这几年经手了上百个项目,从RNA-seq到WGS,从单细胞到靶向测序,几乎没有哪个项目能跳过这一步。我记得第一次接触FastQC大概是十多年前了,那时候它还是个命令行小工具,现在已经成为行业标配了。

核心价值一句话: FastQC帮你把测序数据的「健康状况」可视化,让你在做后续分析之前就能发现潜在问题。

为什么要做质控?

说句实话,我刚入行那会儿,觉得质控报告就是测序厂家的噱头,数据有什么好看的,直接往下游分析不就行了?直到有一次,一个RNA-seq项目,差异基因结果特别奇怪,始终找不到生物学的解释。我花了整整两周去排查,最后发现是测序质量太差,很多read的Q值低于10。从那以后,我再也不敢跳过质控了。

质控能解决几个核心问题:

  • 识别低质量数据——碱基错误率高的区域,说白了就是「噪声」,留着只会污染下游分析。
  • 检测接头污染——测序读长如果比插入片段长,就会读到接头序列,这件事在双端测序里尤其常见。
  • 评估文库复杂度——重复序列太多,意味着PCR扩增有偏好,这种数据在做变异检测时会引入系统偏差。
  • 判断批次效应——同一批次不同lane的样品,如果质量差异显著,你就要警惕了。
我的经验: 在正式分析前,我通常会把所有样品的FastQC报告汇总成一个表格,用multiqc搞定。一眼扫过去,哪个样品有问题,哪个lane质量差,清清楚楚。

FastQC报告的结构

FastQC的输出是一个HTML文件,里面包含了11个模块的评估结果。每一个模块都对应一个特定的质量维度。嗯,这里要注意,不是所有模块都有同等的重要性,但你最好都看一眼。

模块名称 评估内容 我着重的点
Basic Statistics 总读长数、读长长度、GC含量等基础统计 GC含量偏离预期,往往意味着文库构建有问题
Per base sequence quality 每个碱基位置的Q值分布 前端或末端的质量下降,这个我最常关注
Per sequence quality scores 所有读长的平均Q值分布 如果整体偏低,肯定要做截断
Per base sequence content 每个位置的A/T/G/C比例 前几个碱基组成偏差,很常见但往往影响不大
Per sequence GC content 所有读长的GC含量分布 出现双峰分布时,大概率是污染
Per base N content 每个位置的N(未识别碱基)比例 N比例高,说明测序质量极差
Sequence Length Distribution 读长长度的分布 长度不一致,大概率是建库时的片段选择问题
Sequence Duplication Levels 文库中重复序列的比例 重复率过高,提醒我PCR去冗余
Overrepresented Sequences 出现频率异常高的序列 我遇到过整条read都是poly-A的情况,是末端降解
Adapter Content 不同位置出现的接头序列比例 这个是必看,接头残留会干扰比对
K-mer Content 特定短序列(k-mer)的异常富集 偏向性扩增的指标,WGS里要特别小心

阈值设定的意义

你可能会问,报告看完了,然后呢?是直接过,还是该报warning,还是应该fail?这就引出了本教程的核心——阈值审计。

FastQC本身有默认的「好/尚可/差」的判定标准,但说实话,那套标准太笼统了。比如在Per base sequence quality模块,FastQC把Q值低于20的位置超过某个比例就判定为warning,可实际项目中,不同平台、不同文库类型,容忍度天差地别。我见过illumina的HiSeq数据,末端Q值掉到15都很正常;而mRNA-seq的数据,前端如果有GC偏差,往往不是问题,但WGBS的甲基化数据里,同样的偏差就可能是致命的。

所以我做审计时,从来不会全盘接受FastQC的默认阈值。每个项目我都会自己制定一套阈值规则,然后把它固化成脚本。这就是为什么我开启了这门课——帮你搞清楚到底怎么设定一套靠谱的审计阈值。

避坑提醒: 不要以为FastQC的「pass」就是百分百安全,它只是在统计层面认为「不太离谱」。我曾遇到过所有模块都是pass,但实际数据在做变异检测时依然表现极差——后来发现是文库出现了严重的PCR bias,而FastQC的重复序列模块默认阈值太宽松了。

FastQC的基本用法

在讲阈值之前,先带你过一遍最基础的调用方式。这个很简单,一行命令就能搞定:

fastqc sample_R1.fastq.gz -o fastqc_output/

如果你想同时跑多个文件,用通配符就好了:

fastqc *.fastq.gz -o fastqc_output/ -t 8

这里-t 8表示用8个线程并行处理,能省下不少时间。我通常处理一个全外显子测序的FASTQ文件(大约10GB压缩后),单线程要跑20分钟左右,用8个线程能压缩到5分钟以内。

还有一些常用参数,列出来给你参考:

  • --nogroup:不进行碱基位置分组,适合短读长(<50bp),能提供更精细的质量分布。
  • --contaminants:自定义污染序列库,我用它来检测建库时残留的逆转录引物。
  • --adapters:自定义接头库,处理一些非标准接头时非常有用。
一个小技巧: 我习惯在分析流程第一步就把FastQC的参数写进Makefile里,这样每次重跑分析时,再也不用担心忘记跑质控了。比如这样:
QC_DIR = ./qc_output
%.qc: %.fastq.gz
    fastqc $< -o $(QC_DIR) -t 8
FastQC 质控审计流程 原始 FASTQ 数据 FastQC 分析引擎 11 个模块量化结果 HTML 可视化报告 ZIP 原始数据包 阈值审计 → 通过 / 警告 / 拒绝 每个模块根据预先设定的阈值(如Q20比例、 接头含量、重复率等)判定是否通过审计

这个图基本概括了质控审计的完整链路。从原始FASTQ出发,经过FastQC分析,得到11个模块的量化结果,最后通过自定义阈值进行审计判定。每一个环节都有坑,后面我会一个一个给你拆解。