跳转至

865. 单细胞学习路线

一句话概述:单细胞分析 = 把组织里的细胞一个个分开来看——传统bulk RNA-seq看到的是几千个细胞的"平均值",单细胞看到的是每个细胞的"个性"。

核心知识点速查表

阶段内容工具时长
基础scRNA-seq标准分析Seurat/Scanpy3-4周
进阶高级分析(轨迹/通信)Monocle/CellChat2-3周
高级多模态+空间Signac/Squidpy3-4周
前沿大模型+集成分析scGPT/scVI2-3周

一、学习路线详解

# === 单细胞学习路线(10-12周) ===

# 第1-2周: 单细胞基础概念
必学:
  - 10x Genomics Chromium原理(液滴法)
  - UMI(唯一分子标识符)的作用
  - Cell Ranger流程: FASTQ → Count矩阵
  - 质控指标: nFeature/nCount/percent.mt
推荐资源:
  - 10x Genomics官方教程视频
  - Hemberg Lab单细胞教程

# 第3-4周: 标准分析流程(Seurat/Scanpy)
Seurat(R):
  - CreateSeuratObject → QC → 标准化
  - FindVariableFeatures → ScaleData → PCA
  - FindNeighbors → FindClusters → UMAP
  - FindAllMarkers → 细胞类型注释
Scanpy(Python):
  - 与Seurat对应的Python流程
  - pp.filter/normalize → pp.pca
  - pp.neighbors → tl.leiden → tl.umap
  - tl.rank_genes_groups → 注释

# 第5-6周: 细胞类型注释策略
  - 手动注释: 用Marker基因
  - 自动注释: SingleR/scType/CellTypist
  - 参考映射: Azimuth(PBMC/肺/肾等)
  - 多数据集整合: Harmony/Seurat CCA

# 第7-8周: 高级分析
  - 拟时序分析: Monocle3(发育轨迹)
  - 细胞通信: CellChat/CellPhoneDB
  - 差异表达: FindMarkers(单细胞DE)
  - 基因调控网络: SCENIC(转录因子推断)
  - RNA velocity: scVelo(方向推断)

# 第9-10周: 多模态分析
  - CITE-seq: RNA + 蛋白(Seurat WNN)
  - Multiome: RNA + ATAC(Signac)
  - 空间转录组: Squidpy/Giotto
  - 数据整合: scVI/scANVI

# 第11-12周: 前沿方向
  - 基础模型: scGPT/Geneformer
  - 大规模集成: CELLxGENE Atlas
  - 扰动分析: Perturb-seq
  - 临床应用: 肿瘤异质性分析

二、Seurat标准流程速览

# === Seurat v5 标准分析流程 ===
library(Seurat)                        # 加载Seurat

# 1. 读取数据
data <- Read10X(data.dir = "filtered_feature_bc_matrix/")  # 读取10x数据
obj <- CreateSeuratObject(counts = data,  # 创建对象
    min.cells = 3,                     # 基因至少在3个细胞中表达
    min.features = 200)                # 细胞至少有200个基因

# 2. 质控
obj[["percent.mt"]] <- PercentageFeatureSet(obj, pattern = "^MT-")  # 线粒体比例
obj <- subset(obj,                     # 过滤
    subset = nFeature_RNA > 200 &      # >200基因
             nFeature_RNA < 5000 &     # <5000基因(去双细胞)
             percent.mt < 20)          # 线粒体<20%

# 3. 标准化 + 高变基因 + 缩放
obj <- NormalizeData(obj)              # LogNormalize
obj <- FindVariableFeatures(obj, nfeatures = 2000)  # 2000高变基因
obj <- ScaleData(obj)                  # Z-score缩放

# 4. 降维
obj <- RunPCA(obj, npcs = 50)          # PCA降维
ElbowPlot(obj)                         # 选择PC数

# 5. 聚类
obj <- FindNeighbors(obj, dims = 1:30) # KNN图(用前30个PC)
obj <- FindClusters(obj, resolution = 0.5)  # Leiden聚类

# 6. 可视化
obj <- RunUMAP(obj, dims = 1:30)       # UMAP
DimPlot(obj, label = TRUE)             # 画UMAP

# 7. 找Marker基因
markers <- FindAllMarkers(obj,         # 找每个cluster的Marker
    only.pos = TRUE,                   # 只看上调
    min.pct = 0.25,                    # 至少25%细胞表达
    logfc.threshold = 0.25)            # logFC>0.25

三、Scanpy标准流程速览

# === Scanpy标准分析流程 ===
import scanpy as sc                    # 加载Scanpy

# 1. 读取数据
adata = sc.read_10x_mtx("filtered_feature_bc_matrix/")  # 读取10x

# 2. 质控
sc.pp.filter_cells(adata, min_genes=200)     # 细胞>200基因
sc.pp.filter_genes(adata, min_cells=3)       # 基因>3细胞
adata.var["mt"] = adata.var_names.str.startswith("MT-")  # 线粒体
sc.pp.calculate_qc_metrics(adata, qc_vars=["mt"], inplace=True)
adata = adata[adata.obs.pct_counts_mt < 20]  # 线粒体<20%

# 3. 标准化
sc.pp.normalize_total(adata, target_sum=1e4)  # 标准化到10000
sc.pp.log1p(adata)                            # 对数转换
sc.pp.highly_variable_genes(adata, n_top_genes=2000)  # 高变基因

# 4. 降维+聚类
sc.pp.pca(adata, n_comps=50)                  # PCA
sc.pp.neighbors(adata, n_pcs=30)              # KNN图
sc.tl.leiden(adata, resolution=0.5)           # Leiden聚类
sc.tl.umap(adata)                             # UMAP

# 5. 可视化+注释
sc.pl.umap(adata, color="leiden")             # UMAP图
sc.tl.rank_genes_groups(adata, "leiden")      # 差异基因
sc.pl.rank_genes_groups(adata, n_genes=10)    # 前10基因

四、面试常考点

# === 单细胞面试高频问题 ===

qa = {
    "Q: 怎么判断一个cluster是真的还是过聚类?": """
    1. 看Marker基因是否有生物学意义
    2. 调整resolution参数
    3. clustree包看不同分辨率的稳定性
    4. 两个cluster的DE基因太少可能是过聚类
    """,

    "Q: 怎么处理批次效应?": """
    方法选择:
    - Harmony: 快速,适合大数据集
    - Seurat CCA/RPCA: Seurat内置
    - scVI: 深度学习方法,最灵活
    - BBKNN: 基于邻居图的校正
    注意: 不要过度校正,消除生物学差异
    """,

    "Q: doublet怎么检测和去除?": """
    工具: DoubletFinder(Seurat) / Scrublet(Scanpy)
    原理: 模拟doublet,看哪些细胞与模拟doublet相似
    经验: 10x数据doublet率约 0.8% × (每千细胞)
    """,

    "Q: 为什么用UMAP而不是t-SNE?": """
    UMAP保留全局结构(远距离关系),t-SNE只保留局部
    UMAP速度更快
    UMAP可以用于新数据映射
    两者都只是可视化工具,聚类不应基于UMAP坐标
    """
}

常见报错与解决

报错信息原因解决方法
Memory error数据太大用backed模式或RAPIDS-singlecell
No variable features标准化前调用了HVG先Normalize再FindVariableFeatures
Cluster too many/fewresolution不合适调整resolution(0.1-2.0)
Integration失败样本间差异太大试不同整合方法(Harmony/scVI)
Marker基因不明确细胞类型混杂提高resolution或subset分析

速查表

# 单细胞分析工具对照
Seurat(R)          ↔  Scanpy(Python)
CreateSeuratObject ↔  sc.read_10x_mtx
NormalizeData      ↔  sc.pp.normalize_total
FindVariableFeatures ↔ sc.pp.highly_variable_genes
RunPCA             ↔  sc.pp.pca
FindClusters       ↔  sc.tl.leiden
RunUMAP            ↔  sc.tl.umap
FindAllMarkers     ↔  sc.tl.rank_genes_groups

# 高级分析工具
轨迹分析:   Monocle3 / PAGA
细胞通信:   CellChat / CellPhoneDB
基因调控:   SCENIC / pySCENIC
RNA velocity: scVelo
多模态:     Seurat WNN / muon
空间:       Squidpy / Giotto
注释:       SingleR / CellTypist / Azimuth

# 学习资源
Seurat: satijalab.org/seurat
Scanpy: scanpy-tutorials.readthedocs.io
单细胞最佳实践: www.sc-best-practices.org
数据: CELLxGENE / HCA数据门户