3. 实验设计中的随机化与区组化
你在 RNA-seq 项目中遇到过这种痛苦吗?数据跑完,主成分分析一出来,第一主成分不是处理 vs 对照,而是“第一批送样的样本” vs “第二批送样的样本”。如果碰上了,八成是实验设计时就埋下了批次效应的种子。
我个人的经验是:后期用 ComBat、limma removeBatchEffect 这些统计方法去校正,虽然能修,但总归是“亡羊补牢”。更聪明的做法,是在你开始提 RNA 之前,就用实验设计把批次效应摁死在摇篮里。今天我就跟你聊聊两个最核心的手段——随机化与区组化。
核心原则:能通过设计控制的,就不要留到数据分析阶段去猜。设计花的 1 天,能省掉后面 2 周的各种调试和质疑。
随机化:让批次效应“平均化”
随机化的思路其实很简单:把样本完全随机地分配到不同批次、不同凝胶泳道、不同测序 lane 中。这样一来,任何潜在的批次效应会均匀分布在所有比较组中,不会系统性地偏向某一边。
我见过最典型的错误做法是什么?把第一批收集的全部病例样本一起提 RNA、一起建库;第二批才收集的对照样本,再一起提、一起建库 —— 这时候,批次效应和生物学差异完全混杂,神仙都分不开。你看到的结果,到底是处理导致的差异,还是两批测序试剂盒效价不同导致的差异?说不清楚。
所以,我建议从一开始就做好随机分组的计划。比如你手上有 24 个样本,12 个处理组、12 个对照组,分 2 批上机。那每批里应该各有 6 个处理、6 个对照。
# 一个最简单的随机分配示例(R 语言)
set.seed(2025) # 固定随机种子,可复现
sample_all <- 1:24
group <- rep(c("Trt", "Ctrl"), each = 12)
batch <- rep(NA, 24)
# 随机将样本分配到批次
batch[sample(1:24, 12)] <- "Batch1"
batch[is.na(batch)] <- "Batch2"
# 看看每组在每个批次中的数量
table(group, batch)
输出类似这样,每批次两组各 6 个,完美平衡:
batch
group Batch1 Batch2
Trt 6 6
Ctrl 6 6
注意:随机化不是“随便抓一把”。你要设好随机种子(比如 set.seed(2025)),并提前写下来,防止别人质疑你的实验设计是拍脑袋做的。
区组化:把已知混杂因素“关进笼子里”
随机化很好,但它不能保证每个批次里关键变量的分布完全均衡 —— 尤其当样本量比较小时,随机分配也可能失衡。这时候就需要区组设计上场了。
区组设计的核心是:把一些已知的、可能影响结果但又无法直接控制的变量(比如性别、年龄、收集日期、人种等)作为“区组因素”,然后保证在每个批次内,这些因素的分布与总体一致。说白了,就是“分层后再随机”。
我曾经在一个小鼠 RNA-seq 项目中遇到过这种情况:我们要比较 A 品系和 B 品系各 8 只,但样本收集需要 3 天。如果不管,可能第一天全是 A 品系、第二天全是 B 品系,那品系差异和日间差异就混在一起了。我当时的做法是:把每天作为区组,每天内随机安排 2-3 只 A、2-3 只 B,保证每天两个品系各一半左右。这样即使不同天的建库质量有波动,也不会影响品系比较的公正性。
实践上,你可以先绘制一份样本注释表,然后手动或借助工具检查每个批次内各因素的频次:
| 样本ID | 处理组 | 性别 | 收集时间 | 分配批次 |
|---|---|---|---|---|
| S01 | Trt | M | Day1 | Batch1 |
| S02 | Ctrl | F | Day1 | Batch1 |
| S03 | Trt | F | Day2 | Batch2 |
| S04 | Ctrl | M | Day2 | Batch2 |
如果发现某个批次里性别比例严重偏离(比如 Batch1 只有男性),那就需要调整。当然,你也可以用 R 的 blockrand 包来自动生成区组随机计划。
个人习惯:在正式分配之前,我会先做 10 次模拟分配,每次都计算每个批次内各组和各区组因素的均衡度,挑一个最好的方案。别嫌麻烦,这点时间值得花。
一张图看懂随机化 + 区组化
为了更直观,我画了下面这个流程图。它展示了样本如何经过“随机化”与“区组化”双重筛选,最终分配到两个批次中:
提示:如果你的实验有多个已知的混杂因素(比如收集时间、性别、体重),可以把它们都作为区组因素,采用拉丁方或平衡不完全区组设计。但别贪多,区组因素太多会把你给分配晕了。我通常只选两个最关键的。
避坑指南:记住这三件事
讲了好处,也得说说容易踩的坑。我按重要性排个序:
- 不要把随机化等同于“随便放”。 我亲眼见过有实验室把第一批、第二批分别叫“组1”和“组2”,然后说我们是随机分配的 —— 问了一下,就是按收样顺序放进去的。那不叫随机,那叫“便利”。
- 区组信息一定要记录在样本注释文件里。 我曾经帮一个项目做质控,发现他们自己在分配时虽然做了区组,但没有在 metadata 中记录批次编号。结果后续分析只能依据送样时间推测,白白增加了不确定性。
- 小样本量下,随机化可能失效。 比如你一共只有 4 个样本,随机分配到两个批次,很可能一个批次内全是处理、另一个全是对照。这时候必须用区组随机,确保每批次各有 1 处理 + 1 对照。我自己的经验是:每组样本数 < 8 时,绝对不要用完全随机,一定要区组化。
重要提醒:实验设计阶段做好的随机化和区组化,能在后期节省你 80% 以上的批次校正烦恼。千万不要指望先随便做、再用软件“修正”,因为很多修正方法要求已知的批次因素,甚至不确定修正是否引入了新的偏差。
好了,这一节的核心就这些。记住:你设计的每一步,都在悄悄地决定着你数据分析时的自由度。拿好随机化和区组化这两个工具,把批次效应关在笼子里,而不是留到 PCA 图上再后悔。