第二章:批次效应与数据标准化基础
2.1 批次效应:它到底是什么?
做单细胞整合,第一个绕不开的坎就是批次效应。
说白了,就是你同一种细胞,在不同时间、不同试剂或不同操作人员手里测出来的数据,差异比不同细胞类型还大。这不是生物差异,这是技术噪声。
我早年做过一个免疫细胞项目,CD8+ T细胞在两个批次里,一个表达像NK细胞,另一个像浆细胞,吓我一跳。后来发现是建库试剂盒批号不同搞的鬼。
2.2 批次效应的典型特征
- 技术假象:同一细胞类型跨批次分离,不按生物学聚类
- 非对称分布:有的批次整体偏移,有的只局部扭曲
- 放大难题:小样本的批次效应比大样本更明显
2.3 产生批次效应的主因
| 来源 | 具体原因 | 影响程度 |
|---|---|---|
| 测序深度差异 | 不同文库的UMI/gene覆盖不一致 | 高 |
| 试剂批次差异 | 反转录酶、引物、接头等试剂更换 | 中高 |
| 实验操作差异 | 不同实验员、不同操作时间 | 中 |
| 建库方案 | 10x vs Drop-seq vs Smart-seq2 等平台差异 | 很高 |
| 冻存/新鲜样本 | 样本处理方式导致的基因表达偏差 | 中低 |
我的避坑指南: 我曾经把两个不同建库平台的T细胞数据直接合并,聚类出来都找不到共同细胞群。后来才意识到——批次效应不校正,下游分析全是假阳性。
2.4 如何快速发现批次效应
你不是肉眼去看原始矩阵的,那没法看。常用的方法是降维可视化:
- PCA 分布图:如果每个batch各自抱团,就有问题
- t-SNE 或 UMAP:初看分离,说明批次效应明显
我一般直接扫一眼PCA的前两个组分,假如batch标签能完美分开,那就得认真考虑校正了。比如这样:
import scanpy as sc
adata = sc.read("your_data.h5ad")
sc.pp.pca(adata)
sc.pl.pca(adata, color="batch")
看到的结果如果是几个点团按batch颜色全部分开——嗯,批次效应很严重。
2.5 数据标准化基础知识
你想想看,不做标准化的原始counts数据,差异动辄上千倍,直接塞进BBKNN算法里,它根本分不清是生物学差异还是技术噪声。
2.5.1 为什么要标准化
- 消除测序深度差异
- 稳定方差:高表达基因不要过度支配距离度量
- 使数据接近正态/可比较
2.5.2 标准化“三件套”
- Counts per million (CPM):最简单,每个细胞除以总counts再乘以百万
- Log转换:通常是log1p(log(x+1)),降低动态范围
- Scaling/Z-score:每个基因减去均值再除标准差
做BBKNN时,我个人的常用流程是:CPM -> log1p。有时候对数据分布不满意,再扫一眼标准化后的方差是否稳定。
2.5.3 高变基因选择:标准化到位的关键
数据标准化处理后,不能直接用全部基因。大部分基因是不动的。我们会挑出方差最大的前2000个基因(highly variable genes, HVG)。
BBKNN的KNN图就是在这些高变基因上构建的,而不是全基因组。
sc.pp.highly_variable_genes(adata, n_top_genes=2000, flavor='seurat_v3')
adata = adata[:, adata.var.highly_variable]
我习惯把HVG数设为2000-3000。太少了会丢掉稀有细胞群,太多了又会引入技术噪声。
2.6 标准化的实战流程
来看一个我常用的标准化步骤,会把它跟BBKNN的前置结合起来:
# 1. 原始counts:好习惯,总是保留一份raw数据
adata.raw = adata
# 2. 标准化:先cpM再log
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
# 3. 高变基因选择
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
adata = adata[:, adata.var.highly_variable]
# 4. 再次缩放建议(可选但推荐)
sc.pp.scale(adata, max_value=10)
注意: scaling会将数据变为均值为0、标准差为1的状态。但BBKNN对缩放不敏感,不过如果后面还要用PCA或者UMAP,我建议还是缩一下。
2.7 知识结构图:批次效应与标准化
我画了一张图,能帮你理清这一章的知识骨架。注意看这些步骤间的依赖关系,不能跳着来。
小结(说白了就是一句话)
批次效应不是生物问题,而是数据采集的噪声。标准化不是为了凑热闹,是为了让BBKNN能真正看到细胞间真实的生物相似性。我个人习惯每个整合项目都先走一遍标准化+HVG筛选,后面调BBKNN参数时心里才有底。