批次因素:平台、日期、操作者

实验设计里的批次问题,说白了就是「同样的实验,换个条件做,结果就不一样了」。我做了几年单细胞项目,发现很多人最开始都会忽略这一点——觉得都是同一批细胞,能有多大差别?

其实差别大得很。我见过一个极端的案例:同一个样本,上午用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%,说明操作一致性有问题,需要标准化培训。

不同日期:环境与试剂批次的影响

日期因素更隐蔽。同一个人、同一台仪器,隔一周做出来的数据都可能不一样。原因在哪?

  1. 试剂批次变更:gel beads批次不同,捕获效率会有波动。
  2. 仪器状态:微流控芯片的液滴生成稳定性会随使用次数变化。
  3. 环境温湿度:许多单细胞实验需要控温,季节不同室温差异会直接影响液滴大小。
  4. 测序批次:不同批次的测序仪、flow cell也会引入碱基质量差异。

我记得有一次,一个项目做了三个月,前后四批数据。第一批和第四批对比,线粒体比例从5%涨到了18%。调查后发现,第四批实验那天实验室空调坏了……这就是没办法的事。

警告:别指望简单的数据校正能完全消除日期因素。如果样本数量允许,最好在不同日期重复处理同一阳性对照样本,作为批次锚点。

如何在实际项目中识别批次效应

说了这么多,到底怎么判断批次效应是否存在?我的做法很直接:先画图,再算指标。

检查项 可视化方法 量化指标
平台差异 UMAP/tsne按平台着色 基因数中位数、UMI中位数、线粒体比例
操作者差异 细胞捕获数直方图 细胞活率均值、CV值
日期差异 PC1 vs PC2按日期着色 相关性矩阵(批次间vs样本内)
综合评估 批次校正前后分群对比 ARI、NMI、kBet

我的经验:如果批次校正前ARI(调整兰德指数)>0.8,说明批次效应很严重了,必须做校正。如果<0.3,可能批次只影响了少量基因,可以谨慎处理。

嗯,这里要注意一点:不要把所有差异都归为批次效应。有些差异其实是生物学信号。比如,同一个病人的治疗前和治疗后样本,本来就应该不同。如果你强行校正掉,那就把真实差异也抹去了。

批次因素的内在逻辑

我把这些关系画了张图,你可以更直观地理解:

批次因素影响单细胞数据的逻辑结构图 批次因素对单细胞数据的多维影响 不同平台 不同操作者 不同日期 可观测的技术指标漂移 基因检测率 UMI计数 线粒体比例 双胞比例 数据质控结果偏差 细胞过滤阈值偏移 下游分析假象 聚类、差异基因错误 不当的批次处理 → 结论不可靠 核心:在质控阶段就要记录批次信息

从这张图可以看出来,三个因素虽然独立,但最终都会反映在可观测的技术指标上。你如果等到聚类一看,啊,按批次分开了,才意识到有问题——那就浪费时间了。

我的建议:实验设计阶段就把批次方案固定下来。每个样本的批次信息(平台、日期、操作者)在项目开始时就建一个Excel清单。到了数据分析那天,直接读入元数据,省事又靠谱。

如何用质控报告暴露批次问题

我会在质控报告里专门设计一个「批次对比」板块。一般是这样的流程:

  1. 对每个批次分别跑一遍质控流程,生成独立的质控摘要
  2. 把关键指标(基因数、UMI数、线粒体比例、doublet率)按批次分组画箱线图
  3. 计算批次间差异的置信区间(我会用Cohen's d效应量,不看p值)
  4. 如果效应量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聊就好。这就是质控报告的价值。