3. 原始数据预处理
测序仪下机的那一瞬间,你拿到的 FASTQ 文件其实挺「脏」的。里面不光有我们想要的 cDNA 片段,还混着接头(Adapter)、测序引物,以及一堆越往后读质量越差的碱基。我早年刚跑 RNA-seq 时,觉得这步无所谓,直接拿 raw data 去比对——结果比对率连 60% 都不到,差异分析更是乱七八糟。后来才明白,预处理这步没做干净,后面所有结论都得打问号。
这一章,我就把 Trimmomatic 和 Trim Galore 这两个主流工具怎么选、怎么配、怎么避坑,一次性给你讲透。
接头污染是怎么来的?为什么非切不可?
RNA-seq 建库时,我们需要把 cDNA 片段两头接上测序接头,才能上机簇生成和测序。但片段长度分布是随机的——有些片段比读长短,测序仪一读就「越界」了,把接头序列也读进去。这就是所谓的 接头污染。
你想想看,如果比对时 reads 尾巴上挂着一截接头,比对软件会怎么处理?要么比对不上,要么比对到基因组上错误的位置。我见过一个极端案例:某批数据 FastQC 报告里接头污染率高达 12%,没处理就直接跑比对,结果基因定量结果整整偏了一倍。所以,接头切除是预处理的第一个硬性门槛。
低质量序列为什么必须修剪?
测序质量从 5' 到 3' 是逐渐下降的——这是 Illumina 平台的物理特性决定的。3' 端的碱基越往后,错误率越高。如果你不修剪这些低质量尾巴,它们会直接导致:
- 假阳性 SNP / 突变:低质量碱基被错误识别为变异位点。
- 比对率下降:低质量区域比对软件无法匹配。
- 定量偏差:低质量 reads 被错误分配到多个基因上。
我习惯用 滑动窗口修剪策略——从 5' 端开始,每次取一个窗口(比如 4 bp),计算平均质量,如果低于阈值就从窗口位置直接切掉。这样既保住了高质量的前段,又能干净地切掉后段「垃圾」。
Trimmomatic:工业级的老牌工具
Trimmomatic 是我用得最多的工具。它支持双端(PE)和单端(SE),参数设计很工程化,适合批量处理。来看看它的核心参数:
java -jar trimmomatic-0.39.jar PE \
-threads 8 \
-phred33 \
input_R1.fastq.gz input_R2.fastq.gz \
output_R1_paired.fastq.gz output_R1_unpaired.fastq.gz \
output_R2_paired.fastq.gz output_R2_unpaired.fastq.gz \
ILLUMINACLIP:TruSeq3-PE.fa:2:30:10 \
LEADING:3 \
TRAILING:3 \
SLIDINGWINDOW:4:15 \
MINLEN:36
我把这个命令拆解开,一个个参数说清楚:
| 参数 | 含义 | 我常用的值 |
|---|---|---|
ILLUMINACLIP | 切除接头:fa文件:允许错配数:比对分值阈值:palindrome分值 | 2:30:10 |
LEADING | 切除开头的低质量碱基(低于该值直接切) | 3 |
TRAILING | 切除结尾的低质量碱基 | 3 |
SLIDINGWINDOW | 滑动窗口修剪:窗口大小:平均质量阈值 | 4:15 |
MINLEN | 过滤掉修剪后长度小于该值的 reads | 36 |
Trim Galore:新手友好,自动检测接头
Trim Galore 本质上是 Cutadapt + FastQC 的封装。它最大的优点是能自动检测接头类型——你甚至不用提供接头序列文件。它会在运行前先扫描一小部分 reads,推测接头序列,然后再全量切除。
trim_galore --paired \
--quality 20 \
--phred33 \
--length 36 \
--stringency 3 \
--cores 8 \
--output_dir ./trimmed \
sample_R1.fastq.gz sample_R2.fastq.gz
参数解读:
--quality 20:切除质量低于 Q20 的尾部碱基(相当于 Trimmomatic 的TRAILING)。--length 36:过滤掉短于 36 bp 的 reads。--stringency 3:接头匹配的严格度——值越高越保守。我一般用 3,遇到接头残留多的样本会降到 1。--cores:多核加速,我通常开 8 核。
Trimmomatic vs Trim Galore:怎么选?
| 对比维度 | Trimmomatic | Trim Galore |
|---|---|---|
| 接头检测方式 | 需手动提供接头 FASTA | 自动检测 + 手动指定均可 |
| 滑动窗口修剪 | 原生支持,参数精确 | 不支持(仅尾部修剪) |
| 双端 pairing 保留 | 强(输出 paired + unpaired) | 强(自动同步两端) |
| 运行速度 | 略快(Java 多线程) | 中等(单线程 + 自动检测) |
| 适合场景 | 批量生产、参数精细控制 | 快速上手、自动化流程 |
我个人习惯是:建库试剂盒固定的项目用 Trimmomatic,因为参数可精确调优;公共数据或来源不明的数据用 Trim Galore,让它自动识别接头,省去手动查接头序列的麻烦。
避坑指南:我踩过的 3 个坑
- 接头序列文件版本不对。 Trimmomatic 自带的 TruSeq3-PE.fa 对应的是老版 TruSeq 试剂盒。如果建库用了 TruSeq RNA CD 或其它改版,接头序列可能不同。我有一批数据用了 TruSeq3-PE.fa,结果残留率一直降不下来——后来换成 TruSeq2-PE.fa 才解决。所以,每次都要确认试剂盒版本。
- 双端 reads 不同步。 处理双端数据时,如果一端的 read 被过滤掉了,另一端也要同步丢弃。Trimmomatic 的 PE 模式和 Trim Galore 的
--paired都会自动处理,但如果你自己写脚本切接头,很容易搞乱 pairing 顺序。我建议直接用成熟工具,别自己造轮子。 - 过度修剪导致 reads 太短。 有一回我把
SLIDINGWINDOW:4:20设得太严,结果 40% 的 reads 被切到 36 bp 以下丢掉了。后来我改成4:15,保留了更多有效数据。阈值不是越高越好,要根据数据质量灵活调整。
预处理后的质检:你怎么知道做干净了?
跑完预处理,一定要用 FastQC 再检查一遍。我重点关注三个指标:
- Per base sequence quality:修剪后大部分区域应该保持在绿色区(Q30 以上)。
- Adapter Content:接头含量应接近 0%。如果还有 0.5% 以上的残留,说明切除参数太松。
- Sequence Length Distribution:长度分布应该是一个光滑的峰形,没有异常短 read 的拖尾。
预处理这步,说白了就是「脏活累活」,但也是整个 RNA-seq 流程里最值得花时间打磨的环节。你把这一步做扎实了,后面的比对、定量、差异分析都会顺很多。工具本身不复杂,复杂的是根据你的数据特点去调参数——而这些经验,只能靠一次次跑完质检报告、再回头调整参数来积累。