RNA-seq 实验设计原则
做 RNA-seq 分析,有个残酷的事实我得先告诉你——统计再牛,也救不了烂实验设计。我在好几个项目里见过这样的情况:测序数据哗哗地回来了,一看差异基因列表,漂亮!结果一深挖,全是批次效应导致的假阳性。白花了几十万,最后只能重做。所以这章我跟你聊聊实验设计里的几个关键坑,咱提前避开。
1. 生物学重复:别省这个钱
问得最多的一个问题:「我只做两个重复行不行?」我的回答永远是不行。
为什么?你看这个图:
生物学重复,说白了就是你从不同个体身上取样——比如三只老鼠、三株细胞、三块组织。它反映的是个体间的真实差异。而技术重复,是把同一个样本分装两次测一下,本质是重复测量,解决不了群体方差的问题。
我个人习惯在正式实验前,至少先跑一个 3v3 的小试配置。如果样本来源比较杂(比如病人组织),我甚至会做到 5 个重复。钱花在重复上,比花在测序深度上值多了。你想想看,一个基因深度够但没生物学重复,统计检验连 p 值都算不出来,那数据就是废的。
2. 测序深度:够用就行,别求多
测序深度,说白了就是每个基因平均被测了多少次。单位是 M(百万reads)。不同目的对深度的要求完全不一样。
| 应用场景 | 推荐深度 | 备注 |
|---|---|---|
| 基因表达差异(常规) | 10–20 M reads / 样本 | 够用,多了边际效应递减 |
| 低表达基因/稀有转录本 | 30–50 M reads / 样本 | 需要深度挖一下 |
| 可变剪接或融合基因 | 40–60 M reads / 样本 | 剪接事件对深度敏感 |
| 单细胞 RNA-seq (10x) | 20–50k reads / 细胞 | 看细胞数量,总量控制 |
我建议你直接从 SRA 数据库看看你研究领域的公开发数据,别人用多少深度,你至少对齐。我手头一个项目,直接怼了 60M reads 一个样本,结果 70% 的 reads 都是核糖体 RNA…那深度再多也没用。
salmon 或 kallisto 做快速定量预览,10 分钟就知道每个样本的有效 reads 够不够。没必要全量跑完才发现深度不够。
# 快速预览 reads 质量
fastqc sample_R1.fastq.gz -o fastqc_output/
# 用 salmon 做轻量级定量
salmon quant -i index -l A \
-1 sample_R1.fastq.gz \
-2 sample_R2.fastq.gz \
-p 8 -o salmon_output/
3. 批次效应:默认为它存在
批次效应有多常见?我跟你说,几乎每一个实验都有。不同提取时间、不同试剂盒、不同跑胶日期、不同测序通道,都会引入批次差异。
控制批次效应,核心策略就两条:
- 随机化:把各处理组的样本打散,混着提取、混着建库、混着上机。别一组处理放一天做,另一组改天做。
- block 设计:如果实在没法在同一天完成,把处理组和对照组在同一个批次里做。比如每个 batch 里都包含一组处理 + 一组对照。
SraRunTable.txt 或你的 metadata 里,包括:提取日期、提取人、试剂盒批次、建库日期、上机通道、测序仪器 ID。做后续批次校正时这些信息能救命。
4. 随机区组设计 vs 简单随机设计
如果你手上有多个变量(比如不同药物 + 不同时间点),建议用随机区组设计。举个例子:
- 简单随机:把所有样本随机分到处理组。样本量少时分组可能不均匀。
- 随机区组:按某个控制因素(如性别、小鼠窝别、病人分期)分层,再在每层内随机分配处理。能排除干扰因素的影响。
我记得有个经典案例——研究药物对各性别小鼠的影响,如果不区分雄雌直接随机,很可能所有雄性都分到药物组,雌性都在对照组,那差异基因到底是药的效应还是性别的效应?谁也说不清。
5. 实际规划:一个 checklist
做实验前,你照着这表过一遍:
| 步骤 | 检查项 | 备注 |
|---|---|---|
| 1. 确定研究目标 | 比较两组还是多组?连续变量还是分类变量? | 影响统计方法和重复数 |
| 2. 设计重复 | 至少 3 个生物学重复/组 | 经费紧张时优先保证重复,牺牲深度 |
| 3. 随机化分层 | 按已知混杂因素分层 | 避免系统偏差 |
| 4. 确定测序深度 | 参考同类研究或预实验 | 别为了省深度而牺牲低位表达 |
| 5. 记录 metadata | 记录所有可能影响数据的因素 | 后续 batch correction 的基础 |
| 6. 做预实验 | 跑 2–3 个样本看看数据质量 | 检查文库复杂度、rRNA 污染等 |
6. 一个小技巧:参考基因组版本的选择
可能你觉得这不属于实验设计,但我见过太多次因为参考基因组版本混用导致的悲剧。不同版本之间的基因 ID 和坐标不一致,你后面做注释时全乱套。
我建议你从一开始就固定好版本,比如一律用 Ensembl v110(2024年最新版),或者 GENCODE v45。并在项目笔记里写明:
# 项目笔记示例
Project: Drug_Response_RNAseq_2025
Reference genome: GRCh38.p14
Annotation: GENCODE v45 (primary assembly)
Index built with: STAR 2.7.11b
Index command: STAR --runThreadN 16 \
--runMode genomeGenerate \
--genomeDir ./star_index \
--genomeFastaFiles GRCh38.p14.genome.fa \
--sjdbGTFfile gencode.v45.primary_assembly.annotation.gtf