第二章:批次效应与数据标准化基础

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 标准化“三件套”

  1. Counts per million (CPM):最简单,每个细胞除以总counts再乘以百万
  2. Log转换:通常是log1p(log(x+1)),降低动态范围
  3. 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 知识结构图:批次效应与标准化

我画了一张图,能帮你理清这一章的知识骨架。注意看这些步骤间的依赖关系,不能跳着来。

批次效应与数据标准化知识逻辑 原始单细胞表达数据 批次效应检测(PCA/t-SNE) ① 归一化(CPM/Downsample) 目的:消除测序深度差异 ② 对数转换(log1p) 目的:降低动态范围 ③ 尺度化(Z-score) 目的:稳定方差 高变基因选择(n=2000) 高质量、低噪声标准化数据 💡 验证:标准化后检查前20个高变基因表达分布

小结(说白了就是一句话)

批次效应不是生物问题,而是数据采集的噪声。标准化不是为了凑热闹,是为了让BBKNN能真正看到细胞间真实的生物相似性。我个人习惯每个整合项目都先走一遍标准化+HVG筛选,后面调BBKNN参数时心里才有底。