3. 低质量reads的定义及对下游分析的影响

说起低质量reads,我刚开始做测序的时候其实挺困惑的。测序仪产出的数据看上去都差不多,都是好几十G的fastq文件,到底哪些算低质量?怎么定义一个read是“垃圾”呢?后来吃了不少亏,才慢慢摸清楚这里面的门道。

3.1 低质量reads的常见类型

我个人习惯把低质量reads分成这几类,你对照看看以前的处理流程有没有遗漏:

  • 低碱基质量分数:一条read中连续出现多个低Q值(比如Q<20)的碱基,甚至整条read平均Q值低于阈值(通常是Q20或Q30)。
  • 异常短或异常长:长度偏离正常文库插入片段范围,可能是测序错误或文库污染。
  • 高序列重复度:完全相同的序列出现多次,比如PCR重复导致的无用reads。
  • 接头/引物污染:没有被切除干净的接头序列,尤其是双端测序中reads间有overlap但未正确分离的情况。
  • 高GC偏差:GC含量严重偏离物种基因组平均水平,常见于扩增偏好或污染。
  • 含N比例过高:如果一条read里N碱基占比超过某个阈值(比如5%),基本上就是测序失败的。

这里有张图,帮你快速理清这些类型的关系:

低质量reads分类框架 低质量reads 低Q值 含N过多 长度异常/GC偏差 重复/污染 接头残留 扩增偏好 下游分析结果异常 提示:实际项目中这些类型经常叠加出现。 比如一条低Q值read可能同时携带接头并含有大量N。

3.2 定义阈值到底怎么定?

说实话,这个没有标准答案。不同测序平台、不同应用场景,阈值完全不一样。我整理了一个常用参考表:

指标 常见阈值 说明
平均碱基Q值 ≥ Q20(错误率1%)或 ≥ Q30(错误率0.1%) Illumina数据常要求Q30比例>80%
最低碱基Q值 建议 ≥ Q10,序列开头或结尾允许短暂掉至Q5 超过连续3个Q<10建议截断或丢弃
read长度 丢弃 < 全长50%的短read 例如150bp的读长,丢弃<75bp的
N碱基比例 允许 < 2%~5% 超过则说明测序质量太差
GC含量 相对物种基因组均值偏差 < 20% 偏离太远提示污染或偏好
重复reads比例 去除PCR重复后保留唯一read 使用工具如fastp或bbduk标记重复

实战经验:我记得有一次做细菌基因组组装,数据看起来Q30有90%以上,但组装出来的contig N50特别低。排查后发现是因为有一条低覆盖度的污染reads混在里面,长度只有30bp,但Q值很高。后来我加上了长度过滤,N50直接翻了一番。所以别光盯着Q值,长度过滤和污染检测同样重要。

3.3 对下游分析的影响——避坑矩阵

低质量reads要是没过滤干净,后面每一步都可能出问题。我根据自己的踩坑经历,整理了一张影响矩阵:

下游分析类型 低质量reads带来的具体影响 我的建议
序列比对(Alignment) 比对率下降,错配率升高,产生大量软剪接或异常比对;还会增加计算量。 过滤后比对,能省50%以上CPU时间
基因组组装(Assembly) 引入错误kmer,导致contig断裂或错误连接;杂合假阳性SNP增多。 强烈建议先过滤再组装,特别是长读长数据
变异检测(Variant Calling) 假阳性SNP/InDel增多,特别是低覆盖区域;同时可能掩盖真实变异。 最好再做一遍BQSR根据碱基质量校准
基因表达定量(RNA-seq) 低质量reads可能比对到错误基因,导致表达量估计偏差。 建议使用双端过滤,并检查GC偏差
宏基因组分析 低质量序列容易分类错误,产生假阳性物种或比例失真。 要小心,虚假低质量reads可能来自非目标物种
甲基化分析 碱基质量影响甲基化call准确度,尤其CpG位点。 对Q值要求更高,建议Q25以上

避坑指南:我曾经在RNA-seq项目中,因为偷懒没有做接头切除,结果接头序列比对上基因,导致几个基因表达量虚高。后来重新跑了一遍fastp,去掉接头和低质量reads,结果才恢复正常。嗯,从那以后我再也不敢跳过这步了。

3.4 实用过滤脚本示例

说了这么多理论,最后上个实战用的命令。我平时最常用的是 fastp,一行搞定大部分过滤需求:

fastp -i in.R1.fastq -I in.R2.fastq \
      -o out.R1.fastq -O out.R2.fastq \
      --cut_tail --cut_tail_mean_quality 20 \
      --length_required 50 \
      --n_base_limit 5 \
      --average_qual 20 \
      --correction \
      --html report.html

参数解释:

  • --cut_tail --cut_tail_mean_quality 20:从3'端切掉平均质量低于20的区域。
  • --length_required 50:丢弃长度小于50bp的read。
  • --n_base_limit 5:如果一条read里N碱基数超过5个,整条丢弃。
  • --average_qual 20:整条read平均Q值需≥20,否则丢弃。
  • --correction:开启碱基校正(基于双端overlap),能纠正部分测序错误。

如果你用老牌工具 Trimmomatic,命令是这样:

java -jar trimmomatic-0.39.jar PE \
  in.R1.fastq in.R2.fastq \
  out.R1.paired.fastq out.R1.unpaired.fastq \
  out.R2.paired.fastq out.R2.unpaired.fastq \
  ILLUMINACLIP:adapters.fa:2:30:10 \
  LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:50

为什么我推荐fastp?因为它比Trimmomatic快不少,还能自动检测接头。当然,Trimmomatic是老牌经典,在某些极端情况下的过滤策略更细致。看个人习惯吧。

3.5 小结:过滤跑完,怎么看结果?

跑完过滤后,别急着直接扔进下游。我习惯先看一眼过滤报告里的统计:

  • 原始reads数和过滤后reads数——如果去掉超过30%的数据,说明原始数据质量可能有问题,需要排查实验。
  • Q30比例变化——过滤后应该明显提升。
  • GC含量分布——检查是否出现双峰,提示可能的污染。
  • 接头残留率——理想情况应该小于0.1%。

我个人偏好把过滤后的fastq再跑一遍FastQC,对比前后质量分布,心里才踏实。上面那张分类图已经把核心逻辑串起来了——你记住了常见类型和影响,过滤时就知道该重点看什么。