高变基因选择与降维:FindVariableFeatures、PCA计算、ElbowPlot
说实话,分辨率调优这件事,很多人一上来就猛调resolution参数,结果越调越乱。我刚开始也犯过这毛病。后来才明白,真正的起点不在这里——而是基因筛选和降维。这一步做不好,后面任何聚类都是空中楼阁。
今天咱们就扎进去,把高变基因选择、PCA计算和ElbowPlot这三个环节彻底聊透。
为什么要先筛高变基因?
单细胞数据动辄两万个基因,但大部分在细胞之间差异极小。你想想看,那些在所有细胞里都差不多的基因,对聚类反而产生噪声干扰。我们只需要保留那些在不同细胞群之间表达量有显著波动的基因——这就是高变基因(Highly Variable Genes, HVGs)。
核心原则:高变基因 = 信号最强、聚类信息最丰富的基因子集。一般选2000~5000个,数据质量好的话2000足矣。
我在项目里遇到过一批肿瘤样本,细胞异质性本来就不高,结果我贪心选了5000个高变基因。你猜怎么着?聚类结果里挤出来一堆无意义的亚群,全是噪声。后来砍回2000个,一下子就清晰了。
Seurat中的FindVariableFeatures
Seurat提供了两种方法:vst(默认)和mean.var.plot。我个人偏爱vst,速度快,结果稳定。但如果你用老版本(Seurat v3以前),mean.var.plot也够用。
来个实际代码看看:
# 标准做法
pbmc <- FindVariableFeatures(
pbmc,
selection.method = "vst",
nfeatures = 2000
)
# 查看选中的高变基因
head(VariableFeatures(pbmc))
小技巧:如果数据里含有大量低质量细胞(比如线粒体基因占比高),先做QC再做高变基因筛选,否则那些死细胞的基因波动会污染HVGs列表。
筛选完之后,你会得到一个变量基因标签。这时候最好先画个火山图或者高变基因散点图,快速检查一下选择的基因是否合理。
# 可视化高变基因(可选)
plot1 <- VariableFeaturePlot(pbmc)
plot2 <- LabelPoints(plot = plot1, points = head(VariableFeatures(pbmc), 20))
plot1 + plot2
嗯,这一步很多人会跳过。但我建议你养成习惯——看一眼,心里就有底了。
PCA降维:把高维信息压缩进主成分
选完高变基因,数据维度还有2000。直接拿2000维去做聚类,计算量太大,而且很多维度其实是冗余的。PCA的作用就是把2000个基因的信息压缩成几十个主成分(PC),每个PC代表一组基因的协同变化模式。
说白了,就是把类似表达模式的基因揉成一个维度,保留核心差异,扔掉噪声。
# PCA计算
pbmc <- RunPCA(
pbmc,
features = VariableFeatures(pbmc),
npcs = 50
)
# 查看结果
print(pbmc[["pca"]])
注意:不要一上来就用默认的npcs=50就不管了。如果你的数据只有几百个细胞,用50个PC会过拟合。一般根据细胞量调整:几百个细胞用15~20个PC就够了;上万个细胞可以用30~50个。
我曾经帮同事调试一个仅300个细胞的数据集,他跑了50个PC,结果画UMAP时发现前两个PC几乎解释了所有方差,后面的PC全是噪声。这就是典型的过度降维——不是越多越好。
ElbowPlot:找到PC的"拐点"
PCA做完后,每个PC都有一个解释方差百分比。一般来说,前几个PC解释的方差很大,后面的PC贡献越来越小。但到底选多少个PC合适?ElbowPlot就是帮我们看这个"拐点"的。
# 画ElbowPlot
ElbowPlot(pbmc, ndims = 50)
图出来后,你会看到一条下降曲线。找那个斜率突然变缓的位置——就像手臂的肘关节一样。我个人习惯在那个拐点对应的PC数上加2~3个,容错留一些。
举个例子:如果拐点在PC=12,我会选14或15个PC用于后续聚类。为什么?因为拐点之后的PC虽然贡献小,但可能包含了罕见的细胞亚群信号,加几个进去不会引入太多噪声。
经验值:大部分单细胞数据,ElbowPlot的拐点出现在PC=10~20之间。如果你发现拐点很靠后(比如PC=40),说明数据本身信噪比很低,建议回头检查QC和高变基因筛选步骤。
知识体系梳理
为了把这三个环节的关系说清楚,我画了一张流程图。你可以把它当成一个检查清单,每次跑流程时对照着走一遍。
实战中的几个决策点
- HVGs数量:数据量大(>5000细胞)选3000~5000,数据量小选1500~2000。不要无脑用默认2000。
- PC数上限:npcs建议设为50,但实际只用到前15~30。ElbowPlot的纵轴是标准差,不是解释方差百分比。
- 为什么不直接走默认的30个PC?因为有些数据的最佳PC数可能只有10个,强行用30个会引入大量噪声,导致UMAP图变成一团浆糊。
- 可重复性:每次重跑分析,建议设置随机种子(
set.seed(42)),不然ElbowPlot的曲线会因为随机性有微小波动。
曾经有过的坑:我做过一批10x Genomics的PBMC数据,按教程直接用了20个PC做聚类,结果发现一群T细胞被分成了两个子群。回头一看ElbowPlot,拐点其实在PC=12,后面8个PC基本是噪声。改成12个PC后,那两个子群合并了,表达谱也一致。所以,一定要自己看ElbowPlot,不要偷懒用默认值。
总结一个检查清单
每次做单细胞分析前,把下面的表过一遍,就不会漏了。
| 步骤 | 关键点 | 常见错误 |
|---|---|---|
| FindVariableFeatures | 选vst方法;nfeatures=2000 | 忘了做QC直接筛 |
| RunPCA | npcs=50(上限),但实际只用前15~30 | 细胞数少时npcs过大 |
| ElbowPlot | 找斜率拐点;拐点后加2~3 | 肉眼判断不准可以看PC解释方差比例 |
| 可视化确认 | 画PCA投影图、热图看基因贡献 | 跳过此步,直接跑UMAP |
说白了,高变基因选择和PCA降维就是一个信号提取和压缩的过程。你把好质量的信号提炼出来,后面聚类才能站得稳。这一章的内容,我建议你多跑几个样本,反复看ElbowPlot的变化,慢慢就能培养出"手感"。