865. 单细胞学习路线
一句话概述:单细胞分析 = 把组织里的细胞一个个分开来看——传统bulk RNA-seq看到的是几千个细胞的"平均值",单细胞看到的是每个细胞的"个性"。
核心知识点速查表
| 阶段 | 内容 | 工具 | 时长 |
|---|
| 基础 | scRNA-seq标准分析 | Seurat/Scanpy | 3-4周 |
| 进阶 | 高级分析(轨迹/通信) | Monocle/CellChat | 2-3周 |
| 高级 | 多模态+空间 | Signac/Squidpy | 3-4周 |
| 前沿 | 大模型+集成分析 | scGPT/scVI | 2-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/few | resolution不合适 | 调整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数据门户