第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,效果才明显改善。

我的经验:如果数据量不大(几千个细胞),SCTransform 一步到位,整合了标准化和方差稳定化。但对于超大样本(10万+细胞),老老实实用 LogNormalize 更稳,计算量小一些。
标准化方法 适用场景 缺点
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个就够了。选太多,噪声跟着进来;选太少,稀有细胞群可能被淹掉。

注意:UMAP的参数一点都不随便。如果后续要跟Monocle对接,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,那八成是单核细胞。嗯,这些知识图谱你得自己熟悉。

核心思路:marker识别不仅是为了注释细胞类型。后面做Monocle时,我们需要根据这些已知的身份来设定拟时序的起始点。比如做T细胞分化,你总得知道哪个群是naive T,哪个群是效应T。

一张图看懂Seurat四步流程

下面这个图,把上面说的四步串起来。你自己对照着看,每个环节的输出是什么,下一步的输入又是什么。

Seurat 基础分析流程 标准化 LogNormalize / SCTransform 降维 PCA → UMAP / tSNE 聚类 FindNeighbors → FindClusters Marker识别 FindAllMarkers / 注释 每一步的输出都是下一步的输入 标准化后的矩阵 → PCA低维嵌入 低维嵌入 → 聚类分群 → 基因差异分析 最终产出: 带注释的细胞聚类结果

我其实想表达一个意思:Seurat这四步不是孤立的技术操作,而是一套完整的数据理解流程。标准化管数据的可比性,降维管特征提取,聚类管分组逻辑,marker管生物学身份。缺一个,后面的拟时序轨迹就是空中楼阁。

一个小习惯:每做完一个步骤,我都会停下来看看结果。比如PCA后我会检查一下前几个PC的载荷基因,看看它们是不是预期的细胞类型标记。这样做的好处是——等你跑到最后发现轨迹不对,回头排查时至少知道是哪一步出了问题。