1. RNA-seq 基础回顾:从测序到表达矩阵
各位好,我是这门课的主讲。做 RNA-seq 分析也踩了不少坑,今天咱们从头捋一遍基础。别小看这章,很多人拿到表达矩阵就直接扔进模型,结果跑出来的特征毫无生物学意义——说白了,你连数据怎么来的都不清楚,怎么敢相信模型学到的规律?
核心一句话:表达矩阵不是天然存在的,它是测序→比对→定量这三步层层加工出来的产物。每一步的选择都会直接影响你最终给机器学习的特征。
1.1 测序原理——十来分钟搞懂
RNA-seq 的第一步是把细胞里的 RNA 打断成小片段,然后上机测序。现在主流平台还是 Illumina 的边合成边测序(SBS)。我记得刚入行时对“测序深度”这个概念特别模糊,后来亲手跑了两次文库才明白——其实就是测序仪到底读了多少条片段。
测序读长一般有两种:
- 单端(SE):只读片段的一端,成本低,但没法区分重复片段。我做过一个项目,用 SE 数据做异构体定量,结果偏差大到离谱——后来换成 PE 才救回来。
- 双端(PE):两端一起读,能获得插入片段长度信息,定量更准。我建议做差异表达或机器学习任务时,优先用 PE100 或 PE150。
产出数据就是一堆 FASTQ 文件:里面记录了每条 read 的碱基序列和质量分数。为什么强调这个?因为后面所有的比对、定量,甚至特征矩阵的质量,都依赖于这一步的测序质量。
我的经验:拿到 FASTQ 后第一件事一定是跑 FastQC,看看碱基质量、GC 含量、接头污染。跳过这一步,后面可能白干。
1.2 比对与定量——两条路,选对很重要
有了 reads,下一步就是确定它们来自哪些基因。这个过程叫“比对”或者“伪比对”,取决于你选哪个工具。
传统方法是先用 STAR 或 HISAT2 把 reads 比对到参考基因组上,然后通过 HTSeq-count 或 featureCounts 统计每个基因覆盖到的 reads 数。这个方法准确,但慢。我曾在 200 个样本上跑 STAR,单线程跑了整整一周。
后来出现了“伪比对”工具,比如 Salmon 和 kallisto。它们不把 reads 完全对齐到基因组,而是直接比对到转录本序列上,再通过概率模型估算丰度。速度快得吓人,而且精度并不差。我现在的新项目基本都直接上 Salmon。
千万别混淆:比对到基因组和伪比对到转录本,输出的矩阵单位完全不同——前者是 counts,后者可以直接输出 TPM。后面做模型特征时,一定要搞清楚你手里的矩阵类型。
1.3 表达矩阵三大金刚——Counts / FPKM / TPM
不管用哪种方法,最终都会得到一个基因×样本的矩阵。但矩阵里的数值含义可以完全不同。我见过有人拿 FPKM 矩阵直接做 PCA,结果聚类全乱——因为 FPKM 在不同样本间不可比。
| 矩阵类型 | 含义 | 适用场景 | 注意点 |
|---|---|---|---|
| Raw Counts | 每个基因测到的 reads 数量(整数) | 差异表达分析(DESeq2 / edgeR) | 受测序深度和基因长度影响,不可跨样本比较 |
| FPKM / RPKM | 每千碱基每百万比对片段数(浮点数) | 基因内相对表达比较 | 样本间比较时会有偏差(因为总 reads 数不同) |
| TPM | 每百万转录本数(浮点数) | 跨样本/跨基因比较,机器学习特征 | 需要先知道转录本长度;最推荐用于模型输入 |
为什么我推荐 TPM?因为它先归一化基因长度再归一化文库大小,数值在样本间可直接对比。如果你要训练一个跨样本的分类器,TPM 是最安全的起点。
避坑指南:千万不要把 Raw Counts 直接扔进线性模型!counts 是离散的,且方差随均值变化,需要先做方差稳定变换(如 rlog)或者转 log2(TPM+1)。我曾经用 counts 做线性回归,结果 RMSE 爆炸——后来才发现变量分布严重右偏。
1.4 从 FASTQ 到矩阵的完整流程
下面这张流程图帮你理清脉络。建议保存下来,每次跑分析前过一遍——我自己的文件夹里就贴着这张图,防止自己漏掉某个关键步骤。
1.5 实际工作中怎么选?给你三个判断标准
- 看问题类型:如果是差异表达基因筛选,用 Raw Counts + DESeq2;如果是给机器学习建特征,用 log2(TPM+1) 最稳妥。
- 看样本量:几十个样本以内,STAR+featureCounts 还能忍;成百上千时,Salmon 是唯一选择——我跑过 500 个肿瘤样本,Salmon 半天搞定,STAR 要一周。
- 看后续分析:如果要做融合基因或可变剪接,必须用比对到基因组的路线(STAR);如果只是表达量建模,伪比对足够。
小技巧:不管你选择哪条路线,最终拿到表达矩阵后,务必检查一下行名和列名是否一致。我曾经因为样本命名不规范,合并矩阵时搞混了肺癌和正常样本,结果模型学到的其实是命名规律而不是生物学信号——有点尴尬。