第1章:RNA-seq与可重复性挑战
RNA-seq 分析,说白了你就是在做一件事:把细胞里那些 RNA 分子「数」清楚。但听我一句,这事远比你想象的要复杂。我从 2015 年开始接触 RNA-seq,踩过的坑能写一本小册子。今天我把最核心的几个问题给你拆开讲讲。
1.1 RNA-seq 实验设计——从一开始就别走偏
很多人在拿到测序数据后才开始想「怎么分析」,这其实是本末倒置。我个人习惯,在实验设计阶段就要把下游分析的坑先填上。你想想看,如果一开始生物学重复数量不够,后期再牛的统计方法也救不回来。
实验设计的核心,就三个问题:
- 你的比较目的是什么?是看某个基因在两组间的差异表达,还是要发现新的转录本?不同的目的决定你该用哪种文库制备方案。
- 生物学重复做几个?我建议至少 3 个,严谨点 6 个。我曾经接过一个项目,人家只做了 2 个重复,结果差异基因表里一半是假的,那叫一个闹心。
- 测序深度怎么定?如果你只关心高表达的管家基因,10M reads 可能就够了;但你要找低丰度的转录本,30M 起步。这里我给你一个经验表格:
| 应用场景 | 推荐测序深度(million reads) | 说明 |
|---|---|---|
| 基因差异表达(高表达基因) | 10–20 | 基本够用,但低表达基因偏少 |
| 基因差异表达(全基因范围) | 25–40 | 我个人的黄金区间 |
| 新转录本发现 / 可变剪接 | 60–100 | 深度不够,剪接事件根本检测不到 |
| 单细胞 RNA-seq(每个细胞) | 50k–200k | 细胞数量多,单细胞深度低但总量很大 |
1.2 RNA-seq 数据特点——大、乱、且带有系统偏差
RNA-seq 数据不是普通的数字。它有三个让人头疼的特点:
- 计数数据,且过分散。每个基因的 read counts 服从负二项分布,不能用常规的 t 检验。这就是为什么 DESeq2 和 edgeR 这类专门工具是必须的。
- 批次效应如影随形。你分别在周一和周三提取两份样本,用的试剂盒可能来自不同批次,这就产生了批次效应。我见过最夸张的一个案例:同一个实验室、同一个操作员,只是换了另一个品牌的纯化柱,差异基因列表就重了不到 30%。
- 比对困难。真核生物的剪切机制导致同一个基因能产生上百种转录本。比对时多了一个外显子跳跃,你就可能把它当成一个新基因。
为什么会这样?核心原因是 RNA-seq 测量的是「相对丰度」,而不是绝对数量。你今天测 20M reads,明天测 30M reads,基因表达量的绝对数值没法直接比较。必须做标准化。常用的标准化方法有 TPM、FPKM、RPKM,但各有各的坑。我建议你记住一条:FPKM 不建议用,它跨样本比较时会产生偏差。
1.3 可重复性的挑战——你昨天跑出来的结果,今天还能重现吗?
可重复性是 RNA-seq 分析的老大难。学术界有个著名的安慰剂效应:2016 年有人拿同一个 RNA-seq 数据集给 12 个不同的分析团队,结果每个团队报告差异基因列表的重叠率不到 30%。我当时看到这个研究,后背一凉——我自己的管道是不是也存在同样的问题?
问题出在哪儿?我列举几个最常见的「杀手」:
| 挑战 | 典型表现 | 后果 |
|---|---|---|
| 软件版本变化 | HTSeq 0.6.1 和 0.7.0 统计结果不一致 | 差异基因列表出现 10% 以上变动 |
| 参数依赖 | STAR --outFilterMultimapNmax 默认值不同 | 比对率相差 3%–5% |
| 参考基因组版本 | GRCh37 与 GRCh38 | 基因注释差异 > 20,000 条 |
| 计算环境飘移 | CentOS 和 Ubuntu 上 R 的浮点运算精度差异 | 极个别基因的 p-value 会变 |
| 随机种子缺失 | 降采样、重抽样步骤没有固定种子 | 结果每次都不一样 |
所以你看,光靠「记下你用了什么步骤」是不够的。你必须把整个环境——从操作系统到每个工具的版本,到参数配置——全部固化下来。这就是为什么我选择 Nextflow。它能帮你把管道变成一部「可重复的脚本」,在任何机器上都能重现同一份输出。
1.4 一张图看懂 RNA-seq 可重复性挑战
下面这张图总结了从原始测序数据到差异基因列表的过程中,哪些环节最容易引入不可重复性。图上每个节点代表一个关键步骤,红色的「不可重复因素」标出了最需要警惕的地方。
1.5 为什么选择 Nextflow 来解决可重复性?
说了这么多问题,总得有个解法。我个人认为 Nextflow 是目前处理 RNA-seq 可重复性最优雅的方案,没有之一。它不是简单的脚本语言,而是一个 工作流管理系统。核心能力有三条:
- 容器化执行 —— 每个步骤都跑在 Docker 或 Singularity 容器里。你本地用的什么版本,换到服务器还是那个版本,连底层依赖都一模一样。
- 自动追踪依赖 —— 当你定义一个
process时,输入、输出、参数都被记录下来。跑完一次后,只要输入没变,Nextflow 就能跳过已完成的步骤,保证结果一致。 - 架构无关 —— 你可以在笔记本上写管道,然后直接提交到 HPC 集群或云上,不用改一行代码。这是怎么做到的?全靠
-profile配置文件切换运行后端。
好了,这一章我们主要理清了 RNA-seq 的痛点:实验设计不能马虎、数据本身带偏差、可重复性面临软件版本、参数、环境等全方位挑战。你心里先有个底,后面每章我会带着你用 Nextflow 一步步把这些坑填平。记住,可重复不是追求完美,而是让结果可以被验证、被信任。嗯,这一点比写出漂亮的差异基因表重要多了。