3、sctransform与传统标准化方法(LogNormalize、ScaleData)对比

做单细胞分析,标准化这步逃不掉。我见过不少人直接拿默认参数跑完就往下走了,结果后面找标记基因时发现怎么调都不对——其实根儿就在标准化方法选错了。

今天我把三种方法放在一起比一比。不是说哪个绝对好,而是你得知道它们各自在做什么,才能选对东西。

3.1 三种方法的核心思想

先简单说下各自的设计理念,这样后面的对比你才看得明白。

  • LogNormalize——最老牌的做法。先按文库大小把每个细胞的UMI总数缩放到一个固定值(默认10000),然后取log1p。说白了就是"让细胞之间先能比,再把数据压一压"。计算快,但细节损失大。
  • ScaleData——在LogNormalize基础上加了回归步骤。你可以把线粒体比例、细胞周期等"技术噪声"回归掉。但注意,它不会改变基因本身的方差结构,高表达基因依然主导主成分。
  • sctransform——用正则化负二项回归直接建模UMI计数。它同时做了标准化、方差稳定化和技术变量回归。一步到位,而且低表达基因的信号被保留得更好。
一句话记住:LogNormalize是"先归一化再压平",ScaleData是"归一化+去噪声",sctransform是"一步到位建模原始计数"。

3.2 处理流程对比

我画了一张图,把三个方法的处理路径放在一起。你一眼就能看出差异在哪。

三种标准化方法处理流程对比 LogNormalize ScaleData sctransform 原始UMI计数矩阵 (每个细胞×每个基因) log1p归一化 (文库大小校正 + 对数转换) 线性缩放 (默认scale.factor=10000) 标准化表达矩阵 (可用于降维聚类) 原始UMI计数矩阵 (每个细胞×每个基因) log1p归一化 (与LogNormalize相同) 回归去除技术变量 (如%线粒体、细胞周期) 标准化+scaled矩阵 (已去除技术噪声) 原始UMI计数矩阵 (每个细胞×每个基因) 正则化负二项回归 (GLM建模UMI计数) Pearson残差计算 (方差稳定化) 标准化+方差稳定矩阵 (低表达基因信号保留) 关键差异:LogNormalize不做方差调整,ScaleData只去噪声不改方差,sctransform同时完成标准化和方差稳定化 sctransform一步到位,低表达基因不再被淹没

从图上你能看到:LogNormalize和ScaleData的前两步一模一样,区别在于ScaleData多了一个回归步骤。而sctransform完全跳过了log1p这一步,直接用GLM建模原始计数。这可不是小改动——底层逻辑都换了。

3.3 关键差异对照表

我把几个核心维度拉了一张表,方便你快速对比。

对比维度 LogNormalize ScaleData sctransform
输入数据 log1p(UMI/库大小×10000) 同左 + 回归残差 原始UMI计数
方差处理 无(高表达基因方差大) 无(高表达基因仍主导) 方差稳定化(所有基因尺度一致)
技术变量回归 不支持 支持(需手动指定) 支持(自动建模)
计算速度 极快(秒级) 中等(分钟级) 较慢(大型数据需几分钟)
低表达基因保留 差 差 好
适用场景 快速探索、大规模质控 需要去除明确技术变量 追求最佳标准化效果

一个容易忽略的点:LogNormalize和ScaleData的输出是"相对表达量",不同基因之间的值不能直接比较大小。sctransform的残差是标准化的,基因之间可比。这在做热图和特征图时差别很明显。

3.4 代码实现对比

直接看代码,感受一下三种方法的调用方式。

LogNormalize 标准做法

# Seurat默认标准化
pbmc <- NormalizeData(
  pbmc,
  normalization.method = "LogNormalize",
  scale.factor = 10000
)

ScaleData 带回归

# 先找高变基因,再标准化+回归
pbmc <- FindVariableFeatures(
  pbmc,
  selection.method = "vst",
  nfeatures = 2000
)

pbmc <- ScaleData(
  pbmc,
  vars.to.regress = c("percent.mt", "nCount_RNA")
)

sctransform 一步到位

# 一行代码完成所有步骤
pbmc <- SCTransform(
  pbmc,
  vars.to.regress = "percent.mt",
  verbose = FALSE
)

# 注意:sctransform后会生成一个新的assay叫"SCT"
# 后续降维聚类用这个assay
我踩过的坑:曾经在一个10x数据集上,我直接拿默认的LogNormalize跑完就去做差异分析,结果出来的标记基因全是线粒体基因和核糖体基因——因为它们的表达量最高,标准化后依然最高,完全淹没了真正的细胞类型信号。换成sctransform后,情况好多了。

3.5 实战选择建议

说了这么多,到底该选哪个?我一般这样判断:

  • 数据量超大(10万+细胞)且只是快速看个大概——用LogNormalize,省时间。
  • 技术噪声明显(比如线粒体比例差异大、有细胞周期批次)——用ScaleData回归掉这些变量。
  • 想认真做分析,尤其是要保留稀有细胞类型——直接上sctransform。我个人习惯是只要计算资源允许,一律用sctransform。

还有一个实用技巧:你可以先用LogNormalize跑一遍质控和初步聚类,确认细胞群体没问题后,再用sctransform重新标准化做正式分析。这样既不耽误前期探索,又能保证最终结果的质量。

我的经验:sctransform跑一次大概需要5-10分钟(1万个细胞),相比LogNormalize的几秒确实慢。但这个时间花得值——它省掉了你后面调参数、选基因、解释结果的无数纠结。我团队现在所有新项目都默认用sctransform。

说到底,标准化不是"跑个流程"那么简单。你选哪种方法,直接影响你后面能看到什么、找不到什么。花点时间把这步搞明白,后面会顺畅很多。