多批次实验设计原则:从根源上控制批次效应
好,咱们聊点实在的。
前面几章把联合分析的基础打好了,现在该啃硬骨头了 —— 实验设计。
说白了,实验设计做不好,后面所有 fancy 的分析都是白搭。
我在这行摸爬滚打了好几年,见过太多人上来就跑分析流程,结果跑出来一堆假阳性。
追问一句“你这几个批次怎么分的?”,对方就愣住了。
嗯,这就是我们今天要解决的核心问题。
批次来源:搞清楚“差异”到底从哪来
首先得明白一个事实:
Visium 实验不是流水线,每一批次的处理条件都有可能不一致。
这些不一致,就是我们常说的 批次效应。
我见过一个案例,同一个样本在不同周的两次实验中,
仅仅是透化时间差了 30 秒,下游的基因检测结果就天差地别。
所以,批次来源通常包括以下几种:
- 实验日期:不同的日期,试剂批号、操作人员、环境温度都可能不同。
- 试剂批号:尤其是透化酶和捕获探针,不同批号的活性差异不容忽视。
- 操作人员:手法的差异很微妙,但确实存在。我自己就发现过,同一个 protocols,不同人做出来的组织形态差异很大。
- 测序批次:不同测序 lane 或 flow cell 的测序深度、质量都可能影响。
我的习惯:在实验记录中,为每一个批次分配一个唯一的“批次 ID”。
这个 ID 要包含日期、操作人代号和设备编号。
比如:BATCH_20240615_ZS_VisiumB。
别嫌麻烦,这是你未来做溯源时的救命稻草。
有个简单的表格可以帮大家理清思路:
| 来源类别 | 典型变量 | 影响程度 | 控制方式 |
|---|---|---|---|
| 实验操作 | 透化时间、温度 | 高 | 标准化 SOP、固定设备 |
| 试剂 | 捕获探针批号、酶 | 中 | 同一大份分装、记录批号 |
| 测序 | Flow cell 差异、测序深度 | 中 | 合并测序、平衡深度 |
| 环境 | 室温、湿度 | 低但持续 | 恒温恒湿实验台 |
随机化策略:别让你的样本“一家人整整齐齐”
你想想看,如果我把 5 个正常样本放在第 1 批做,
5 个疾病样本放在第 2 批做。
最后分析出来的差异,到底是疾病导致的,还是批次差异导致的?
这就是混杂。
随机化就是为了打破这种结构。
随机化策略的核心:
- 样本随机分配:不要按组别(实验组 vs 对照组)分批次。把所有的样本混在一起,随机分配到各个实验批次中。
- 位置随机化:在同一张玻片或同一个测序 run 里,随机放置不同组的组织切片。
- 人为平衡:当样本数量很少时(比如只有 6 个),纯粹的随机可能让 3 个疾病样本全落在同一个批次。这时候需要人为干预,确保每个批次里实验组和对照组的比例大致相同。
我曾经踩过的坑:有一次为了节省时间,我想当然地把所有小鼠对照组的切片一次性跑完了。
结果分析时发现一批次的数据整体基因检出率就低 20%,最终不得不剔除整批数据。
记住:省时间 = 废数据。
实际执行的代码示例,我会用一个简单的随机化脚本:
import random
import pandas as pd
# 样本列表:前5个是疾病组,后5个是对照组
samples = ['Disease_1', 'Disease_2', 'Disease_3', 'Disease_4', 'Disease_5',
'Control_1', 'Control_2', 'Control_3', 'Control_4', 'Control_5']
random.shuffle(samples) # 随机打乱
n_batch = 2
batches = {i: [] for i in range(n_batch)}
for i, sample in enumerate(samples):
batches[i % n_batch].append(sample)
print("批次1:", batches[0])
print("批次2:", batches[1])
对照设置:有了对照组,问题才能归因
这一点在单细胞领域里强调得很多,在空间转录组里也一样重要。
我建议的对照设置原则是:
- 同一组织内的对照:比如在肿瘤切片中,包含肿瘤组织和相邻的正常组织。这种对照可以消除组织获取过程带来的差异。
- 技术重复对照:同一块组织,切出相邻的两片,分别放在不同的批次中做。这能帮你衡量技术上到底引入了多大的 batch effect。
- 差异处理对照:如果研究药物处理,一定要有同时进行的 vehicle 处理组。
最后这个我特别要强调一下。
做药物处理时,不要等到所有样本处理完了再做 Vehicle 对照。
Vehicle 对照要和实验组在同一天、同一批条件下完成。
避免混淆因素:别让设计“画蛇添足”
混淆因素,就是那些既和你感兴趣的分组有关,又和批次有关的东西。
最有名的例子:年龄。如果你的实验组全是年轻小鼠,对照组全是老年小鼠,
然后你又在不同的日期处理它们……那你就没法区分衰老还是日期引起的差异了。
常见的混淆因素包括:
- 年龄/性别:实验组和对照组的年龄、性别分布要尽量一致。
- 组织处理顺序:不要把所有实验组样本都放在上午处理。上午和下午的组织状态可能有差异。
- 测序深度:不要一组样本测得多,另一组测的少。
我个人习惯是,在实验设计阶段就列一个“潜在混淆因素检查清单”:
| 潜在因素 | 是否均匀分布 | 控制措施 |
|---|---|---|
| 处理日期 | 否 | 随机分配 |
| 组织保存时间 | 需检查 | 统一冻存方案 |
| 切片厚度 | 否 | 统一设备、统一人员 |
| RNA 完整性 | 需检查 | RIN 值匹配 |
总结一下:实验设计不是迷信,而是逻辑。
你把可能的变数想在前头,后面的数据分析才能真的揭示生物学问题。
你设计得越粗糙,事后弥补的成本就越高。
嗯,到这里实验设计的核心原则就都梳理完了。
你要是能把这四点记在心里,后面的批次校正步骤就能轻松很多。