基础篇 完整流程

单细胞测序完整工作流

从原始数据到发表级图表的保姆级教程

⚠️
免责声明: 本内容仅供医学学习参考,不作为临床诊断依据。 实际临床决策请结合患者具体情况和多学科意见。
📖

单细胞RNA测序(scRNA-seq)分析看似复杂,其实有一套标准流程。 本教程按照真实项目顺序, 从数据读取、质控、标准化到聚类、注释、可视化,一步步带你完成首个单细胞分析!

📋 分析流程概览

1.数据读取 2.质控 3.标准化 4.降维 5.聚类 6.注释

Step 0: 环境准备

# 安装Seurat包 (最新版v5)
install.packages("Seurat")

# 加载必要的包
library(Seurat)
library(dplyr)
library(patchwork)  # 用于拼图

# 检查版本
packageVersion("Seurat")
# 建议使用 v4 或 v5

💡 内存要求: 单细胞数据通常较大,建议至少16GB内存。如果是大型数据集(>100k细胞),建议32GB以上。

Step 1: 数据读取

# 10x Genomics 数据 (最常用)
# 数据目录应包含: barcodes.tsv, genes.tsv, matrix.mtx
pbmc.data <- Read10X(data.dir = "path/to/filtered_feature_bc_matrix/")

# 查看数据维度
dim(pbmc.data)
# [1] 13714  2700
# 13714个基因, 2700个细胞

# 创建Seurat对象
pbmc <- CreateSeuratObject(
    counts = pbmc.data,
    project = "PBMC",           # 项目名
    min.cells = 3,             # 基因至少在3个细胞表达
    min.features = 200         # 细胞至少表达200个基因
)

# 查看对象摘要
pbmc

📌 数据过滤参数

  • min.cells:去除低表达基因(可能是噪音)
  • min.features:去除低质量细胞(可能是空液滴)
  • • 这两个参数根据具体数据调整

Step 2: 质量控制 (QC)

# 计算线粒体基因比例 (关键QC指标)
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-")

# 计算核糖体基因比例 (可选)
pbmc[["percent.rb"]] <- PercentageFeatureSet(pbmc, pattern = "^RP[SL]")

# 可视化QC指标
VlnPlot(pbmc,
    features = c("nFeature_RNA", "nCount_RNA", "percent.mt"),
    ncol = 3
)

# 查看QC指标分布
head(pbmc@meta.data)

⚠️ QC指标含义

  • nFeature_RNA:检测到的基因数,过低可能是空液滴,过高可能是双细胞
  • nCount_RNA:UMI总数,反映测序深度
  • percent.mt:线粒体基因比例,高比例表示细胞可能已死亡或受损
# 过滤低质量细胞 (根据实际数据调整阈值)
pbmc <- subset(pbmc,
    subset = "
        nFeature_RNA > 200 &
        nFeature_RNA < 2500 &
        percent.mt < 5
    "
)

# 查看过滤后剩余细胞数
ncol(pbmc)

Step 3: 数据标准化

# 方法1: 标准LogNormalize (经典方法)
pbmc <- NormalizeData(
    pbmc,
    normalization.method = "LogNormalize",
    scale.factor = 10000  # CPM scaling
)

# 方法2: SCTransform (推荐,v5默认)
# pbmc <- SCTransform(pbmc, vars.to.regress = "percent.mt")

# 识别高变基因 (HVGs)
pbmc <- FindVariableFeatures(
    pbmc,
    selection.method = "vst",  # 推荐方法
    nfeatures = 2000
)

# 可视化高变基因
VariableFeaturePlot(pbmc) +
    theme(legend.position = "none")

💡 高变基因的重要性: 高变基因是细胞间差异表达的主要来源,它们定义了细胞的异质性。 后续降维和聚类只使用这些基因,可以降低噪音并提高计算效率。

Step 4: 降维分析

# 数据缩放 (Scale)
all.genes <- rownames(pbmc)
pbmc <- ScaleData(pbmc, features = all.genes)

# 线性降维: PCA
pbmc <- RunPCA(
    pbmc,
    features = VariableFeatures(object = pbmc),
    npcs = 50  # 计算前50个主成分
)

# 可视化PCA (Elbow Plot)
ElbowPlot(pbmc, ndims = 50)

📌 如何选择PC数量?

  • • 查看 Elbow Plot,在"拐点"之前选择
  • • 通常选择前10-30个PC
  • • 可以使用 PCTechPlot 辅助判断
  • • 不同数据集可能需要不同数量的PC
# 非线性降维: UMAP 和 t-SNE
pbmc <- RunUMAP(pbmc, dims = 1:20)
pbmc <- RunTSNE(pbmc, dims = 1:20)

# 可视化降维结果
DimPlot(pbmc, reduction = "umap")

Step 5: 细胞聚类

# 构建KNN图
pbmc <- FindNeighbors(
    pbmc,
    dims = 1:20  # 使用前20个PC
)

# 聚类 (Louvain算法)
pbmc <- FindClusters(
    pbmc,
    resolution = 0.5  # 聚类分辨率
)

# 查看聚类结果
table(pbmc$seurat_clusters)

# UMAP上显示聚类
DimPlot(pbmc, reduction = "umap", label = TRUE)

💡 resolution 参数: 控制聚类粒度:
• 低值(0.1-0.5):少量大cluster
• 高值(0.8-2.0):更多小cluster
• 可以尝试多个值,选择生物学意义最合理的

Step 6: 寻找Marker基因

# 寻找每个cluster的marker基因
pbmc.markers <- FindAllMarkers(
    pbmc,
    only.pos = TRUE,      # 只找上调基因
    min.pct = 0.25,        # 最少25%细胞表达
    logfc.threshold = 0.25  # logFC阈值
)

# 查看top markers
top.markers <- pbmc.markers %>%
    group_by(cluster) %>%
    top_n(n = 5, wt = avg_log2FC)

# 可视化top markers
DotPlot(pbmc, features = c("CD3D", "CD8A", "CD4", "MS4A1", "LYZ")) +
    RotatedAxis()

📌 Marker基因的作用: Marker基因是定义细胞类型的"身份证"。通过查找文献或数据库(如CellMarker、PanglaoDB), 可以确定每个cluster对应的细胞类型。

Step 7: 细胞类型注释

# 根据marker基因手动注释
# 需要结合生物学知识和文献

# 定义新的细胞类型标签
new.cluster.ids <- c(
    "Naive CD4 T",
    "Memory CD4 T",
    "CD14+ Mono",
    "B",
    "CD8 T",
    "FCGR3A+ Mono",
    "NK",
    "DC",
    "Platelet"
)

# 重命名cluster
names(new.cluster.ids) <- levels(pbmc)
pbmc <- RenameIdents(pbmc, new.cluster.ids)

DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend()

💡 自动注释工具: 如果手动注释困难,可以使用:
SingleR:基于参考数据集的自动注释
scCATCH:自动匹配marker到细胞类型
CellTypist:机器学习注释工具

Step 8: 高级可视化

# 1. FeaturePlot: 基因表达图
FeaturePlot(pbmc, features = c("MS4A1", "CD3D"))

# 2. VlnPlot: 小提琴图
VlnPlot(pbmc, features = c("MS4A1", "CD3D"), pt.size = 0.1)

# 3. RidgePlot: 山脊图
RidgePlot(pbmc, features = c("MS4A1", "CD3D"))

# 4. Heatmap: marker热图
top10 <- pbmc.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC)
DoHeatmap(pbmc, features = top10$gene) + NoLegend()

📌 发表级图表建议

  • Figure 1:QC violin plot + UMAP聚类图
  • Figure 2:Marker基因热图 + Dot plot
  • Figure 3:FeaturePlot展示关键基因
  • • 使用 ggsave() 保存高分辨率图片

📝 完整工作流代码总结

# 一键运行完整流程
library(Seurat)

# 1. 读取数据
data <- Read10X("data/dir")
pbmc <- CreateSeuratObject(data)

# 2. 质控
pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, "^MT-")
pbmc <- subset(pbmc, subset = percent.mt < 5)

# 3. 标准化 + HVG
pbmc <- SCTransform(pbmc)

# 4. 降维
pbmc <- RunPCA(pbmc)
pbmc <- RunUMAP(pbmc, dims = 1:20)

# 5. 聚类
pbmc <- FindNeighbors(pbmc, dims = 1:20)
pbmc <- FindClusters(pbmc)

# 6. 可视化
DimPlot(pbmc, reduction = "umap", label = TRUE)