Seurat入门:安装、数据结构与基本流程
单细胞分析跑不掉Seurat,这几乎是R用户的首选。我自己做项目时,不管后面用不用Scanpy对比,第一遍预处理肯定先用Seurat捋一遍。为啥?因为它的数据结构直观,调试起来顺手。今天我就带你过一遍Seurat的安装、核心数据结构和基本流程——这步走稳了,后面做批次校正才不慌。
3.1 安装 Seurat
Seurat目前最新是v5版本,但我建议直接从Bioconductor装稳定版。个人工作经验告诉我,生产环境别追最新,稳定优先。
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("Seurat")
如果你想体验v5的新特性(比如多模态支持),可以从GitHub装:
remotes::install_github("satijalab/seurat", "seurat5", quiet = TRUE)
避坑提示:我刚开始接触Seurat的时候,直接用了install.packages("Seurat"),结果依赖包版本冲突,排查了大半天。后来养成习惯——单细胞项目都用BiocManager装,省心。
装完之后,记得加载它:
library(Seurat)
packageVersion("Seurat") # 确认版本
3.2 主要数据结构:Seurat对象
Seurat的核心,说白了就是一个大容器——Seurat对象。里面藏了三层东西:原始表达矩阵、标准化后的数据、还有各种元数据。
创建一个对象很简单:
pbmc.data <- Read10X(data.dir = "filtered_gene_bc_matrices/hg19/")
pbmc <- CreateSeuratObject(
counts = pbmc.data,
project = "pbmc3k",
min.cells = 3,
min.features = 200
)
你想想看,这段代码同时干了三件事:读数据、过滤掉低质量的细胞和基因、打包成对象。对象里最重要的几个仓(slots),我习惯用一张表说清楚:
| Slot 名称 | 内容 | 常用操作 |
|---|---|---|
assays | 表达数据(原始/标准化/缩放) | GetAssayData() |
meta.data | 每个细胞的属性(UMI数、基因数、分组等) | pbmc[[]] |
reductions | 降维结果(PCA、UMAP、tSNE) | Embeddings() |
commands | 记录每一步的分析命令 | pbmc@commands |
嗯,这里要注意——千万别搞混 data 和 scale.data。我最早做差异分析时,直接用counts矩阵塞进去,结果找出来的“高变基因”全是噪音。现在养成了习惯:标准化之前,先瞄一眼 pbmc[["RNA"]]$counts 长什么样。
个人习惯:每次处理新数据,我第一步都是 head(pbmc[[]]),看看meta.data里有没有异常值。这能提前发现坏样本。
3.3 基本流程:五步法
Seurat的标准流程我用五个词概括——QC → Norm → HVG → PCA → Cluster。口诀记熟了,操作就快了。
下面是一套经典代码链:
# 1. 质量控制
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")
pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5)
# 2. 标准化
pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000)
# 3. 找高变基因
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
# 4. 缩放与降维
pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt")
pbmc <- RunPCA(pbmc, npcs = 30)
# 5. 聚类与可视化
pbmc <- FindNeighbors(pbmc, dims = 1:10)
pbmc <- FindClusters(pbmc, resolution = 0.5)
pbmc <- RunUMAP(pbmc, dims = 1:10)
你可能会问:为什么先QC再标准化?顺序很重要。QC阶段如果不过滤掉低质量细胞,标准化时会引入很多噪声。我曾经手抖把标准化顺序搞反了,结果UMAP图上细胞全糊成一团——别问我怎么知道的。
核心思想:Seurat的每一步都依赖上一步的结果。QC不过关,后面的批次校正、差异分析都会变形。宁可在QC上多花时间,也不要在最后调整参数。
下面这张SVG图把这个流程串了起来,你跟着箭头走一遍,心里就有谱了。
3.4 避坑与实战建议
流程跑通了,但现实数据从来不会这么老实。分享几个我实战中踩过的坑:
- QC 指标别死板:
nFeature_RNA的下限和上限,不同组织差异很大。我做过一批肿瘤样本,正常细胞 200-2500,但肿瘤细胞能到 4000。一刀切会丢掉真实信号。 - ScaleData 的参数:默认对全部基因做缩放,大数据时超慢。
vars.to.regress这个参数一定要用,我一般会回归掉 percent.mt 和 cell cycle 分数。 - 分辨率的选择:findClusters 的 resolution 从 0.2 试到 1.0,用 clustree 包画树状图来决定。我个人习惯先用 0.5 看粗糙结构,再细分。
一句话总结:Seurat 的入门不难,难的是理解每一步到底在干什么。
这章的内容,就是后续所有分析(包括批次校正)的地基。你会跑 RunCCA、FindIntegrationAnchors、SCTransform 这些高级功能——但前提是把基础流程刻进脑子里。