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%),基本上就是测序失败的。
这里有张图,帮你快速理清这些类型的关系:
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,对比前后质量分布,心里才踏实。上面那张分类图已经把核心逻辑串起来了——你记住了常见类型和影响,过滤时就知道该重点看什么。