第2章:批次效应产生的原因与影响

2.1 什么是批次效应?先别急着喊"数据有问题"

说起批次效应,我脑子里立马冒出几年前一个项目。

当时我们同时跑了三批10x数据,明明是同一种细胞系,UMAP一画,三批数据各自抱团,谁也不挨谁。我盯着那个图愣了十分钟,心想:这细胞是偷偷学会分群了?

后来才反应过来——嗯,这就是批次效应。

说白了,批次效应就是:相同生物学样本,因为不在同一时间、同一条件、同一批实验里处理,导致数据出现了非生物学差异。它不是细胞本身想分开,是实验步骤把数据"掰开"了。

核心一句话:批次效应是技术和操作引入的"假信号",不是生物学真差异。

2.2 批次效应是怎么冒出来的?我帮你拆开看

我从项目经验里总结了四个主要"元凶"。你看完就会明白,批次效应几乎没法完全避免,只能控制和校正。

2.2.1 技术平台本身的"基因"差异

10x和Smart-seq2,这两个平台从建库原理上就南辕北辙。10x靠微滴包裹细胞,每个细胞只捕获一小部分转录本;Smart-seq2是全长扩增,覆盖度更高。你想想看,同一个基因在10x里可能只检测到3'端几个reads,在Smart-seq2里能覆盖整个转录本。这数据放到一起,能一样吗?

2.2.2 实验条件波动——你控制不了的"小脾气"

同样的10x平台,今天做的和下周做的,结果也可能不一样。

  • 试剂批次:同一家公司的试剂,不同批次活性可能差5%-10%。我在一次质控里发现,换了一批逆转录酶后,基因检出数降了12%。
  • 设备状态:微流控芯片的通道堵塞程度、PCR仪的温控精度,都会影响数据。
  • 操作环境:实验室温度、湿度,甚至样本放置时间,都会引入噪声。

2.2.3 操作人员——这个因素最容易被忽略

我曾经做过一个对比:两个实习生分别处理同一份PBMC样本,一个做了8小时,一个做了11小时。最后UMAP画出来,两个人的数据明显分成两群。你可能会问:操作慢了点,差别这么大?是的。细胞在悬液里多待几个小时,转录组状态会发生变化,应激基因开始表达,差异就出来了。

2.2.4 样本处理的时间差

有些样本来自不同医院、不同时间点。从取样到建库,中间隔了几天,细胞的活性、RNA完整性都会往下掉。10x对细胞活性很敏感,Smart-seq2对RNA完整性要求更高。时间差带来的质量差异,也会变成批次效应。

批次效应主要来源对比
来源 影响程度 10x vs Smart-seq2差异 可控性
技术平台差异 高 捕获原理、覆盖度、灵敏度不同 低(需校正)
试剂批次波动 中-高 10x对酶活性敏感,Smart-seq2对引物批次敏感 中(可标准化)
操作人员差异 中 两个平台都对操作时间、习惯敏感 中(需培训)
样本处理时间差 中-高 10x要求细胞活性高,Smart-seq2要求RNA完整 低(采样时间决定)

2.3 批次效应对下游分析的影响——不是吓唬你

如果不管批次效应,直接拿合并数据做分析,结果会怎样?我见过不少"假阳性"血泪史。

2.3.1 聚类:细胞没按类型分,按批次分了

这是最直观的表现。用PCA或UMAP看,数据点首先按批次聚成几大块,而不是按细胞类型。你原本想找稀有细胞群,结果发现"新群"其实是某个批次自己的噪声。

2.3.2 差异表达分析:找出的"差异基因"全是批次标记

我曾经帮人复查一个项目,他兴奋地说找到了一个很好的marker基因。我一看,那个基因在批次A里高表达,在批次B里低表达——但那两个批次里是同样的细胞。说白了,他找的不是生物学差异,是批次特异基因。

2.3.3 生物学信号被淹没

当批次效应大到一定程度,真正的生物学差异反而看不出来了。就像你想在暴风雨里听清一个人说话——背景噪声太大了。

注意:批次效应不是"有或无"的问题,而是"大或小"的问题。即使同一个平台、同一个人、同一天操作,也会存在微小批次效应。关键是它是否大到影响你的结论。

2.4 怎么识别批次效应?我教你三招

别等到分析做完了才发现批次效应。我习惯在数据整合前先做"侦察"。

  1. 看PCA/UMAP,按批次着色:如果相同颜色的点抱团,不同颜色的点分开,说明批次效应明显。这是最快的方法。
  2. 计算批次相关性矩阵:如果不同批次间的相关性低于同批次内的相关性,说明有批次效应。
  3. 检查批次特异基因:用简单差异分析,找每个批次高表达的基因。如果找到的基因跟生物学类型无关,基本就是批次效应没跑了。

这里给一个快速检查的代码片段,我经常在预处理阶段跑一遍:

# 载入数据后,用PCA快速侦察
library(Seurat)
merged_data <- merge(batch1, batch2)
merged_data <- NormalizeData(merged_data) %>%
  FindVariableFeatures() %>%
  ScaleData() %>%
  RunPCA()

# 按批次着色看PC1 vs PC2
DimPlot(merged_data, reduction = "pca",
        group.by = "batch", pt.size = 0.5)

一个小技巧:我习惯在看PCA时,同时用"batch"和"cell_type"两个分组着色。如果batch分的比cell_type还清楚,那批次效应就是头号问题,必须先校正再往下走。

2.5 批次效应的"蝴蝶效应"——从源头到结论

为了让你更直观地理解,我把整个链条画了一张图。你跟着箭头走一遍,就明白批次效应是怎么一步步影响最终结论的。

批次效应来源与影响路径 技术平台差异 10x vs Smart-seq2 实验条件波动 试剂/设备/环境 操作人员差异 操作时间/习惯 样本处理时间差 采样→建库间隔 数据分布偏移 非生物学噪声叠加 聚类/分群错误 按批次抱团,掩盖真类型 差异分析偏差 假阳性基因全是批次标记 生物学信号淹没 真实差异被噪声覆盖 批次效应从多个源头汇入数据,最终扭曲聚类、差异分析和生物学结论

2.6 一个真实案例,我踩过的坑

2021年我做了一个跨平台整合项目——10x和Smart-seq2的PBMC数据。当时我天真地以为,只要用同一个参考基因组、同一个cellranger版本,数据就能直接合并。结果PCA一画,10x数据全在左边,Smart-seq2全在右边,中间隔了一条"鸿沟"。

我试着直接用Seurat的FindIntegrationAnchors()做整合,但效果很差,因为批次效应太大,anchor找不准。

后来我换了个思路:先分别对两个平台做QC和标准化,再用Harmony做校正。校正后UMAP上,CD4 T细胞、CD8 T细胞、单核细胞终于混在一起了。但我又发现了一个问题——有些细胞群校正后"过度融合",原本应该分开的亚型也混到一起了。

经验总结:批次校正是"走钢丝"——校少了,批次效应还在;校多了,生物学差异也被抹掉。你需要反复调参,结合生物学先验知识来判断校正是否过度。

所以每次做批次整合,我都会问自己三个问题:

  1. 批次效应大不大?(PCA/UMAP侦察)
  2. 用什么方法校正?(Harmony? Seurat? MNN? 具体看数据量)
  3. 校正结果合理吗?(用已知marker基因验证细胞类型是否保真)

2.7 本章小结——你记住这几个点就行

批次效应不可怕,可怕的是你忽略它。

  • 来源多样:平台差异、实验条件、操作人员、时间差,每个环节都可能引入批次效应。
  • 影响深远:聚类、差异分析、生物学发现,每个下游步骤都会被批次效应干扰。
  • 识别要早:在预处理阶段就做批次侦察,不要等到结论推翻了再回头找原因。
  • 校正要谨慎:既不是校得越彻底越好,也不能放着不管。需要在"去除批次效应"和"保留生物学差异"之间找平衡。