3、sctransform与传统标准化方法(LogNormalize、ScaleData)对比
做单细胞分析,标准化这步逃不掉。我见过不少人直接拿默认参数跑完就往下走了,结果后面找标记基因时发现怎么调都不对——其实根儿就在标准化方法选错了。
今天我把三种方法放在一起比一比。不是说哪个绝对好,而是你得知道它们各自在做什么,才能选对东西。
3.1 三种方法的核心思想
先简单说下各自的设计理念,这样后面的对比你才看得明白。
- LogNormalize——最老牌的做法。先按文库大小把每个细胞的UMI总数缩放到一个固定值(默认10000),然后取log1p。说白了就是"让细胞之间先能比,再把数据压一压"。计算快,但细节损失大。
- ScaleData——在LogNormalize基础上加了回归步骤。你可以把线粒体比例、细胞周期等"技术噪声"回归掉。但注意,它不会改变基因本身的方差结构,高表达基因依然主导主成分。
- sctransform——用正则化负二项回归直接建模UMI计数。它同时做了标准化、方差稳定化和技术变量回归。一步到位,而且低表达基因的信号被保留得更好。
一句话记住:LogNormalize是"先归一化再压平",ScaleData是"归一化+去噪声",sctransform是"一步到位建模原始计数"。
3.2 处理流程对比
我画了一张图,把三个方法的处理路径放在一起。你一眼就能看出差异在哪。
从图上你能看到: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。
说到底,标准化不是"跑个流程"那么简单。你选哪种方法,直接影响你后面能看到什么、找不到什么。花点时间把这步搞明白,后面会顺畅很多。