4. FastQC进阶:GC含量异常、序列重复水平、过表达序列的排查思路

基础报告看完了,那些绿色的"PASS"当然让人安心。但真正出问题的时候,往往就是那几个红色警告。今天咱们就专门聊聊三个让我又爱又恨的指标:GC含量、序列重复水平和过表达序列。

这三个指标,说白了就是测序质量的"试金石"。很多批次失败的根源,都能从它们身上找到线索。我在项目中遇到的那些让人头疼的案例,十有八九都会涉及它们。

本章核心:学会通过GC含量分布、重复序列水平、过表达序列这三个指标,反向推断批次失败的根本原因——是文库污染?PCR过度扩增?还是建库流程本身有问题?

4.1 GC含量异常——污染与文库偏差的照妖镜

GC含量异常,其实是个很有意思的指标。你的样本基因组GC含量是已知的吧?比如人基因组大概是41%左右,大肠杆菌大概50%。如果FastQC跑出来一个完全不同的分布,那就要警惕了。

我个人习惯,拿到报告第一件事就是看Per base sequence content和Per sequence GC content这两张图。先瞄一眼GC含量的峰值在哪,再判断是不是"双峰"。为什么会这样?我给大家拆解一下。

4.1.1 正常形态 vs 异常形态

形态类型 特征 常见原因
单峰正态分布 GC含量集中在理论值附近,呈正态分布 正常文库,无污染
双峰分布 出现两个明显的峰 文库污染(如混入其他物种DNA)
峰位偏移(偏左/偏右) 峰值显著偏离基因组理论值 PCR偏好性、引物偏差、污染物
峰形扁平 分布很宽,没有明显峰 建库质量差、低复杂度文库

有一次我在处理一批肠道微生物样本的质控时,就见过非常典型的双峰。明明样本标签写的是人粪便样本,但GC含量在38%和52%各有一个峰。嗯,后来查证,是实验员把一份海洋细菌的样本搞混了。你看,这个指标直接暴露了问题。

4.1.2 双峰排查的具体操作

如果你看到了双峰,别慌。按下面这几步来查:

  1. 确认理论GC含量:去查一下你的参考基因组GC%是多少。人? 小鼠? 线虫? 每个物种不一样。
  2. 比对GC分布图:如果多了一个明显的小峰,那个峰可能对应的是污染物。比如,人样本混进了支原体(GC含量低),或者混进了某些高GC的细菌。
  3. 检查 Reads 来源:用kraken2或centrifuge对所有Reads进行物种分类,看看第二峰对应的到底是哪个物种。
  4. 看是单端还是双端:如果只有一条Read(如R1)的双峰明显,另一条(R2)正常,那可能是接头污染或者某一端测序质量太差导致的。

这里我提一个自己踩过的坑。我曾经以为双峰一定是污染,花了一整天做物种分类,结果发现只是样本中混入了大量载体验载体序列。那个载体验载体GC含量跟靶基因不同,硬生生造了个伪双峰出来。所以,别忘了检查过表达序列那一页,两者经常联动。

避坑指南:如果你用的是RNA-Seq数据,GC含量分布本身就会比DNA-Seq更"胖"一些。因为转录组本身的GC含量差异就很大。不要轻易下污染结论,先确认你的实验类型。

4.2 序列重复水平——PCR偏差与文库复杂度的晴雨表

这个指标,我建议大家重点关注。Sequence Duplication Levels这个图,直接反映了文库的复杂度。说白了就是:你的文库到底有多少种不同的DNA片段?

理想情况下,大部分序列应该只出现一次。如果出现了大量重复序列,那就要想想:是PCR重复?还是技术重复?还是生物学上本来就如此?

4.2.1 重复序列的几种类型

类型 来源 解决方案
PCR重复(PCR Duplicates) PCR扩增循环数过多,或文库起始量太低 降低PCR循环数、增加起始量、使用dedup工具
光学重复(Optical Duplicates) 测序仪读到了同一个簇的两次信号 下游去除重复时,启用光学重复检测参数
生物学重复 高丰度转录本、线粒体DNA、核糖体RNA 考虑是否需要去除;RNA-Seq中高表达基因一般保留
文库重复(Technical Duplicates) 同一文库被多次测序 设计实验时合并同一文库不同测序道的输出

我见过最夸张的案例:一个样本的重复水平达到90%以上。FastQC报告里,超过80%的序列被标记为重复。那位同学跑了一整个batch的样本,结果全得重新来过。

为什么?因为他的文库起始DNA量只有1 ng,正常应该是50 ng。PCR扩增了18个循环,硬生生把那么点DNA扩了又扩,导致大部分reads都是同一个DNA片段的拷贝。

4.2.2 如何判断重复是否"异常"

我的判断标准很简单——看重复序列的占比曲线:

  • 绿色通过:超过50%的序列是单拷贝(Unique),重复序列占比小于30%。这说明文库复杂度正常。
  • 黄色警告:大约30-40%的序列出现2-10次重复。需要引起注意,但不一定失败。
  • 红色警告:超过50%的序列是重复序列,且其中很多重复次数大于10。嗯,这基本就是PCR bias了。

遇到红色警告,我会先做一步快速验证:从fastq中随机抽取100万条reads,比对到参考基因组看覆盖度。如果覆盖度非常不均匀,存在大量单一位点叠了上百个重复reads,那基本就坐实了PCR偏差。

# 快速用samtools检查覆盖度
samtools view -bS aligned.sam | samtools sort -o sorted.bam
samtools depth sorted.bam | awk '{if($3 > 100) count++} END {print "高覆盖位点(>100x): " count}'

我的一点经验:如果你做的是ChIP-Seq,重复率会天然比RNA-Seq或DNA-Seq高。因为ChIP富集的就是特定区域的DNA片段。这时候不要盲目去除重复,否则会丢掉真正的信号。但如果你做的是WGS(全基因组测序),发现重复率超过40%,那就要上心了。

4.3 过表达序列——污染与建库失误的"窃听器"

Overrepresented sequences,中文叫"过表达序列"。这个指标最直接:它显示了那些在文库中出现频率异常高的序列。FastQC会自动尝试识别这些序列是什么东西——接头?载体?还是某种污染物?

我每次排查失败batch,都会把过表达序列那一页截个图留底。因为很多时候,问题的答案就写在那里。咱们来看三种常见情况。

4.3.1 接头残留

最常见的情况,没有之一。插入片段太短,测序读长超过了片段长度,结果把Read两端的接头也读出来了。FastQC会显示类似这样:

Overrepresented sequences:
AGATCGGAAGAGCACACGTCTGAACTCCAGTCA (Illumina Universal Adapter)
-- 出现次数: 1,234,567 次
-- 占所有序列的 15.23%

解决方案也很直接:用cutadapt或Trimmomatic把接头切掉就好。不过,如果发现批量的样本都有高比例的接头残留,那说明建库时的片段筛选出了问题。可能是磁珠纯化步骤没控制好,或者凝胶切胶的时候选错了大小范围。

# 用cutadapt去除接头,并切除低质量碱基
cutadapt -a AGATCGGAAGAGCACACGTCTGAACTCCAGTCA \
         -q 15,10 \
         -o trimmed_R1.fastq \
         raw_R1.fastq

我曾经踩过的坑:明明我用了cutadapt,但FastQC报告还是显示有接头残留。为什么?因为cutadapt的参数设得太宽松了。记得加上-e 0.1(允许10%的错配)和--minimum-length 36(过滤掉过短的reads),这样效果才彻底。

4.3.2 载体序列 / 核糖体RNA

另一个我经常遇到的情况:"Overrepresented sequences"那一栏显示的是载体序列(如pUC19、pET系列)或者rRNA序列。这说明什么?说明在文库构建阶段没有把DNA消化干净。

如果是质粒载体残留,常见原因有两种:一是做质粒测序验证时忘记去掉载体骨架,直接把含有载体的样本送测序了。二是做转座子突变文库时,PCR扩增了载体区域,导致大量载体序列被引入文库。

如果是rRNA残留,那大概率是RNA-Seq的rRNA去除步骤没做好。现在的商业试剂盒(比如Ribo-Zero)效率很高,但偶尔也会搞砸。我遇到过一次,是因为实验员移液时不小心把rRNA去除磁珠吸出去了。

4.3.3 微生物污染

如果过表达序列被识别为某个特定微生物的基因组序列,那就要严肃对待了。特别是在处理的样本如果是人源样本或环境样本时,微量的污染可能不会明显影响GC双峰,但会在过表达序列中暴露出来。

我处理过一批从医院采集的咽拭子样本(做宏基因组测序)。FastQC显示有大量金黄色葡萄球菌的序列富集。嗯,最后检查发现,有一名实验员采样时手部消毒不彻底,样本被皮肤菌群污染了。

4.4 三个指标的联动排查思路

这三个指标不是孤立的。在实际排查中,它们经常互相印证。我总结了一套排查流程图,大家可以参考:

GC含量、重复水平、过表达序列联动排查流程 批次质控失败排查——三个核心指标联动分析 FastQC报告出现红色/黄色警告 GC含量异常 看分布形态 & 峰值位置 序列重复水平过高 看重复类型 & 占比 过表达序列 识别具体序列来源 是双峰吗? GC分布 是 物种污染/载体污染 结合过表达序列做BLAST 否 PCR偏差/低起始量 结合重复水平判断 重复率>50%? 且非ChIP-Seq 是 PCR重复! 需要重做 增加起始量/减少PCR循环 否 可接受范围 检查其他指标是否通过 核心原则:先看是否联动 GC双峰 + 过表达序列一致 → 大概率污染;重复率高 + 过表达序列正常 → PCR偏差

拿到报告后,我的排查顺序一般是这样的:

  1. 首先看GC含量分布:是否有双峰?峰位是否偏离理论值?这会告诉你有没有宏观上的异常。
  2. 接着看过表达序列:如果GC异常,过表达序列大概率能告诉你具体是什么东西混进来了。
  3. 最后看重复水平:高重复率往往对应的是"假阳性"——即使GC和过表达没问题,高重复率的样本也需要谨慎对待。

4.5 进阶排查案例汇总

场景 GC含量 重复水平 过表达序列 最可能原因
场景A 双峰,GC 41% 和 28% 正常(约15%) 无显著过表达 人源样本混入AT-rich污染物(如真菌DNA)
场景B 正常,单峰 红色警告(>60%) 无显著过表达 PCR循环过多或起始量不足
场景C 正常,单峰 黄色警告(>30%) 大量Illumina接头序列 插入片段过短,接头未切除干净
场景D 双峰,GC 41% 和 50% 红色警告(>70%) 载体序列富集 载体DNA污染且被过度扩增

我个人的一个小习惯:在正式跑全库分析之前,我会先用fastqc跑一跑每个样本的"预览版"(取前10万条reads),看个大概趋势。如果这一步就发现大量重复或异常GC,那可能整批次都有问题,就不用浪费时间跑全量了。

# 快速预览版fastqc
zcat raw_R1.fastq.gz | head -400000 | gzip > preview_R1.fastq.gz
fastqc preview_R1.fastq.gz

嗯,这其实是一种预质控的思路。很多batch在正式跑全流程之前,提前发现一两个这样的异常样本,就能避免整批次重做。说白了,质控不是为了找问题而找问题,而是为了节约时间和成本。我在这个环节踩过的坑,基本都成了后来"预警检查清单"的一部分了。