Seurat — R语言单细胞RNA-seq分析核心工具包¶
一句话说明¶
Seurat(v5.5.0)是单细胞RNA-seq数据分析的"瑞士军刀"——从读入CellRanger/STARsolo输出的计数矩阵开始,经过质控、降维、聚类、差异分析,最终识别不同细胞类型,是全球最广泛使用的单细胞分析工具包。
安装与配置¶
# 在R中安装Seurat v5(最新版v5.4.0)
install.packages("Seurat") # 从CRAN安装
# 如果CRAN版本较旧,从GitHub安装最新版
install.packages("remotes")
remotes::install_github("satijalab/seurat", ref="seurat5")
# 安装常用配套包
install.packages(c(
"ggplot2", # 可视化
"dplyr", # 数据处理
"patchwork" # 图片拼合
))
# 加载库
library(Seurat)
library(ggplot2)
library(dplyr)
# 验证版本
packageVersion("Seurat") # 应显示 5.5.0 或更新
核心用法¶
第一步:读入数据,创建Seurat对象¶
# 读入CellRanger/STARsolo输出的10X格式矩阵
counts <- Read10X(
data.dir = "sample/outs/filtered_feature_bc_matrix/" # 矩阵目录
)
# 创建Seurat对象(最低细胞数和基因数过滤)
seurat_obj <- CreateSeuratObject(
counts = counts, # 计数矩阵
project = "PBMC_3p", # 项目名称
min.cells = 3, # 至少出现在3个细胞中的基因才保留
min.features = 200 # 至少检测到200个基因的细胞才保留
)
# 查看基本信息
seurat_obj # 输出:细胞数、基因数等
第二步:质量控制(QC)¶
# 计算线粒体基因百分比(质控关键指标)
seurat_obj[["percent.mt"]] <- PercentageFeatureSet(
seurat_obj,
pattern = "^MT-" # 人类线粒体基因以MT-开头(小鼠是^mt-)
)
# 可视化QC指标分布
VlnPlot(
seurat_obj,
features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), # 三个关键指标
ncol = 3
)
# 过滤低质量细胞(阈值根据数据调整)
seurat_obj <- subset(
seurat_obj,
subset = nFeature_RNA > 200 & # 最少检测到200个基因
nFeature_RNA < 5000 & # 最多5000个基因(去除双细胞)
percent.mt < 20 # 线粒体基因比例<20%(去除死细胞)
)
第三步:标准化、特征选择、降维¶
# 标准化(每细胞总表达量归一化到10000,再log转化)
seurat_obj <- NormalizeData(seurat_obj)
# 筛选高变基因(最具信息量的基因,用于后续分析)
seurat_obj <- FindVariableFeatures(
seurat_obj,
selection.method = "vst", # VST方法(推荐)
nfeatures = 2000 # 选取2000个高变基因
)
# 数据缩放(中心化,消除基因表达量差异)
seurat_obj <- ScaleData(seurat_obj)
# PCA降维
seurat_obj <- RunPCA(
seurat_obj,
features = VariableFeatures(seurat_obj) # 使用高变基因做PCA
)
# 查看PCA结果,选择合适的PC数
ElbowPlot(seurat_obj, ndims = 50) # 肘部图确定PC数(一般15-30个)
第四步:聚类与UMAP可视化¶
# 构建邻居图(基于PCA空间中的KNN)
seurat_obj <- FindNeighbors(
seurat_obj,
dims = 1:20 # 使用前20个PC(根据ElbowPlot调整)
)
# Leiden/Louvain聚类(resolution控制细胞类型粒度)
seurat_obj <- FindClusters(
seurat_obj,
resolution = 0.5 # 分辨率:0.1-0.3少聚类,0.5-1.0多聚类
)
# UMAP降维可视化
seurat_obj <- RunUMAP(
seurat_obj,
dims = 1:20 # 与FindNeighbors使用相同PC数
)
# 绘制UMAP图
DimPlot(
seurat_obj,
reduction = "umap", # 使用UMAP坐标
label = TRUE # 在图上显示聚类编号
)
参数详解¶
| 函数 | 关键参数 | 说明 |
|---|---|---|
CreateSeuratObject | min.cells / min.features | 基本过滤阈值 |
subset | percent.mt < 20 | 线粒体基因过滤(死细胞) |
FindVariableFeatures | nfeatures = 2000 | 高变基因数量 |
FindNeighbors | dims = 1:20 | 使用的PCA维度数 |
FindClusters | resolution | 聚类粒度(越大聚类越多) |
RunUMAP | dims = 1:20 | 同FindNeighbors |
实战案例¶
# 完整单细胞分析流程(PBMC数据)
library(Seurat)
library(ggplot2)
library(dplyr)
# 1. 读取数据
counts <- Read10X("pbmc_cellranger_output/filtered_feature_bc_matrix/")
pbmc <- CreateSeuratObject(counts, project="PBMC", min.cells=3, min.features=200)
# 2. QC过滤
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern="^MT-")
pbmc <- subset(pbmc, subset=nFeature_RNA>200 & nFeature_RNA<4500 & percent.mt<15)
cat("过滤后细胞数:", ncol(pbmc), "\n")
# 3. 预处理
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, nfeatures=2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc)
# 4. 聚类和可视化
pbmc <- FindNeighbors(pbmc, dims=1:15)
pbmc <- FindClusters(pbmc, resolution=0.5)
pbmc <- RunUMAP(pbmc, dims=1:15)
# 5. 可视化
p1 <- DimPlot(pbmc, reduction="umap", label=TRUE) + # UMAP聚类图
ggtitle("PBMC Clusters")
ggsave("pbmc_umap.pdf", p1, width=8, height=6)
# 6. 找每个聚类的marker基因
pbmc_markers <- FindAllMarkers(
pbmc,
only.pos = TRUE, # 仅找上调基因(marker)
min.pct = 0.25, # 至少25%的细胞表达
logfc.threshold = 0.25 # 至少0.25 log2倍数变化
)
# 查看每个聚类的top5 marker基因
pbmc_markers %>%
group_by(cluster) %>%
top_n(n=5, wt=avg_log2FC)
# 7. 基于marker基因注释细胞类型(以PBMC为例)
# 已知PBMC cell type markers:
# CD3D, CD4 -> CD4+ T cells
# CD3D, CD8A -> CD8+ T cells
# MS4A1 -> B cells
# CD14, LYZ -> Monocytes
# GNLY, NKG7 -> NK cells
FeaturePlot(pbmc,
features=c("CD3D","CD4","CD8A","MS4A1","CD14","GNLY"),
ncol=3) # 可视化各marker基因表达
# 8. 重命名聚类(根据marker注释结果)
new_cluster_ids <- c("CD4 T","CD14 Mono","CD4 T","B","CD8 T",
"NK","CD14 Mono","DC","Platelet")
names(new_cluster_ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new_cluster_ids)
# 9. 保存结果
saveRDS(pbmc, "pbmc_analyzed.rds") # 保存Seurat对象
常见报错与解决¶
报错1:Error: cannot allocate vector of size X Gb - 原因:R内存不足(大样本数据特别明显) - 解决:增大R内存options(future.globals.maxSize=8000*1024^2);或用Seurat v5的磁盘存储模式处理超大数据
报错2:Warning: Feature names cannot have underscores - 原因:基因名含下划线(自动转为短横线),影响下游分析 - 解决:正常警告,不影响分析结果;可用gsub("_","-",rownames(counts))提前转换
报错3:UMAP图中细胞分散,无明显聚类 - 原因:resolution设置不当,或PC数选择不合理 - 解决:查看ElbowPlot重新选PC数;尝试不同resolution值(0.3, 0.5, 0.8, 1.0);检查QC过滤是否足够
速查表¶
| 函数 | 用途 |
|---|---|
Read10X() | 读取CellRanger/STARsolo输出 |
CreateSeuratObject() | 创建Seurat对象 |
PercentageFeatureSet(pattern="^MT-") | 计算线粒体基因比例 |
NormalizeData() | 标准化(log-normalize) |
FindVariableFeatures() | 筛选高变基因 |
ScaleData() | 数据缩放(Z-score) |
RunPCA() | PCA降维 |
ElbowPlot() | 确定使用的PC数 |
FindNeighbors() | 构建KNN邻居图 |
FindClusters(resolution) | Louvain聚类 |
RunUMAP() | UMAP降维可视化 |
DimPlot() | UMAP/PCA散点图 |
FeaturePlot() | 基因表达在UMAP上的分布 |
VlnPlot() | 小提琴图(QC/基因表达) |
FindAllMarkers() | 每个聚类的差异基因 |
RenameIdents() | 重命名细胞类型 |