批次因素:平台、日期、操作者
实验设计里的批次问题,说白了就是「同样的实验,换个条件做,结果就不一样了」。我做了几年单细胞项目,发现很多人最开始都会忽略这一点——觉得都是同一批细胞,能有多大差别?
其实差别大得很。我见过一个极端的案例:同一个样本,上午用10X做完,下午换个平台再做,结果聚类都变了。这不是数据有问题,而是批次效应在捣乱。
不同平台:技术源头上的差异
你想想看,10X Genomics、Drop-seq、Smart-seq2……它们捕获细胞的方式完全不同。有的基于液滴,有的基于微孔板;有的只能看3'端,有的能看全长。这些技术差异落到数据上就是明显的批次效应。
| 平台特性 | 10X Genomics | Drop-seq | Smart-seq2 |
|---|---|---|---|
| 捕获机制 | 微流控液滴 | 微流控液滴 | 微孔板分选 |
| 测序覆盖 | 3'端 | 3'端 | 全长 |
| 基因检测中位数 | ~2000-3000 | ~500-1500 | ~4000-6000 |
| UMI有无 | 有 | 有 | 无 |
关键指标:不同平台整合时,首先要看基因检测率(genes per cell)和UMI分布。如果差异>2倍,就别直接merge,必须做批次校正。
我曾帮一个客户整合10X和Smart-seq2的数据。Smart-seq2的基因检测率是10X的3倍,直接合并后,Smart-seq2的细胞全聚在一个大群里。后来我用Seurat的整合流程做了锚点校正,才算把生物学差异和技术差异分开。
不同操作者:人带来的变异
这个因素容易被低估。我刚入行时觉得,同一台仪器、同一试剂盒,换个人操作能有什么影响?实际上,单细胞实验对手法很敏感。我举个例子:
- 细胞悬液制备:不同人吹打力度不同,活率能差10%-20%。
- 上样浓度:一个估到1000 cells/μL,另一个估到800 cells/μL,最后细胞收集量就差很多。
- 分选策略:门控画得松一点紧一点,死细胞和双胞的比例就不同。
技巧:我会在质控报告里对比不同操作者处理后的细胞活率、捕获细胞数和doublet率。如果这些指标波动超过15%,说明操作一致性有问题,需要标准化培训。
不同日期:环境与试剂批次的影响
日期因素更隐蔽。同一个人、同一台仪器,隔一周做出来的数据都可能不一样。原因在哪?
- 试剂批次变更:gel beads批次不同,捕获效率会有波动。
- 仪器状态:微流控芯片的液滴生成稳定性会随使用次数变化。
- 环境温湿度:许多单细胞实验需要控温,季节不同室温差异会直接影响液滴大小。
- 测序批次:不同批次的测序仪、flow cell也会引入碱基质量差异。
我记得有一次,一个项目做了三个月,前后四批数据。第一批和第四批对比,线粒体比例从5%涨到了18%。调查后发现,第四批实验那天实验室空调坏了……这就是没办法的事。
警告:别指望简单的数据校正能完全消除日期因素。如果样本数量允许,最好在不同日期重复处理同一阳性对照样本,作为批次锚点。
如何在实际项目中识别批次效应
说了这么多,到底怎么判断批次效应是否存在?我的做法很直接:先画图,再算指标。
| 检查项 | 可视化方法 | 量化指标 |
|---|---|---|
| 平台差异 | UMAP/tsne按平台着色 | 基因数中位数、UMI中位数、线粒体比例 |
| 操作者差异 | 细胞捕获数直方图 | 细胞活率均值、CV值 |
| 日期差异 | PC1 vs PC2按日期着色 | 相关性矩阵(批次间vs样本内) |
| 综合评估 | 批次校正前后分群对比 | ARI、NMI、kBet |
我的经验:如果批次校正前ARI(调整兰德指数)>0.8,说明批次效应很严重了,必须做校正。如果<0.3,可能批次只影响了少量基因,可以谨慎处理。
嗯,这里要注意一点:不要把所有差异都归为批次效应。有些差异其实是生物学信号。比如,同一个病人的治疗前和治疗后样本,本来就应该不同。如果你强行校正掉,那就把真实差异也抹去了。
批次因素的内在逻辑
我把这些关系画了张图,你可以更直观地理解:
从这张图可以看出来,三个因素虽然独立,但最终都会反映在可观测的技术指标上。你如果等到聚类一看,啊,按批次分开了,才意识到有问题——那就浪费时间了。
我的建议:实验设计阶段就把批次方案固定下来。每个样本的批次信息(平台、日期、操作者)在项目开始时就建一个Excel清单。到了数据分析那天,直接读入元数据,省事又靠谱。
如何用质控报告暴露批次问题
我会在质控报告里专门设计一个「批次对比」板块。一般是这样的流程:
- 对每个批次分别跑一遍质控流程,生成独立的质控摘要
- 把关键指标(基因数、UMI数、线粒体比例、doublet率)按批次分组画箱线图
- 计算批次间差异的置信区间(我会用Cohen's d效应量,不看p值)
- 如果效应量d>0.5,就在报告里标红,提示这个批次有显著的质控偏移
注意:别在报告里只说「有批次效应」。要量化,要说「批次A的基因检测率是2000±300,批次B是1500±250,Cohen's d = 1.8」。这样别人一看就知道严重程度。
我习惯把批次信息直接写到Seurat对象的meta.data里:
# 添加批次信息到meta.data
pbmc$platform <- ifelse(grepl("10X", colnames(pbmc)), "10X", "Drop-seq")
pbmc$operator <- ifelse(runif(ncol(pbmc)) > 0.5, "Alice", "Bob")
pbmc$date <- ifelse(colnames(pbmc) %in% early_samples, "2024-01", "2024-02")
# 按批次分组统计质控指标
library(dplyr)
qc_by_batch <- pbmc@meta.data %>%
group_by(platform, operator, date) %>%
summarise(
n_cells = n(),
median_genes = median(nFeature_RNA),
median_UMI = median(nCount_RNA),
percent_mito = mean(percent.mt),
doublet_rate = mean(doublet_scores > 0.3)
)
print(qc_by_batch)
这个表打印出来,你一眼就能看出问题。比如「Alice在2月份用10X做的实验,doublet率明显比其他组合高」——那就不用猜了,直接找Alice聊就好。这就是质控报告的价值。