2. 批量效应概述:什么是批次效应?为什么在空间转录组中问题更突出?
好,咱们正式进入第二章。上一章我们聊了空间转录组能干什么,这一章,我要跟你好好掰扯一下它的“头号敌人”——批次效应。
你可能会问,为啥你一上来就讲这个?因为在我接触过的空间转录组项目里,十有八九的坑,都是批次效应挖的。处理不好,你后面花大价钱做的差异分析、细胞通讯分析,结果全是假的,白白浪费时间。
2.1 到底什么是批次效应?
说白了,批次效应就是非生物学因素引入的系统性偏差。
你想想看,样本不是一天做完的,试剂不是同一批次的,操作员手感也不一样。这些因素叠加起来,会让本来相似的生物学样本,在测序数据里表现出明显的差异。这种差异,就是批次效应。
我以前在单细胞 RNA-seq 项目中吃过很多亏。有一组癌症样本,由于上机时间差了 3 个月,结果 PCA 图上正常组织和肿瘤组织没分开,反倒是早批次的样本和晚批次的样本各自聚类。当时我还以为发现了什么新的亚型,结果一排查,就是批次效应在捣鬼。
用一个公式来理解:
Observed_Expression = True_Biological_Signal + Batch_Effect + Noise
我们想要的是 True_Biological_Signal,但实际观测到的表达量里混进了 Batch_Effect。空间转录组的数据信噪比本就比单细胞低,这个 Batch_Effect 一旦放大,足以淹没真正的生物学信号。
2.2 为什么空间转录组的批次效应问题更突出?
你可能觉得,批次效应这玩意儿单细胞里也有啊,凭啥说空间转录组更突出?原因有三点,我一个一个说。
第一,空间信息带来了额外的干扰。
常规单细胞数据,细胞之间是独立的,我们可以用各种工具直接校正。但在空间转录组里,每个 Spot 的表达量不仅反映自身状态,还携带着空间邻居的信息。批次效应校正时,如果不小心把空间结构也“抹平”了,那结果就是一团浆糊。
第二,数据稀疏性和技术噪声更严重。
以 10x Visium 为例,一个 Spot 覆盖多个细胞,但捕获效率有限。很多低表达的基因检测不到,造成大量缺失值。在这种高稀疏度的数据里,批次效应会被成倍放大。你在单细胞里可能觉得“还好嘛”的那点差异,在空间里用肉眼就能直接看到。
第三,批次常常与生物学效应混淆。
举个例子,你想比较肿瘤中心和边缘的差异。结果不幸的是,中心区域的切片是一周前做的,边缘区域的切片是昨天做的。这时候你看到的所有差异,一半是生物学真差异,另一半是批次效应。你没办法简单地用线性回归把它们分开。
我整理了一个对比表格,看完你就明白了:
| 对比维度 | 常规转录组 / 单细胞 | 空间转录组 |
|---|---|---|
| 效应类型 | 全局偏移(Global Shift) | 局部偏移 + 空间结构扭曲 |
| 位置相关性 | 无位置信息 | 强位置相关性(邻域效应) |
| 数据特点 | 相对稠密,缺失率可控 | 高度稀疏,零膨胀严重 |
| 解决方法 | ComBat / Harmony / scVI 可直接用 | 需要保留空间结构的专用校正方法 |
| 典型数据量 | 数万~数十万细胞 | 数千~数万 Spot,但每个 Spot 信息量更大 |
scanpy.pp.pca + scanpy.pl.pca 跑一遍,按批次着色。如果发现空间坐标相似的 Spot 在 PCA 图上相隔甚远,那就说明批次效应已经严重影响了空间模式。赶紧启动校正流程,别犹豫。
2.3 常见的批次效应来源
很多人以为批次效应只来自“样本处理时间不同”,其实远不止这些。我给你列一个实战清单:
- 样本采集批次: 患者手术时间不同,组织保存条件(OCT 包埋 vs 液氮速冻)不同。我在项目中遇到过同一器官的切片,前几片用的是新 OCT,后几片是用旧 OCT包的,结果 RNA 降解程度完全不同。
- 组织处理批次: 组织透化时间、杂交温度、探针浓度,这些参数稍微一改,表达量就跟着变。我建议每一个参数组合都单独记录为一个 batch 标签。
- 测序批次: 不同测序通道、不同试剂盒版本、不同 Illumina 机型(NovaSeq vs NextSeq)。测序深度的波动会直接影响基因检出率。
- 操作员批次: 这个常被忽略。但如果你有两个实验员,一个习惯快切,一个习惯慢切,那组织完整性、RNA 释放效率都不一样。我一般会要求实验记录里写明“操作者姓名”,把它作为一个 categorical covariate。
- 软件/分析批次: Space Ranger 版本、参考基因组版本、STAR 对齐参数的差异,也会引入批次效应。很多在线公开数据集的合并分析,这个问题尤其突出。
下面我画了一张图,把主要来源和它们之间的关系展示出来:
pandas 把所有的 metadata 做成一个 DataFrame,然后在做校正前先检查 batch 列是否有缺失值。
2.4 小结与经验
好了,我们回顾一下这一章的核心:
- 批次效应就是非生物的系统偏差。它的来源五花八门,从样本采集到数据分析,每一步都可能引入。
- 空间转录组因为引入了空间结构、数据稀疏和 high confounding,批次效应问题比单细胞更棘手。
- 校正前必须先识别批次。拿到数据先画图,按批次着色,心里有数再动手。
下一章我们就会正式开始使用 ComBat 了。不过在动手之前,你得先把自己的数据准备好——特别是那个 batch 列。我习惯在 anndata.obs 里加一列 batch,然后用 pd.Categorical 来管理。
给你看我常用的准备代码片段:
import anndata as ad
import pandas as pd
adata = ad.read_h5ad('your_spatial_data.h5ad')
# 假设我们有样本 'S1','S2',分别来自两个批次
adata.obs['batch'] = adata.obs['sample_id'].map({
'S1': 'batch_1',
'S2': 'batch_2'
}).astype('category')
print(adata.obs['batch'].value_counts())
# 检查 batch 分布是否平衡
这一步做扎实了,后面的校正才能安心进行。别嫌麻烦,数据准备阶段多花一小时,能省掉后面十小时的 debug 时间。