4. 质量控制与预处理:FastQC、MultiQC与数据清洗
拿到RNA-seq原始数据(FASTQ文件),第一件事不是急着跑比对。说实话,我见过太多人直接跳过这一步,结果下游分析全是垃圾。质量控制是整条分析管线的基石,这一步稳了,后面才能踏实。
你会问:原始数据到底能有什么问题?很多。测序仪偶尔会犯糊涂,接头序列没切干净,碱基质量在read末尾跳水,甚至样品标签(barcode)都可能是乱的。这些问题不提前处理,后续的特征学习全是噪声。
我个人习惯的处理管线分三个环节:先用FastQC扫一遍每个样本,然后用MultiQC把几十个样本的报告合并起来对比,最后根据报告做数据清洗。这条流水线我跑了不下上百次,稳稳的。
4.1 用FastQC给数据“体检”
FastQC是业界最通用的质检工具。它不修改数据,只读取FASTQ文件,输出一份包含十几个质量指标的HTML报告。
安装与运行:
FastQC用起来极其简单,一行命令搞定:
fastqc sample_1.fastq.gz sample_2.fastq.gz -o ./qc_reports/ -t 4
sample_1.fastq.gz:输入文件,支持gzip压缩格式-o ./qc_reports/:输出目录-t 4:用4个线程并行跑,大项目时很管用
跑完后每个样本会生成一个.html报告和一个.zip压缩包。只保留HTML就行,zip可以删掉。
关键指标解读:
报告默认会打开「Per base sequence quality」这个模块,这是最重要的一个图。它按read的每个位置画箱线图,黄色背景表示良好区间(Q > 28),红色背景表示拒绝区间(Q < 20)。如果后半部分的箱线图扎进了红色区,基本可以断定read质量在衰减。
我重点关注这几个模块:
| 模块名称 | 检查什么 | 常见警告原因 |
|---|---|---|
| Per base sequence quality | 每个碱基位置的平均质量分数 | 测序反应后期酶活性下降 |
| Per sequence GC content | 每条read的GC含量分布 | 污染或文库扩增偏差 |
| Adapter Content | 接头序列是否残留 | 建库时接头切得不干净 |
| Overrepresented sequences | 是否存在异常高丰度的序列 | 接头二聚体或PCR重复 |
4.2 用MultiQC批量“会诊”
当你有几十个样本时,一个个打开FastQC报告太折磨了。MultiQC能读取FastQC输出,把所有的图表聚合到一份交互式HTML报告里。
一条命令汇总:
multiqc ./qc_reports/ -o ./multiqc_report/
MultiQC会自动扫描qc_reports/目录下的所有FastQC产出,包括那些zip文件和html文件。输出一个multiqc_report.html,非常好用。
MultiQC比FastQC强在哪?
它支持横向对比。举个例子,「Per sequence GC content」这个图在单样本报告里就是一条曲线,但在MultiQC里能把所有样本的曲线叠在一起。如果某条曲线明显偏离全局分布,往往意味着那个样本有问题——污染、建库失败或样品搞混了。我记得有一次跑完MultiQC,发现有两个样本的GC曲线跑到45%去了,跟其他样本的曲线完全分家。后来一查,原来是文库制备时混入了细菌DNA。
4.3 数据清洗——把脏数据“洗”干净
看完报告,心里有数了,接下来动手处理。常用的工具有Trimmomatic、cutadapt、fastp。我个人偏向用Trimmomatic,因为它稳定且功能全,一个工具就能搞定去接头、滑窗裁剪、长度过滤等所有操作。
Trimmomatic典型流程:
java -jar trimmomatic-0.39.jar PE \
sample_R1.fastq.gz sample_R2.fastq.gz \
sample_R1_clean.fastq.gz sample_R1_unpaired.fastq.gz \
sample_R2_clean.fastq.gz sample_R2_unpaired.fastq.gz \
ILLUMINACLIP:TruSeq3-PE.fa:2:30:10 \
SLIDINGWINDOW:4:20 \
MINLEN:36
这个命令看着参数多,我来拆开讲:
PE:双端测序模式(paired-end)。单端用SEILLUMINACLIP:去接头。后面的2:30:10表示允许2个错配、30分匹配阈值、10分palindrome模式阈值SLIDINGWINDOW:4:20:滑窗裁剪。窗口4个碱基,平均质量低于Q20就切除MINLEN:36:扔掉裁剪后长度不足36bp的read
_clean文件是两端都保留下来的read对;两个_unpaired文件是一端被丢弃、另一端还是好数据的read。下游分析只用_clean文件,_unpaired可以归档备查。
参数调优:
参数不是死的。我一般根据FastQC的报告来微调:
| FastQC问题 | Trimmomatic参数调整 |
|---|---|
| 接头残留(Adapter Content亮红灯) | 提高ILLUMINACLIP的匹配严格度,比如加大2:20:10 |
| read末尾质量跳水 | 提高SLIDINGWINDOW阈值到4:25,切掉更多低质量尾段 |
| 短read比例偏高 | 提高MINLEN,比如调到50或70 |
4:30),结果清洗后只保留下60%的read。清洗不是丢得越多越好,要在质量和保留率之间取平衡。建议先用1-2个样本试跑,确认参数合理后再批量跑完。
4.4 清洗后验证
清洗完不是结束,我要再做一轮FastQC验证。看看那些红色警告还在不在。正常的流程是:清洗前QC → 清洗 → 清洗后QC。如果清洗后报告里还是满屏红色,说明参数不对,得回头调整。
这一步虽然是工作量有点大,但绝对值得。数据洗干净了,后面的差异表达分析、聚类结果都会更稳健。
以上就是我处理RNA-seq质量控制的完整流程。从拿到原始数据到产出干净可用的FASTQ,其实花不了太多时间,但这个流程能帮你避开无数个后续分析的坑。数据干净了,后面做特征学习时,模型学到的才真正是肿瘤亚型的生物学信号,而不是测序误差的噪声。