跳转至

571 Seurat v5 单细胞分析从零入门

适用人群:有宏基因组经验但没有单细胞经验的生信新手 Seurat 版本:5.5.0(2026-04-21 发布) R 版本要求:≥4.1.0 建议先阅读:570_Scanpy 单细胞分析从零入门


一、Seurat 是什么?

1.1 一句话介绍

Seurat 是 R 语言中最主流的单细胞分析工具包,由纽约大学 Satija Lab 开发。名字来自法国画家乔治·修拉(Georges Seurat),他创立了"点彩画派"——用一个个色点组成画面,正好对应单细胞分析"一个细胞一个细胞看"的思路。

1.2 Scanpy vs Seurat:什么时候用哪个?

对比项Scanpy (Python)Seurat (R)
编程语言PythonR
数据结构AnnData (.h5ad)SeuratObject (.rds)
社区生态scverse 生态(scvi-tools, squidpy 等)Signac, Azimuth, Harmony 等
可视化matplotlib/scanpy 内置ggplot2 生态,更好看
大数据支持dask 后端(实验性)sketch-based 工作流,BPCells
上手难度对 Python 用户友好对 R 用户友好
论文引用约 6000+约 20000+,引用更多
适合场景和深度学习工具联动(scvi, cellxgene)和 R 统计/可视化工具联动

白话建议: - 你如果更熟 Python → 用 Scanpy - 你如果更熟 R、或者合作者用 R → 用 Seurat - 面试时两个都要会说原理,至少精通一个的代码 - 它们的分析流程几乎一一对应,学会一个另一个很快上手

1.3 分析流程对照

Scanpy:  read → filter → normalize → log1p → HVG → scale → PCA → neighbors → UMAP → leiden → markers
Seurat:  Read10X → CreateSeuratObject → filter → Normalize → FindVariableFeatures → Scale → PCA → FindNeighbors → FindClusters → UMAP → FindAllMarkers

二、Seurat v5 新特性

Seurat v5(2023 年发布,当前最新 5.5.0)相比 v4 有几个重要变化:

2.1 Assay5 数据结构(最大变化)

v4 用 Assay 对象,数据存在固定的 @counts@data@scale.data 三个 slot 里。 v5 改用 Assay5 对象,数据存在灵活的 layers 里:

# v4 的写法(旧)
seurat_obj@assays$RNA@counts     # 原始计数
seurat_obj@assays$RNA@data       # 归一化数据

# v5 的写法(新)
LayerData(seurat_obj, layer = "counts")    # 原始计数
LayerData(seurat_obj, layer = "data")      # 归一化数据

白话:v4 像一个三层抽屉柜(counts/data/scale.data),每层固定放什么。v5 像一个可以自由贴标签的储物格,你想存多少层都行,而且不同样本的 counts 可以分开存(方便整合)。

2.2 多模态整合增强

v5 原生支持多种数据类型的整合: - scRNA-seq + scATAC-seq(通过 Bridge Integration) - 多个批次的数据整合(streamlined integration) - 空间转录组(Visium, MERFISH, Slide-seq)

2.3 大规模数据支持

  • Sketch-based 工作流:先从百万级数据中抽一个代表性子集做分析,再映射回全量
  • BPCells 后端:支持磁盘上的稀疏矩阵运算,不用全部加载到内存
  • 更快的差异表达:默认用 presto 包,速度提升数十倍

2.4 SCTransform v2

归一化方法 SCTransform 更新到 v2 版本,是 v5 中 SCTransform() 的默认版本。


三、安装 Seurat v5

3.1 从 CRAN 安装(推荐)

# 安装 Seurat v5(当前最新版 5.5.0)
install.packages('Seurat')  # 从 CRAN 安装,会自动安装依赖

# 安装常用辅助包
install.packages('patchwork')    # 拼图工具,把多个 ggplot 拼在一起
install.packages('dplyr')        # 数据处理神器
install.packages('ggplot2')      # 画图核心包

3.2 安装 SingleR(自动注释用)

# SingleR 在 Bioconductor 上,需要用 BiocManager 安装
if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")  # 先安装 BiocManager

BiocManager::install("SingleR")            # 安装 SingleR(自动细胞类型注释)
BiocManager::install("celldex")            # 安装参考数据集包
BiocManager::install("SingleCellExperiment")  # SingleR 依赖的数据结构

3.3 验证安装

library(Seurat)              # 加载 Seurat
packageVersion("Seurat")     # 查看版本号,应该是 5.5.0

3.4 conda 方式安装(可选)

# 如果你更习惯 conda
conda create -n seurat_env r-base=4.4 -y  # 创建 R 环境
conda activate seurat_env                   # 激活环境
conda install -c conda-forge r-seurat -y    # 安装 Seurat
# 注意:conda 版本可能不是最新,建议在 R 里用 install.packages

四、完整分析流程实战:PBMC 3k

Step 0: 加载包和下载数据

# ---- 加载所需的 R 包 ----
library(Seurat)       # 单细胞分析主包
library(dplyr)        # 数据处理
library(patchwork)    # 图片拼接
library(ggplot2)      # 画图

# ---- 下载 PBMC 3k 数据 ----
# 10x 官方提供的经典数据集,约 2700 个外周血单个核细胞
# 方法一:从网上下载(需要联网)
# 下载地址:https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz
# 解压后得到 filtered_gene_bc_matrices/hg19/ 目录

# 方法二:用 SeuratData 包(更方便)
# install.packages("SeuratData")
# library(SeuratData)
# InstallData("pbmc3k")
# data("pbmc3k")

# ---- 读取 10x 数据 ----
# 假设数据解压在 data/ 目录下
pbmc.data <- Read10X(data.dir = "data/filtered_gene_bc_matrices/hg19/")
# Read10X 会自动读取 barcodes.tsv, genes.tsv, matrix.mtx 三个文件
# 返回一个稀疏矩阵(行=基因, 列=细胞)

# 查看数据维度
dim(pbmc.data)  # 应该是 32738 行(基因)× 2700 列(细胞)

# 看前几个基因和细胞
pbmc.data[1:5, 1:3]  # 前 5 个基因 × 前 3 个细胞

Step 1: 创建 Seurat 对象

# ---- 创建 Seurat 对象 ----
pbmc <- CreateSeuratObject(
    counts = pbmc.data,     # 原始计数矩阵
    project = "pbmc3k",     # 项目名称(会显示在 metadata 里)
    min.cells = 3,          # 一个基因至少在 3 个细胞中表达才保留
    min.features = 200      # 一个细胞至少检测到 200 个基因才保留
)

# 查看 Seurat 对象
pbmc  # 会显示类似:An object of class Seurat, 13714 features across 2700 samples

Step 2: 质控(QC)

# ---- 计算线粒体基因比例 ----
# 线粒体基因以 "MT-" 开头(人类),高比例说明细胞可能已经死亡
pbmc[["percent.mt"]] <- PercentageFeatureSet(
    pbmc,
    pattern = "^MT-"  # 正则表达式:以 MT- 开头的基因
)

# 查看 QC 指标
head(pbmc@meta.data, 5)  # 查看前 5 个细胞的元数据
# nCount_RNA   = 总 UMI 数(类似 Scanpy 的 total_counts)
# nFeature_RNA = 基因数(类似 Scanpy 的 n_genes_by_counts)
# percent.mt   = 线粒体比例

# ---- 画 QC 小提琴图 ----
VlnPlot(
    pbmc,
    features = c("nFeature_RNA",   # 基因数
                 "nCount_RNA",     # UMI 数
                 "percent.mt"),    # 线粒体比例
    ncol = 3                       # 三张图并排
)
ggsave("qc_violin.png", width = 12, height = 4)  # 保存图片

# ---- 画散点图看相关性 ----
plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
plot1 + plot2  # 用 patchwork 拼图
ggsave("qc_scatter.png", width = 12, height = 5)

# ---- 过滤 ----
pbmc <- subset(
    pbmc,
    subset = nFeature_RNA > 200 &     # 基因数 > 200(去掉空液滴)
             nFeature_RNA < 2500 &     # 基因数 < 2500(去掉 doublet)
             percent.mt < 5            # 线粒体比例 < 5%(去掉死细胞)
)

cat("质控后:", ncol(pbmc), "个细胞,", nrow(pbmc), "个基因\n")
# 典型输出:质控后: 2638 个细胞, 13714 个基因

Step 3: 归一化

Seurat v5 提供两种归一化方法,任选其一:

方法 A:标准归一化(LogNormalize)

# ---- 标准归一化 ----
pbmc <- NormalizeData(
    pbmc,
    normalization.method = "LogNormalize",  # 方法:先除以总 UMI,再乘以 scale.factor,再取 log
    scale.factor = 10000                     # 缩放因子(和 Scanpy 的 target_sum=1e4 一样)
)
# 归一化后的数据存在 Layers 的 "data" 层

方法 B:SCTransform(推荐,效果更好)

# ---- SCTransform v2 归一化(推荐) ----
# 同时完成归一化 + 高变基因选择 + 缩放,一步到位
# pbmc <- SCTransform(
#     pbmc,
#     vars.to.regress = "percent.mt",  # 回归掉线粒体比例的影响
#     verbose = FALSE                   # 不输出进度信息
# )
# 注意:如果用 SCTransform,可以跳过 Step 4 和 Step 5 的 FindVariableFeatures + ScaleData

白话NormalizeData 是简单粗暴的"除以总数再取 log";SCTransform 用了更复杂的统计模型(正则化负二项回归),效果通常更好,但计算更慢。新手先用 NormalizeData 学流程,实战推荐 SCTransform。

Step 4: 找高变基因

# ---- 找高变基因(Highly Variable Features, HVFs)----
pbmc <- FindVariableFeatures(
    pbmc,
    selection.method = "vst",   # 使用 VST 方法(方差稳定化转换)
    nfeatures = 2000            # 选 2000 个高变基因(默认值)
)

# 查看 top 10 高变基因
top10 <- head(VariableFeatures(pbmc), 10)  # 获取前 10 个高变基因名
print(top10)

# 画高变基因图
plot1 <- VariableFeaturePlot(pbmc)                   # 散点图
plot2 <- LabelPoints(plot = plot1, points = top10)   # 标注 top10
plot2
ggsave("hvg.png", width = 10, height = 5)

Step 5: 缩放数据

# ---- 缩放:让每个基因的均值为 0,标准差为 1 ----
all.genes <- rownames(pbmc)     # 获取所有基因名
pbmc <- ScaleData(
    pbmc,
    features = all.genes,       # 对所有基因缩放(默认只对高变基因缩放)
    vars.to.regress = "percent.mt"  # 可选:回归掉线粒体比例
)
# 缩放后的数据存在 Layers 的 "scale.data" 层

Step 6: PCA 降维

# ---- PCA 降维 ----
pbmc <- RunPCA(
    pbmc,
    features = VariableFeatures(object = pbmc),  # 只用高变基因做 PCA
    npcs = 50                                     # 计算 50 个主成分
)

# 查看前 2 个 PC 的 top 基因
print(pbmc[["pca"]], dims = 1:2, nfeatures = 5)  # 每个 PC 显示 5 个基因

# 画 PCA 图
DimPlot(pbmc, reduction = "pca")  # 在 PC1-PC2 平面画细胞
ggsave("pca.png", width = 7, height = 5)

# 画肘部图(Elbow Plot)决定用多少个 PC
ElbowPlot(pbmc, ndims = 50)  # 显示前 50 个 PC 的标准差
ggsave("elbow.png", width = 7, height = 5)
# 一般在第 10-15 个 PC 附近出现拐点

Step 7: 构建邻居图 + 聚类

# ---- 构建 KNN 邻居图 ----
pbmc <- FindNeighbors(
    pbmc,
    dims = 1:10  # 使用前 10 个 PC(根据肘部图决定)
)

# ---- 聚类(Leiden / Louvain)----
pbmc <- FindClusters(
    pbmc,
    resolution = 0.5,       # 分辨率:越大分的群越多
    algorithm = 4            # 算法:1=Louvain, 4=Leiden(推荐 Leiden)
)

# 查看聚类结果
head(Idents(pbmc))  # 显示前几个细胞的聚类标签
table(Idents(pbmc)) # 统计每个 cluster 的细胞数

Step 8: UMAP 降维可视化

# ---- UMAP 降维 ----
pbmc <- RunUMAP(
    pbmc,
    dims = 1:10  # 使用前 10 个 PC
)

# 画 UMAP 聚类图
DimPlot(
    pbmc,
    reduction = "umap",      # 使用 UMAP 坐标
    label = TRUE,             # 在每个 cluster 上显示编号
    pt.size = 0.5             # 点的大小
) + NoLegend()                # 去掉图例(因为标签已经在图上了)
ggsave("umap_clusters.png", width = 7, height = 6)

Step 9: 找 Marker 基因(差异表达)

# ---- 找所有 cluster 的 marker 基因 ----
pbmc.markers <- FindAllMarkers(
    pbmc,
    only.pos = TRUE,          # 只看上调的基因(正的 log2FC)
    min.pct = 0.25,           # 至少在 25% 的细胞中表达
    logfc.threshold = 0.25,   # log2 fold change 阈值
    test.use = "wilcox"       # 使用 Wilcoxon 检验(和 Scanpy 一样)
)

# 查看每个 cluster 的 top 5 marker
top5 <- pbmc.markers %>%
    group_by(cluster) %>%          # 按 cluster 分组
    filter(p_val_adj < 0.05) %>%   # 只保留显著的(调整后 p < 0.05)
    slice_head(n = 5)              # 每组取前 5 个
print(top5, n = 40)                # 打印结果

# 画 marker 基因热图
DoHeatmap(
    pbmc,
    features = top5$gene    # 用 top5 marker 基因
) + NoLegend()
ggsave("heatmap_markers.png", width = 12, height = 8)

Step 10: 细胞类型注释

方法 A:手动注释(根据已知 marker)

# ---- PBMC 常见细胞类型的 marker 基因 ----
# 先用 FeaturePlot 看关键 marker 在 UMAP 上的表达
FeaturePlot(
    pbmc,
    features = c("MS4A1",   # B 细胞
                 "CD14",    # CD14 单核细胞
                 "LYZ",     # 单核细胞
                 "IL7R",    # CD4 T 细胞
                 "CD8A",    # CD8 T 细胞
                 "GNLY",    # NK 细胞
                 "FCGR3A",  # CD16 单核细胞
                 "FCER1A",  # 树突状细胞
                 "PPBP"),   # 血小板
    ncol = 3                # 每行 3 图
)
ggsave("featureplot_markers.png", width = 15, height = 12)

# 用 DotPlot 看每个 cluster 的 marker 表达
DotPlot(
    pbmc,
    features = c("IL7R", "CD4", "CD8A", "CD8B", "MS4A1", "CD79A",
                 "GNLY", "NKG7", "CD14", "LYZ", "FCGR3A", "MS4A7",
                 "FCER1A", "CST3", "PPBP"),
    dot.scale = 8               # 点的最大大小
) + RotatedAxis()               # 横轴标签旋转
ggsave("dotplot_markers.png", width = 12, height = 5)

# ---- 手动注释:给每个 cluster 贴标签 ----
# 根据 FeaturePlot 和 DotPlot 结果判断(具体对应关系需要看你的图)
new.cluster.ids <- c(
    "Naive CD4 T",        # cluster 0
    "CD14+ Mono",         # cluster 1
    "Memory CD4 T",       # cluster 2
    "B",                  # cluster 3
    "CD8 T",              # cluster 4
    "FCGR3A+ Mono",       # cluster 5
    "NK",                 # cluster 6
    "DC",                 # cluster 7
    "Platelet"            # cluster 8
)
names(new.cluster.ids) <- levels(pbmc)     # 把标签和 cluster 编号对应
pbmc <- RenameIdents(pbmc, new.cluster.ids) # 重命名

# 画注释后的 UMAP
DimPlot(
    pbmc,
    reduction = "umap",
    label = TRUE,           # 显示标签
    pt.size = 0.5
) + NoLegend()
ggsave("umap_celltype.png", width = 8, height = 6)

方法 B:SingleR 自动注释

# ---- 使用 SingleR 自动注释(需要先安装 SingleR 和 celldex)----
library(SingleR)                    # 加载 SingleR
library(celldex)                    # 加载参考数据集
library(SingleCellExperiment)       # 加载数据结构包

# 获取参考数据集(人类免疫细胞)
ref <- celldex::HumanPrimaryCellAtlasData()  # 下载人类细胞图谱参考数据

# 提取 Seurat 对象的表达矩阵,转为 SingleCellExperiment 格式
sce <- as.SingleCellExperiment(pbmc)  # Seurat 对象转 SCE 对象

# 运行 SingleR 自动注释
pred <- SingleR(
    test = sce,              # 你的数据
    ref = ref,               # 参考数据集
    labels = ref$label.main  # 使用主要标签(粗分类)
)

# 把预测结果加到 Seurat 对象的 metadata 里
pbmc$SingleR_labels <- pred$labels  # 添加注释列

# 画 SingleR 注释结果
DimPlot(
    pbmc,
    reduction = "umap",
    group.by = "SingleR_labels",  # 用 SingleR 标签着色
    label = TRUE,
    repel = TRUE,                  # 标签不重叠
    pt.size = 0.5
) + NoLegend()
ggsave("umap_singler.png", width = 10, height = 7)

Step 11: 保存结果

# ---- 保存 Seurat 对象 ----
saveRDS(pbmc, file = "pbmc3k_analyzed.rds")   # 保存为 RDS 文件
# 下次加载:pbmc <- readRDS("pbmc3k_analyzed.rds")

# ---- 导出 metadata 为表格 ----
write.csv(
    pbmc@meta.data,                            # 细胞元数据
    file = "pbmc3k_metadata.csv",              # 保存路径
    row.names = TRUE                            # 保留 barcode 作为行名
)

五、Seurat 对象结构详解

Seurat 对象可以类比成一个多层文件柜

Seurat 对象结构:
┌──────────────────────────────────────────────────┐
│  @assays                                          │
│  └── RNA (Assay5 对象)                            │
│      ├── layers$counts     → 原始计数矩阵         │  ← 类似 Scanpy 的 adata.layers['counts']
│      ├── layers$data       → 归一化后的数据        │  ← 类似 Scanpy 的 adata.X
│      └── layers$scale.data → 缩放后的数据          │
├──────────────────────────────────────────────────┤
│  @meta.data (DataFrame)                           │
│  每行一个细胞,包含:                               │
│  - nCount_RNA      总 UMI 数                       │  ← 类似 adata.obs['total_counts']
│  - nFeature_RNA    基因数                          │  ← 类似 adata.obs['n_genes_by_counts']
│  - percent.mt      线粒体比例                      │  ← 类似 adata.obs['pct_counts_mt']
│  - seurat_clusters 聚类标签                        │  ← 类似 adata.obs['leiden']
├──────────────────────────────────────────────────┤
│  @reductions                                      │
│  ├── pca   → PCA 降维结果                          │  ← 类似 adata.obsm['X_pca']
│  ├── umap  → UMAP 降维结果                         │  ← 类似 adata.obsm['X_umap']
│  └── tsne  → t-SNE 降维结果(如果计算了的话)       │  ← 类似 adata.obsm['X_tsne']
├──────────────────────────────────────────────────┤
│  @graphs                                          │
│  ├── RNA_nn    → KNN 图(最近邻)                   │  ← 类似 adata.obsp['distances']
│  └── RNA_snn   → SNN 图(共享最近邻)               │  ← 类似 adata.obsp['connectivities']
├──────────────────────────────────────────────────┤
│  @commands   → 记录你执行过的每一步操作(可复现)     │
│  @misc       → 杂物柜(自定义数据)                 │  ← 类似 adata.uns
└──────────────────────────────────────────────────┘

常用查看方法

pbmc                           # 打印对象概况
dim(pbmc)                      # 维度:基因数 × 细胞数(注意和 Scanpy 反过来)
head(pbmc@meta.data)           # 查看细胞元数据
Idents(pbmc)                   # 查看当前的细胞标签(默认是聚类结果)
Layers(pbmc)                   # 查看有哪些数据层
Reductions(pbmc)               # 查看有哪些降维结果
colnames(pbmc)[1:5]            # 前 5 个细胞的 barcode
rownames(pbmc)[1:5]            # 前 5 个基因名

六、Scanpy vs Seurat 对应函数速查表

分析步骤Scanpy (Python)Seurat (R)
读取 10x 数据sc.read_10x_mtx()Read10X()
创建对象自动(读取即创建 AnnData)CreateSeuratObject()
计算 QC 指标sc.pp.calculate_qc_metrics()PercentageFeatureSet()
过滤细胞/基因sc.pp.filter_cells() / sc.pp.filter_genes()subset() + CreateSeuratObject(min.cells, min.features)
归一化sc.pp.normalize_total() + sc.pp.log1p()NormalizeData()SCTransform()
高变基因sc.pp.highly_variable_genes()FindVariableFeatures()
缩放sc.pp.scale()ScaleData()
回归混杂因素sc.pp.regress_out()ScaleData(vars.to.regress=)SCTransform(vars.to.regress=)
PCAsc.tl.pca()RunPCA()
肘部图sc.pl.pca_variance_ratio()ElbowPlot()
邻居图sc.pp.neighbors()FindNeighbors()
聚类sc.tl.leiden()FindClusters()
UMAPsc.tl.umap()RunUMAP()
差异表达sc.tl.rank_genes_groups()FindAllMarkers() / FindMarkers()
UMAP 图sc.pl.umap()DimPlot()
基因表达图sc.pl.umap(color='gene')FeaturePlot()
小提琴图sc.pl.violin()VlnPlot()
点图sc.pl.dotplot()DotPlot()
热图sc.pl.heatmap()DoHeatmap()
保存adata.write('file.h5ad')saveRDS(obj, 'file.rds')
读取sc.read_h5ad('file.h5ad')readRDS('file.rds')

七、常见报错与解决

报错 1:Error in validObject(.Object) ... Layer "data" is not found

# 原因:Seurat v5 的 Assay5 数据结构中,某些操作还没生成对应的 layer
# 解决:确保在运行 NormalizeData 之后再使用需要 "data" 层的函数

# 如果是从旧版 Seurat 对象升级来的,可以试:
pbmc[["RNA"]] <- as(pbmc[["RNA"]], "Assay5")  # 转换为 v5 格式

报错 2:Error in FindNeighbors ... 'pca' not found

# 原因:在 FindNeighbors 之前没有跑 RunPCA
# 解决:按顺序执行流程

# 正确顺序:
# NormalizeData → FindVariableFeatures → ScaleData → RunPCA → FindNeighbors

报错 3:安装 Seurat 时 C++ 编译报错

# 原因:系统缺少 C++ 编译工具或依赖库
# 解决:

# Ubuntu/Debian:
# sudo apt-get install libcurl4-openssl-dev libssl-dev libxml2-dev libhdf5-dev

# CentOS/RHEL:
# sudo yum install libcurl-devel openssl-devel libxml2-devel hdf5-devel

# macOS:
# xcode-select --install
# brew install hdf5

报错 4:Warning: Different cells and/or features from SCTransform

# 原因:SCTransform 会重新筛选基因,导致和之前的 Assay 基因不一致
# 解决:这通常是正常警告,不用担心
# 如果需要某些特定基因,可以在 SCTransform 之前就过滤好

# 或者使用标准归一化流程避免此问题:
# NormalizeData → FindVariableFeatures → ScaleData

报错 5:内存不足(大数据集)

# 原因:数据太大(几十万到百万细胞)
# 解决方案:

# 方法一:使用 BPCells 后端(磁盘上操作,不全加载到内存)
# install.packages("BPCells")
# library(BPCells)
# mat <- open_matrix_dir("path/to/bpcells_dir")
# pbmc <- CreateSeuratObject(counts = mat)

# 方法二:使用 Sketch 工作流(先抽样分析再映射回全量)
# pbmc <- SketchData(
#     object = pbmc,
#     ncells = 5000,           # 抽取 5000 个代表性细胞
#     method = "LeverageScore"
# )

八、速查表

数据读写

函数功能
Read10X()读取 Cell Ranger 输出的 10x 数据
Read10X_h5()读取 10x 的 h5 文件
readRDS()读取保存的 Seurat 对象
saveRDS()保存 Seurat 对象
CreateSeuratObject()从矩阵创建 Seurat 对象

预处理

函数功能
NormalizeData()标准归一化(LogNormalize)
SCTransform()SCTransform 归一化(一步到位)
FindVariableFeatures()找高变基因
ScaleData()缩放数据(z-score)
PercentageFeatureSet()计算某类基因(如 MT-)的占比

降维与聚类

函数功能
RunPCA()PCA 降维
RunUMAP()UMAP 降维
RunTSNE()t-SNE 降维
FindNeighbors()构建 KNN/SNN 邻居图
FindClusters()聚类(Louvain 或 Leiden)

差异表达

函数功能
FindAllMarkers()找所有 cluster 的 marker 基因
FindMarkers()比较两组之间的差异基因
FindConservedMarkers()找跨条件保守的 marker

可视化

函数功能
DimPlot()降维散点图(UMAP/PCA/t-SNE)
FeaturePlot()基因表达在降维图上的分布
VlnPlot()小提琴图
DotPlot()点图(大小=表达比例, 颜色=表达量)
DoHeatmap()热图
RidgePlot()山脊图
ElbowPlot()肘部图(PCA 方差解释)
FeatureScatter()散点图(两个指标对比)

关键参数速记

参数推荐值说明
min.features200CreateSeuratObject 过滤低质量细胞
min.cells3CreateSeuratObject 过滤低表达基因
nFeature_RNA 上限2500-5000过滤 doublet
percent.mt< 5-20%依组织类型调整
nfeatures2000FindVariableFeatures 选的高变基因数
dims1:10 到 1:30FindNeighbors/RunUMAP 用的 PC 数
resolution0.3-1.5FindClusters 分辨率
min.pct0.25FindAllMarkers 最低表达比例
logfc.threshold0.25FindAllMarkers 最低 log2FC

标准分析流程一行概括

# 读 → 建对象 → 质控 → 归一化 → 高变基因 → 缩放 → PCA → 邻居 → 聚类 → UMAP → Marker → 注释
Read10X  CreateSeuratObject  subset  NormalizeData  FindVariableFeatures  ScaleData  RunPCA  FindNeighbors  FindClusters  RunUMAP  FindAllMarkers  手动/SingleR

参考资源: - Seurat 官方教程:https://satijalab.org/seurat/articles/pbmc3k_tutorial - Seurat v5 新功能:https://satijalab.org/seurat/articles/announcements - Seurat GitHub:https://github.com/satijalab/seurat - SingleR 文档:https://bioconductor.org/packages/release/bioc/html/SingleR.html - 10x Genomics 数据集:https://www.10xgenomics.com/datasets