NGS测序数据质控必会:FastQC从原理到实战全解读 测序数据下机后第一件事永远是质控没有例外。不管是搞WGS、RNA-seq还是ChIP-seq拿到fastq文件的那一刻你面对的不是一堆可爱的序列而是一堆未知数——里面有多少接头残留、多少低质量碱基、多少PCR重复、甚至有没有混入其他物种的污染这些都不会写在下机报告里。FastQC就是用来干这个的花几分钟扫一遍把你手里这批数据的“健康状况”摸清楚再决定下游该怎么处理。这篇教程是生信入门系列的第七篇面向刚接触NGS数据处理的新手我会从fastq格式本身讲起覆盖FastQC的安装、运行、报告逐项解读以及实战中常见的坑和判断标准争取让零基础的人看完也能独立完成一次像样的质控。1. 为什么测序数据下机第一步要做质控1.1 fastq格式解析你手里拿的到底是什么先花点时间把fastq这件事说透。很多人用Linux命令浏览过fastq文件但未必真正理解它的结构。一个标准的fastq文件里每四条记录一行对应一条测序读长readSEQ_ID_001 ACGTACGTACGTACGTACGTACGTACGT IIIIIIIIIIIIIIIIIIIIIIIIIIII第一行以开头是序列标识符第二行是碱基序列第三行只有一个号有时后面会重复序列名第四行是质量值字符串长度必须与第二行完全一致。这四行构成一条read的完整信息。关键在于第四行。每个字符都代表一个测序碱基的质量评估用的是Phred质量分数Phred quality score。换算关系是Q -10 × log10(P)其中P是碱基判读错误的概率。Q20意味着该碱基有1%的概率是错的Q30是0.1%Q40是0.01%。但为了把数字存成字符需要对Q值做一次偏移编码。目前Illumina平台主流的编码方式是Phred33也就是用ASCII码值减去33得到实际的Q值。Phred质量值碱基错误率准确性ASCII字符Phred33Q1010%90%ASCII 43Q201%99%5ASCII 53Q300.1%99.9%?ASCII 63Q400.01%99.99%IASCII 73所以当你看到一条read质量字符串里大多是I和?说明整体质量不错如果看到大量5甚至就要警惕了。另外有个细节某些古老版本的支持Solexa/Illumina 1.3的编码是Phred64但现在的测序仪基本都用Phred33FastQC能自动识别编码方式一般不需要手动干预。1.2 质控到底在查什么我们把测序数据想象成工厂流水线的产品fastq文件就是打包出库的货。质控环节的意义在于剔除“次品”确认“正品”的比例在可接受范围内否则下游一切分析都是在垃圾数据上盖楼。测序原始数据的问题主要来自几个层面。仪器本身的误差测序过程中激光信号衰减、荧光串扰、相位偏移phasing会导致读长越往后质量越低这是物理规律无法避免。文库制备引入的偏差建库时会加接头adapter如果在长度筛选环节没切干净测序时就会读到接头序列本身PCR扩增循环数太高会引入大量重复read压低文库复杂度。样本质量差降解的DNA/RNA或者提取过程混入了其他物种的核酸会造成GC含量分布异常、overrepresented sequences增多。软件和流程问题样本编号写错、索引index串扰、下机数据拆分错误这类问题不通过质控很难第一时间发现。这些坑不是理论上的“可能”而是在实际项目中反复出现的“必然”。我见过太多人下载数据后直接跑比对最后发现比对率只有60%回头查才发现接头污染严重也见过有人在拿到一份GC含量严重偏离理论的RNA-seq数据后不知道怎么下手后来查明是样本储存时间过久RNA降解了。FastQC不能修数据但它能把这些雷提前帮你排掉。2. FastQC原理与安装部署2.1 FastQC能查什么11个检查模块FastQC是Babraham Bioinformatics实验室开发的工具专门用于评估高通量测序原始数据质量。它的核心逻辑很简单读取fastq/fastq.gz/bam文件对整批read做统计运算生成一个包含11个检查模块的HTML报告每个模块对应一个维度的数据质量检测。这11个模块分别是Basic Statistics基础统计Per base sequence quality碱基位置质量分布Per tile sequence quality测序簇质量分布Per sequence quality scores每条read平均质量分布Per base sequence content各位置碱基比例Per sequence GC contentGC含量分布Per base N content各位置N比例Sequence Length Distribution序列长度分布Sequence Duplication Levels序列重复水平Overrepresented sequences过度呈现序列Adapter Content接头含量每个模块都会给出一个评估状态绿色PASS表示正常黄色WARNING表示需要留意红色FAIL表示该项存在问题。2.2 安装方式生物信息学标准姿势FastQC是Java写的所以只要有Java运行环境就能跑。安装方式主要有两种。第一种是用conda这种方式最省心能自动处理Java依赖是目前生信环境配置的主流方式# 如果还没装mamba先用conda装mamba速度更快 conda install -n base -c conda-forge mamba -y mamba create -n qc python3.10 -y conda activate qc mamba install -c bioconda -c conda-forge fastqc -y装完之后验证一下fastqc --version输出类似FastQC v0.12.1就说明安装成功了。第二种是直接下载官方发行包适合没配conda的机器wget https://www.bioinformatics.babraham.ac.uk/projects/fastqc/fastqc_v0.12.1.zip unzip fastqc_v0.12.1.zip cd FastQC chmod x fastqc ./fastqc --version下载链接的版本号会变建议到官网确认最新版本。安装时容易忽略的一个点FastQC需要Java 8或更高版本。如果你在集群上运行建议先执行java -version确认一下避免出现版本过老导致FastQC直接报错的情况。3. 实际运行FastQC命令与参数细节3.1 单样本质控的基本命令当你手上有测序公司交付的原始数据最常见的是gzip压缩的fastq文件文件名类似Sample01_R1.fastq.gz和Sample01_R2.fastq.gz。先用FastQC跑一遍mkdir -p qc_result fastqc -t 4 -o qc_result Sample01_R1.fastq.gz Sample01_R2.fastq.gz这里解释几个常用参数-t指定线程数。FastQC一次读入一个文件用单线程多个文件可以并行处理所以-t后面跟的数字越大能同时处理的文件数越多而不是让单个文件跑得更快。-o指定输出目录。如果你不写这个参数FastQC会在当前目录生成以_fastqc.zip和_fastqc.html结尾的两个文件。如果你还希望FastQC把zip包里的内容直接解压出来可以加--extract参数。运行完成后qc_result目录下会多出四个文件Sample01_R1_fastqc.html、Sample01_R1_fastqc.zip、Sample01_R2_fastqc.html、Sample01_R2_fastqc.zip。HTML文件就是Web格式的质控报告用浏览器打开就能看ZIP文件包含同样的信息主要用于后续的批量汇总。3.2 多样本批量处理循环与通配符实际项目里极少只跑一个样本动辄几十上百个fastq文件逐个敲命令效率太低了。在Linux环境下用bash循环批量处理非常方便for fq in *.fastq.gz do fastqc -t 2 -o qc_result $fq done这一步会遍历当前目录下所有以.fastq.gz结尾的文件逐一跑FastQC。样本量大的时候我会习惯先把样本按测序类型或者批次分目录存放然后在每个目录里单独执行一次批量循环避免把不同批次的数据混在一起。另外还要提一个实际使用中很常见的报错FastQC默认不会覆盖已存在的输出文件。如果某个样本你已经跑过一次再跑同一命令FastQC会提示类似File exists: ...并跳过。这个时候最简单的办法是先删掉旧的输出或者加个--delete参数让FastQC自己清理同名文件。不过我更推荐输出文件统一放到一个独立的qc目录这样不管你怎么重复跑都不会污染原始数据目录。3.3 遇到超大数据量怎么办现在的高深度WGS数据一个样本可能占几十GB直接跑FastQC会比较慢内存占用也高。FastQC提供了一个--subsample参数只随机分析前N条readfastqc --subsample 1000000 -o qc_result huge_sample_R1.fastq.gz这个参数对快速摸底很有用。需要注意抽样会损失一部分灵敏度尤其是rare kmer的检测可能测不准但判断整体质量趋势足够了。还有个大文件处理技巧是用--noextract避免同时解压zip节省硬盘空间。提示如果服务器/tmp目录空间有限默认FastQC会使用系统临时目录可以用--dir参数指定一个容量更大的临时目录防止中间文件把tmp占满。4. 报告逐模块深度解读4.1 Basic Statistics与总体概览速读法打开HTML报告第一眼看到的Summary栏把11个模块的状态列成了一张小表绿色的勾、黄色的感叹号、红色的叉一目了然。与其说这是模块之一不如说它是整份报告的“目录”。在拿到一份新报告时我习惯先快速看这一栏的整体状态如果大多数模块是绿色只有一两个黄色说明数据质量基本可用如果出现大片红色赶紧去对应的模块看具体原因。Basic Statistics模块本身展示的是基础信息文件名、文件类型常规fastq还是bam、编码方式了解即可Phred33是当前主流、总序列数、序列长度区间、GC含量百分比。这几个数字看起来不起眼但很多时候能帮你发现大问题。其中GC%是最需要在意的指标。人类基因组DNA测序的GC含量一般落在40%~50%这个区间转录组略高一些但仍有一个合理范围。如果你测的是人类DNA样本结果GC含量显示55%以上那就要警惕是不是混入了细菌或者其他高GC含量的物种反之如果GC含量特别低也得考虑样本降解或者污染的可能。4.2 Per base sequence quality按位置看质量曲线这个模块是大家最熟悉的那张“箱线图曲线图”。横轴是read上的碱基位置纵轴是Phred质量值。图上有几条关键信息每个位置的箱线图显示了质量的分布包括中位数和四分位数中央的红色曲线代表中位数质量值走势背景区域用绿、橙、红三色标出质量区间——绿色代表高质量Q28以上橙色代表合理区间Q20~Q28红色代表低质量Q20以下。绝大多数测序数据都会呈现一个共同特征读长的前5~10个碱基质量有所波动通常偏高或偏低取决于测序仪和文库试剂盒中段保持平稳越往后质量逐渐下滑。这是边合成边测序技术的固有特性随着测序循环增加荧光信号衰减相位错位累积碱基判读的错误概率升高。怎么判断这张图是否“及格”呢我的经验是转录组和扩增子测序只要中位数在绿色区尾部掉到橙色区可以接受WGS这种高精度应用要求全段中位数不低于Q30。FastQC默认的判读标准是看每个位置的中位数和下四分位数只要任何一个位置的中位数低于25或者下四分位数低于10就会给出WARNING中位数低于20或者下四分位数低于5直接给FAIL。需要注意的是FASTQ格式有两个常见的显示模式normal mode默认和--nogroup模式。默认模式下FastQC会把前10个碱基逐个展示之后的位置按每10个一组窗口聚合显示这样读长末端的异常波动会被平均掉一部分看起来比实际更平滑。如果你想让每个碱基位置独立显示用--nogroup再跑一次即可。4.3 Per tile sequence quality一个容易被忽略的模块Per tile sequence quality是很多新手会直接跳过的模块。它通过热力图展示测序芯片上每个tile测序簇所在的物理区域的质量偏差。横轴是read位置纵轴是tile编号颜色从蓝色到红色表示质量偏离平均水平的程度红色意味着某个tile在某个区域的测序质量明显低于其他位置。这个模块的价值在于定位系统性故障。如果你看到某个tile整行都是红色说明测序芯片上存在坏点或者局部气泡这不是样本问题而是仪器或者耗材问题。好在目前主流平台的仪器稳定性都不错这个模块飘红的概率不高。真遇到这种报告我建议你直接联系测序服务商反馈情况让他们说明原因。就CanI一样平常不需要自己在软件层面处理。4.4 Per sequence quality scores平均质量分布图Per base sequence quality看的是每个位置的碱基质量而Per sequence quality scores看的是每条read的平均质量分布。横轴是read的平均质量值纵轴是对应的read数量。理想情况下这张图应该是集中在高质量区域的一个单峰峰值通常在Q35~Q40附近。正常的峰型是数量从低质量区到高质量区快速提升然后在峰值处陡峭下降表示大部分read质量都很好只有少数read质量较差。如果图形呈现双峰说明数据里混入了两个质量层次不同的群体。最常见的原因是混样测序multiplexing时index拆分不彻底或者文库本身来自不同批次。遇到这种情况要谨慎必要时把低质量群按质量阈值过滤掉。4.5 Per base sequence content各位置碱基比例的警示信号这个模块展示每个碱基位置上A、T、G、C四种碱基的占比。正常情况下一个DNA样本的四种碱基占比应该保持相对稳定曲线平直A约等于T、G约等于C依据碱基互补配对原则和测序随机性。有两个非常典型的非正常信号。第一个是前5~12个碱基出现明显的碱基偏好波动。这通常来自文库制备过程中的随机引物结合偏好尤其是RNA-seq建库中的随机六聚体引物会有特定的核苷酸偏好模式导致read前几个碱基的AT/GC比例失调。只要波动只发生在一开始的几个循环中后段恢复正常一般不影响后续分析。第二个是全段范围的碱基偏移——比如整条read都是A含量明显高于T含量G比例明显低于C比例这就要怀疑样本质量或者建库过程中出现了序列替换错误属于重大缺陷。还有一种比较有意思的情况是如果某条链上的序列被测出来了而反向互补链没有被测到也可能造成A/T比例失衡。遇到这种类型的FAIL通常建议先看看是不是文库制备方式所致不要急着下结论。4.6 Per sequence GC content理论与实际分布的偏差Per sequence GC content模块展示每条read的GC含量分布曲线并且叠加一条理论正态分布曲线基于Poisson分布的期望值。绿色线代表实际观测的GC分布蓝色线代表理论分布。两条线重合度高说明文库的GC组成均衡。如果实际分布比理论分布宽说明存在一定程度的GC偏好如果出现明显的双峰则大概率是你手里这份数据混入了污染源。这里分享一个排查经验做RNA-seq时如果发现GC分布出现一个不属于人类基因组的峰比如在60%的位置多出一个峰我一般会用Kraken2或者比对软件的统计功能检查一下这个片段来源结果经常是支原体污染或者其他外源物种污染。另外某些极端GC含量的物种比如疟原虫约20% GC一些细菌超过60% GC本身就会让曲线看起来“异常”所以判断时要结合样本来源不要只看模块的红绿灯。4.7 Per base N content与Sequence Length DistributionPer base N content展示的是在每个碱基位置被判读为N的比例。N代表测序仪无法确定具体是哪种碱基。正常样本N含量几乎为0曲线贴着底部走。如果某个位置N比例明显升高可能是测序质量太差、荧光信号重叠或者样本中有PCR错误带来的模板问题。尾部N含量升高在长读长中也不算罕见但如果中段N比例超过5%数据基本没法用。Sequence Length Distribution显示read长度的分布情况。单端/双端测序的读长是固定的模式比如PE150就是150bp。如果出现read长度长短不一比如应该150bp但实际分布成一个范围通常说明测序过程异常终止或者文库里的插入片段长度跨度太大测序仪提前读到头了。对FastQC而言只要超过85%的read长度相同就不算异常。4.8 Sequence Duplication Levels与文库复杂度这个模块我不建议直接看颜色就下结论。它展示的是不同重复水平下read数量的分布完全一样的read包括序列和碱基出现的次数。如果重复水平很高并不是一定意味着数据差。对于WGS这种高覆盖度测序或者超深度的靶向测序高重复率是数据分析中常见的情况但对于RNA-seq或者全转录组来说过高的重复度比如超过50%可能说明文库复杂度低PCR扩增过度或者文库起始量不足。FastQC本身的阈值设定偏保守按全基因组测序的期望来算重复度所以碰见转录组数据经常亮黄灯不代表真的有问题。如果你想把重复率作为metric来评估文库复杂度更专业的做法是用Picard的MarkDuplicates工具它在比对上计算reads的冗余率结果比FastQC可靠得多。FastQC这边的重复度图只适合做初步观察。4.9 Overrepresented sequences与Adapter Content污染和接头的识别重头戏来了。Overrepresented sequences模块会列出出现频率异常高的序列默认阈值是超过总read数的0.1%并给出优先匹配的可能来源比如TruSeq接头、PolyA尾或者某个PCR引物。Adapter Content则用图形方式展示read中不同位置匹配到常见接头序列的比例这一项在部分版本中会与Overrepresented sequences合并展示。为什么会有接头残留建库实验的机理是DNA片段两端连接接头通过PCR扩增富集然后测序仪从接头引物开始读。如果片段长度和测序读长不匹配——比如插入片段只有100bp而测序跑150bp循环——读过头之后就会读到另一端的接头序列。Truseq HT双端接头最常见的接头序列是AGATCGGAAGAGCACACGTCTGAACTCCAGTCAC这串是Illumina平台最常出现的TruSeq adapter读段如果你在报告里频繁看到它基本可以断定接头污染。接头污染处理起来也不难用Trimmomatic的ILLUMINACLIP步骤或者cutadapt把接头去掉。但前提是你得清楚自己的数据到底污染了哪种接头FastQC报告里匹配到的接头信息就是最好的判断依据。还有一类高频率序列未必是接头而是高表达基因的PolyA尾mRNA测序或者是rRNA残留。RNA-seq数据里的一段连续A通常来自转录本的Poly(A)尾巴出现多条rRNA序列说明核糖体去除不彻底。5. 常见问题排查与质控标准的经验判断5.1 红黄绿判读速查表哪些必须处理哪些可以容忍把FastQC的11个模块按下表分类我的处理策略大概是这样的模块状态处理建议Per base sequence qualityFAIL尾部掉质量视严重程度决定是否修剪尾部轻度下降可不处理Per base sequence qualityFAIL全段低质量数据基本不可用考虑重测Per sequence quality scoresFAIL建议按质量阈值过滤低质量readPer base sequence contentFAIL前几位偏差可容忍或使用--nogroup确认偏差范围Per base sequence contentFAIL全段偏移警惕样本污染或建库系统性错误Per sequence GC content双峰检查外源污染用Kraken2或比对工具确认Per base N contentFAIL中段N升高数据不可靠建议重测Sequence Duplication LevelsFAIL判断文库复杂度结合物种及应用场景处理Overrepresented sequencesFAIL接头Trimmomatic/cutadapt去接头Overrepresented sequencesFAILPolyARNA-seq中可容忍DNA-seq中需警惕Adapter ContentFAIL去接头后重新质控Per tile sequence qualityFAIL偏热点联系测序服务商属于平台问题这张表是我基于个人项目的实用经验总结出来的不是官方硬性标准。不同应用场景的标准差异很大比如临床检测对质量要求极为苛刻而科研级的探针捕获测序则可以接受一定程度的尾部质量衰减。5.2 实战场景拿到不合格报告该怎么办场景一per base quality曲线尾部严重掉入红色区。这种情况在长读长测序和部分酶切建库中很常见。先看掉质量的起始位置——如果从110bp开始逐步下降后面到150bp已经跌到Q20以下最直接的办法是用Trimmomatic做滑窗修剪java -jar trimmomatic-0.39.jar SE \ input.fastq.gz output_trimmed.fastq.gz \ LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:80其中SLIDINGWINDOW:4:15的意思是从read开头按4bp窗口滑动只要窗口平均质量低于Q15就从该位置截断。截断之后fastq长度会变小但不影响后续比对。修剪完再用FastQC跑一遍你就能直观看到质量曲线被修好了多少。场景二overrepresented sequences报告里全是接头序列。先用zcat或者seqkit快速确认接头序列占的比例然后决定是否要去除。去除的方式同样可以用fastp它一个命令搞定过滤、修剪、去接头fastp -i R1.fastq.gz -I R2.fastq.gz \ -o R1.clean.fastq.gz -O R2.clean.fastq.gz \ --detect_adapter_for_pe \ --cut_front --cut_tail \ --qualified_quality_phred 20 \ --length_required 80--detect_adapter_for_pe意思是让fastp自动检测并去除PE测序数据中的接头序列对于TruSeq接头效果很好。清理完记得再跑一遍FastQC确认接头模块变绿。场景三GC双峰。这个问题的排查方向要放在“污染”两个字上。如果你是做转录组分析首先怀疑支原体污染如果是环境样本或者宏基因组原本就可能包含多种物种BC双峰反而是正常现象。锁定嫌疑之后可以取一份GC偏高/偏低的reads子集比对到参考数据库比如用BLAST或Kraken2很快就能确认污染来源。5.3 批量汇总质控报告MultiQC高效查看样本量一多一个样本打开一个HTML报告逐个翻看效率太低。MultiQC就是专门解决这个问题的工具它能把大量FastQC结果汇总到一张网页上pip install multiqc multiqc qc_result/ -o multiqc_result/MultiQC会扫描指定目录下的所有_fastqc.zip文件生成一个汇总报告把每个样本的11个模块状态按矩阵展示还能画出各样本质量曲线对比图。做项目汇报的时候一张MultiQC沉淀图比口头讲半小时直观多了。更重要的是它能让你快速找出那一两个不正常的“离群样本”跳过那些正常的报告。6. 实操细节与避坑经验6.1 让FastQC跑得更稳的小习惯用FastQC这几年攒了几个小事关成败的细节。第一永远给样本名加R1/R2标识不要把双端数据放在同一个目录下用同样的前缀跑那样输出的HTML文件名会冲突容易混淆。第二gzip压缩的fastq文件直接用FastQC读没问题但不要给它喂没压缩的fastq大文件读起来慢不说还白白占用磁盘空间。第三FastQC输出目录建议单独存放不要混在原始数据目录里——我见过有人把所有分析结果都塞在下机数据文件夹里几个月后目录乱到根本分不清哪些是原始数据、哪些是中间产物。还有一个非常容易踩的坑FastQC 0.11.5之后默认在生成HTML报告时也会写一个相同文件名的ZIP压缩包。如果你在不同目录批量跑或者用路径前缀方式指定文件记得留意最终输出文件的名字避免后面写脚本做批量处理时因为文件名不匹配导致找不到文件。6.2 和下游分析衔接的建议质控不是终点而是分析流程的入口。我在实际项目中一般这样组织流程拿到数据后先跑一轮FastQC得到最初的“原始数据体检单”根据报告情况决定是否修剪、过滤清洗完数据后再跑一轮FastQC把清洗前后的报告对比一方面确认被检出的缺陷已解除另一方面也为了在文章Method部分写清楚数据处理的流程。还有一点值得强调提交数据到NCBI SRA或者GEO数据库之前绝大多数期刊要求上传原始fastq文件。此时你上传的应该是质控和清洗后的clean data。所以保存好每一步的质控记录不仅是为了自己的分析可重复也是应对审稿人质疑时的有力证据。之前就遇到过审稿人要求提供质控前后的对比结果幸好当初保留了全部FastQC报告才顺利过关。6.3 质控结果如何用于差异分析等下游流程把标题往“GEO数据挖掘”的方向再延伸一点。很多人从GEO下载公开数据之后直接下载开发商提供的矩阵文件就去做差异分析了完全跳过原始fastq的质控。但当你打算重新比对自己的样本处理全流程时把公开数据拉下来跑一遍FastQC往往能发现一些意想不到的问题——比如部分GEO样本本身质量一般如果不去除低质量碱基后续的差异基因列表会平添很多噪声。所以无论是自己的测序数据还是从公共数据库下载的fastq只要最后要走到比对、定量、差异分析这一步都建议先过一遍FastQC。这就像一个处世哲学数据质量决定分析天花板早发现问题早解决永远好过分析到一半回头返工。我在教学时经常跟学员说生信分析百分之四十的时间在折腾数据清洗而FastQC就是你在数据清洗战场上要用的第一把武器。把这一步练成肌肉记忆你会发现后面所有的分析都顺了很多。