第4章 Seurat基本分析流程回顾:标准化、降维、聚类、marker基因识别
说实话,很多刚接触Monocle的朋友,上来就盯着拟时序轨迹图看。结果数据跑出来,轨迹歪七扭八,自己也搞不清哪里出了问题。我告诉你,八成是前面的Seurat基础流程没走稳。
标准化、降维、聚类、找marker——这四步看着像常规操作,但每一步的选择都会直接影响后续的拟时序推断。今天咱们把这四个环节拆开,讲清楚「为什么这么做」和「做了会怎样」。
4.1 标准化:先把数据拉到同一把尺子上
原始的单细胞表达矩阵,说白了就是一堆计数。不同细胞的文库大小不一样,基因长度也不同。直接比较肯定不行。
Seurat默认用的是 LogNormalize。它的逻辑很简单:每个细胞的UMI数除以该细胞的总UMI,再乘以一个缩放因子(默认10000),然后取自然对数。
# Seurat标准化
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
嗯,这里我要提一句。我在做早期项目时,碰到过一种情况:某种细胞类型本身RNA含量就低,标准化后信号被压得特别平。结果聚类时死活分不出来。后来换了 SCTransform,效果才明显改善。
| 标准化方法 | 适用场景 | 缺点 |
|---|---|---|
| LogNormalize | 常规数据,快速稳定 | 对低表达基因不敏感 |
| SCTransform | 需要保留更多生物学变异 | 大样本计算较慢 |
| CLR (Centered Log-Ratio) | CITE-seq蛋白数据 | 对稀疏矩阵不太友好 |
4.2 降维:从两万维到几十维
标准化之后,我们有两万多个基因的表达量。但你想想看,直接拿这两万多维数据去做聚类,计算量惊人,而且噪声也大。
降维的套路,业内基本是两步走:先用PCA做线性降维,再用UMAP/tSNE做可视化。
# PCA降维
pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc))
# UMAP可视化
pbmc <- RunUMAP(pbmc, dims = 1:10)
这里有个坑,我踩过——主成分数量选多少? 有人直接写1:30,有人用ElbowPlot看一眼。我个人习惯是:先跑个30个PC,看看拐点在哪儿。一般10~20个就够了。选太多,噪声跟着进来;选太少,稀有细胞群可能被淹掉。
n.neighbors 默认15,你最好调成30~50。为什么呢?后面讲轨迹推断时会细说。
4.3 聚类:把细胞归堆
降维之后,轮到聚类上场。Seurat用的是基于图的聚类——说白了,就是先根据PCA空间里的距离,给每个细胞找几个邻居,然后构建一个图,最后用Louvain或Leiden算法切分社区。
# 聚类
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
分辨率 resolution 是个调味剂。默认0.5会出来个大概轮廓。你要是想看到更细的子群,比如某种T细胞亚型,就调到0.8甚至1.2。
我记得有一次,为了分出一个罕见的浆细胞亚群,我逐步把分辨率从0.5拉到1.5,才算勉强拆开。但代价是其他群也被切得太碎。这时候怎么办?后续用marker验证,再决定是否合并。
4.4 标记基因识别:给每个集群贴个标签
聚类分好了,但每个群里是什么细胞?你得看marker基因。
# 找所有群的marker
all.markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
这里我习惯加 only.pos = TRUE——只看上调的基因,下调的往往不是核心特征。还有 min.pct 和 logfc.threshold 这两把过滤器,太低会筛出一堆假阳性,太高又可能错过真正的标记。
举个例子,T细胞的CD3D、NK细胞的GNLY、B细胞的MS4A1。如果某个群同时高表达CD14和FCGR3A,那八成是单核细胞。嗯,这些知识图谱你得自己熟悉。
一张图看懂Seurat四步流程
下面这个图,把上面说的四步串起来。你自己对照着看,每个环节的输出是什么,下一步的输入又是什么。
我其实想表达一个意思:Seurat这四步不是孤立的技术操作,而是一套完整的数据理解流程。标准化管数据的可比性,降维管特征提取,聚类管分组逻辑,marker管生物学身份。缺一个,后面的拟时序轨迹就是空中楼阁。