4. 数据标准化与质量控制归纳总结
数据标准化与质量控制,说白了就是给单细胞数据「洗澡加体检」。你可能遇到过这种情况:跑完QC一看,有的样本细胞数少得可怜,有的线粒体占比飙到30%以上——这样的数据直接往下分析,结果基本靠猜。我这些年做过的肿瘤样本项目里,至少有一半的批次问题其实是QC阶段没做好埋下的雷。
标准化必须在过滤低质量细胞之后做,顺序不要搞反。先标准化再过滤,会把死细胞的信号也放大,导致后续聚类偏移。我见过有人把顺序弄反,跑了三天才意识到问题,白白浪费计算资源。
4.1 为什么要做标准化?
单细胞测序的本质是捕获每个细胞里的mRNA分子。但不同细胞的捕获效率、测序深度都不一样。比如同样的基因,在细胞A里测到100 counts,细胞B里测到200 counts,这不代表B的表达量就是A的两倍——很可能是B被捕获了更多分子。
标准化的目的,就是消除这种技术误差,让基因表达水平可比。嗯,说白了就是给每个细胞一个「公平的起跑线」。
4.2 常用标准化方法对比
| 方法 | 原理 | 适用场景 | 我的经验 |
|---|---|---|---|
| LogNormalize (Seurat默认) | 每个细胞counts除以总counts,乘以scale.factor,再log1p | 常规10x数据,样本间测序深度差异不大 | 最稳的方法,新手优先选 |
| SCTransform | 负二项回归,一步完成标准化+方差稳定+高变基因选择 | 数据量大、想做下游整合时 | 速度慢但效果干净,我常在大项目里用它 |
| scran (size factor) | 基于细胞池的size factor估算,类似bulk RNA-seq | 低捕获效率或UMI数据 | 对稀疏数据友好,但计算稍复杂 |
| NormCounts (scvi-tools) | 深度模型估计潜变量后矫正 | 有多个批次、需要去批次效应时 | 配合scVI效果很好,但需要GPU |
我的个人习惯:如果只是做初步探索,用LogNormalize + ScaleData就够了;如果要做批次整合,我会在标准化之后立刻跑SCTransform,因为它的方差稳定特性对后续Harmony/CCA非常友好。
4.3 质量控制指标与阈值
质量控制不是硬套一个固定阈值就完事了。你想想看,肿瘤样本里本来就有大量凋亡细胞、免疫细胞浸润,还有组织碎片——这些都会拉低QC指标。我建议分两步走:
- 全局粗筛:去掉极低质量(nFeature<200)和极高线粒体(percent.mt>25%)的细胞。
- 样本级精细微调:看每个样本的分布直方图,取尖峰外的异常值。
几个核心指标如下:
| 指标 | 含义 | 常用阈值范围 | 注意点 |
|---|---|---|---|
| nCount_RNA | 每个细胞的总UMI数 | 500–50000 | 肿瘤样本可能高达100k,不要一刀切 |
| nFeature_RNA | 每个细胞检测到的基因数 | 200–5000 | 低于200通常是空液滴或死细胞 |
| percent.mt | 线粒体基因占比 | 0–20% | 肿瘤组织可放宽到25% |
| percent.ribo | 核糖体基因占比 | 0–5% | 过高可能代表技术假象 |
| doublet_score | 双细胞预测分数 | 按DoubletFinder等工具阈值 | 10x数据通常有1–8% doublets |
💡 我曾经犯过的错:有一个结直肠癌样本,我直接用全局阈值过滤掉了大部分细胞,后来发现那些所谓的「低质量细胞」其实是T细胞和B细胞(nFeature只有300-400)。从那以后我养成了习惯——每次过滤前先看细胞类型标签(如果有的话),再决定阈值。
4.4 标准化与QC的标准流程(Seurat为例)
# 第一步:创建Seurat对象,只过滤死细胞/空液滴
pbmc <- CreateSeuratObject(counts = raw_counts,
project = "tumor_sample",
min.cells = 3, # 至少在3个细胞中表达
min.features = 200)
# 第二步:QC指标计算
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc[["percent.ribo"]] <- PercentageFeatureSet(pbmc, pattern = "^RP[SL]")
# 第三步:可视化分布
VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
# 第四步:根据分布图设定阈值——这里我用的是样本特定的阈值
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 &
nFeature_RNA < 5000 &
percent.mt < 20)
# 第五步:标准化
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
# 第六步:识别高变基因(为PCA准备)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
# 第七步:缩放(ScaleData)——标准化后的最后一步
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)
注意:ScaleData会回归掉细胞周期、线粒体等协变量。如果你要在PCA之前做批次整合(如Harmony),通常不需要在ScaleData里再回归batch,因为整合步骤会处理。
4.5 知识图谱:标准化与质量控制总结
下面这张图是我做项目时常用的参考流程,你可以把它当作一个checklist:
总结强调:标准化与质量控制是单细胞分析最容易被忽视但至关重要的环节。我的经验是:在正式分析之前,至少花30%的时间调整QC参数和标准化策略。肿瘤样本尤其要重视——因为组织异质性高,很多看起来「低质量」的细胞其实是有生物学意义的细胞亚群。
4.6 常见问题与避坑
- 过滤太凶:导致稀有细胞群丢失。多样本整合时,每个样本的过滤标准尽量一致,但可以保留5%的波动。
- 标准化方法混用:不要在同一个项目中对部分样本用LogNormalize,对另一部分用SCTransform,除非你明确知道自己在做什么(比如用Seurat v4的整合流程可能同时使用两种)。
- 忽视了doublet:10x数据中doublets占比通常1-8%,但在肿瘤样本中可能更高。我推荐用DoubletFinder或scrublet单独过滤,不要只靠nCount阈值。
- 盲目重复ScaleData:如果你后面要用Harmony,通常不需要在ScaleData里回归batch,否则会过度矫正。我试过回归batch后整合效果反而变差。
好了,这一章的内容就这些。质量控制做好了,后面的降维聚类才能站得住脚。希望这些经验能帮你少走弯路。