单细胞RNA测序(scRNA-seq)分析完整教程
目录
简介
单细胞RNA测序(scRNA-seq)能够在单个细胞水平上测量基因表达,揭示细胞异质性和发现新的细胞类型。本教程使用Seurat包分析PBMC(外周血单核细胞)数据。
核心概念
- 表达矩阵:行是基因,列是细胞,值是基因在细胞中的表达量
- 质量控制:过滤低质量细胞和低表达基因
- 降维:从数万个基因降到几十个主成分,再到2D可视化
- 聚类:将相似的细胞分组,通常对应不同的细胞类型
- 标记基因:每种细胞类型特异性表达的基因
环境准备
安装和加载必要的包
1 | # 检查并安装multtest包(用于多重检验) |
为什么需要这些包?
Seurat
:提供完整的单细胞分析流程dplyr
:简化数据操作,使代码更易读patchwork
:方便地组合多个图形进行比较R.utils
:处理压缩文件
清空工作环境
1 | rm(list = ls()) |
作用:清除所有已存在的变量,确保分析环境干净,避免变量冲突。
数据加载
下载示例数据
1 | download.file('https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz','my.pbmc.gz') |
数据说明:
- 10X Genomics的PBMC 3k数据集
- 包含约3000个外周血单核细胞
- 已经过初步过滤的数据
读取10X数据
1 | pbmc.data <- Read10X(data.dir = "filtered_gene_bc_matrices/hg19/") |
函数功能:
- 读取10X Genomics格式的数据
- 返回稀疏矩阵(节省内存)
- 矩阵维度:基因 × 细胞
创建Seurat对象
1 | pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200) |
参数解释:
counts
:原始的基因表达计数矩阵project
:项目名称,用于标识数据来源min.cells = 3
:基因至少在3个细胞中表达才保留min.features = 200
:细胞至少表达200个基因才保留
生物学意义:
- 过滤掉极低表达的基因(可能是技术噪音)
- 过滤掉基因数过少的细胞(可能是空液滴或死细胞)
查看数据基本信息
1 | pbmc |
导出表达矩阵(可选)
1 | # Seurat v5的正确写法(v4使用@counts) |
注意:Seurat v5改变了数据访问方式,使用$
代替@
质量控制
计算线粒体基因百分比
1 | pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-") |
代码解析:
pbmc[["percent.mt"]]
:在metadata中创建新列PercentageFeatureSet()
:计算特定基因集的表达百分比pattern = "^MT-"
:正则表达式,匹配以"MT-"开头的基因
生物学原理:
- 健康细胞:线粒体基因表达比例低(<5-10%)
- 受损/死亡细胞:线粒体基因表达比例高
- 原因:细胞膜破损时,胞质mRNA流失,但线粒体mRNA相对保留
注意事项:
- 小鼠数据使用
pattern = "^mt-"
(小写) - 不同组织的阈值可能不同
查看细胞元数据
1 | head(pbmc@meta.data, 5) |
显示每个细胞的:
orig.ident
:样本来源nCount_RNA
:总RNA分子数nFeature_RNA
:检测到的基因数percent.mt
:线粒体基因百分比
质控指标可视化
1 | VlnPlot(pbmc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3) |
小提琴图解读:
nFeature_RNA
:基因数分布,识别双细胞(异常高)或低质量细胞(异常低)nCount_RNA
:总分子数分布,反映测序深度percent.mt
:线粒体百分比,高值提示细胞损伤
特征相关性分析
1 | plot1 <- FeatureScatter(pbmc, feature1 = "nCount_RNA", feature2 = "percent.mt") |
散点图意义:
- 图1:分子数vs线粒体百分比,识别异常细胞
- 图2:分子数vs基因数,应呈正相关,偏离者可能是双细胞
过滤低质量细胞
1 | pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5) |
过滤标准:
nFeature_RNA > 200
:去除基因数过少的细胞(空液滴)nFeature_RNA < 2500
:去除基因数过多的细胞(双细胞)percent.mt < 5
:去除线粒体含量高的细胞(死细胞)
如何确定阈值?
- 观察分布图,找到明显的异常值
- 参考文献中类似数据的阈值
- 根据具体实验调整
数据标准化
1 | pbmc <- NormalizeData(pbmc, normalization.method = "LogNormalize", scale.factor = 10000) |
为什么需要标准化?
不同细胞的RNA总量差异原因:
- 细胞大小不同
- 细胞周期阶段不同
- 技术偏差(捕获效率)
LogNormalize方法
步骤1:CPM标准化
1 | 标准化值 = (基因计数 / 细胞总计数) × scale.factor |
步骤2:对数转换
1 | 最终值 = log(标准化值 + 1) |
计算示例
假设两个细胞:
细胞 | 基因X原始计数 | 细胞总RNA | 标准化计算 | 结果 |
---|---|---|---|---|
细胞A(大) | 100 | 50,000 | (100/50,000)×10,000=20 | log(21)=3.04 |
细胞B(小) | 20 | 10,000 | (20/10,000)×10,000=20 | log(21)=3.04 |
标准化后表达值相同,消除了细胞大小的影响!
参数说明:
scale.factor = 10000
:相当于CPM(counts per ten thousand)log1p
转换:稳定方差,使数据更接近正态分布
特征选择
寻找高变基因
1 | pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000) |
什么是高变基因?
高变基因在不同细胞间表达差异大,它们:
- 能够区分不同细胞类型
- 包含最多的生物学信息
- 不是"管家基因"(在所有细胞中稳定表达)
VST方法原理
-
计算均值-方差关系
- 高表达基因往往有高方差(技术噪音)
- 建立模型预测期望方差
-
标准化方差
1
标准化方差 = (观察方差 - 预期方差) / 预期方差
-
选择top 2000基因
查看高变基因
1 | # 前10个高变基因 |
典型的高变基因包括:
- 免疫球蛋白基因(IGLC2, IGKC)
- HLA基因(抗原呈递)
- 细胞类型标记基因
可视化高变基因
1 | # 基础散点图 |
图形解读:
- X轴:平均表达量
- Y轴:标准化方差
- 红点:被选中的2000个高变基因
- 标签:前10个最高变基因
数据缩放
1 | pbmc <- ScaleData(pbmc, features = rownames(pbmc)) |
什么是ScaleData?
对每个基因进行Z-score标准化:
1 | 缩放值 = (表达值 - 基因均值) / 基因标准差 |
结果:每个基因均值=0,标准差=1
为什么要缩放?
-
消除量级差异
- 基因A:表达范围1-10
- 基因B:表达范围1000-10000
- 不缩放,基因B会主导分析
-
PCA的要求
- PCA对方差敏感
- 需要所有变量在同一尺度
-
可视化需要
- 热图等需要标准化数据
注意:features = rownames(pbmc)
缩放所有基因,耗时较长。通常只缩放高变基因即可。
降维分析
主成分分析(PCA)
1 | pbmc <- RunPCA(pbmc, features = VariableFeatures(object = pbmc)) |
PCA原理
将高维数据(2000个基因)投射到低维空间(50个主成分):
- 每个PC是基因的线性组合
- PC1解释最多的变异
- PC之间相互正交
生物学解释
每个PC通常代表特定生物学过程:
- PC1:常区分髓系vs淋巴系
- PC2:常区分T细胞vs B细胞
- PC3-5:细胞状态、细胞周期等
查看PCA结果
1 | # 简要信息 |
确定使用多少个PC
方法1:ElbowPlot(推荐)
1 | ElbowPlot(pbmc) |
解读:
- 显示每个PC解释的变异量
- 找"肘部":曲线明显变平的点
- 通常选择10-30个PC
方法2:JackStraw分析(可选)
1 | pbmc <- JackStraw(pbmc, num.replicate = 100) |
原理:统计检验每个PC的显著性
缺点:计算耗时
细胞聚类
构建细胞邻近图
1 | pbmc <- FindNeighbors(pbmc, dims = 1:10) |
功能:
- 基于前10个PC计算细胞间距离
- 构建KNN(K近邻)图
- 构建SNN(共享近邻)图
聚类分析
1 | pbmc <- FindClusters(pbmc, resolution = 0.5) |
算法:Louvain算法(社区检测)
参数:
resolution
:控制聚类粒度- 低值(0.1-0.5):少而大的聚类
- 高值(0.5-2):多而小的聚类
输出信息解读:
1 | Number of communities: 9 |
表示识别出9个细胞群
聚类可视化
UMAP降维
1 | pbmc <- RunUMAP(pbmc, dims = 1:10) |
UMAP特点:
- 非线性降维
- 保留局部和全局结构
- 更好地分离不同细胞群
t-SNE降维
1 | pbmc <- RunTSNE(pbmc, dims = 1:10) |
t-SNE特点:
- 非线性降维
- 强调局部结构
- 聚类边界更清晰
UMAP vs t-SNE:
- UMAP更快,保留更多全局结构
- t-SNE聚类分离更明显
- 两者互补,可同时使用
标记基因鉴定
特定聚类的标记基因
1 | cluster5.markers <- FindMarkers(pbmc, ident.1 = 5, ident.2 = c(0, 3), min.pct = 0.25) |
比较聚类5与聚类0、3的差异基因
所有聚类的标记基因
1 | pbmc.markers <- FindAllMarkers(pbmc, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25) |
参数说明:
only.pos = TRUE
:只找高表达基因min.pct = 0.25
:基因至少在25%的细胞中表达logfc.threshold = 0.25
:log2倍数变化阈值
查看每个聚类的top标记基因
1 | pbmc.markers %>% |
结果解读:
p_val
:原始p值avg_log2FC
:平均log2倍数变化pct.1
:聚类内表达比例pct.2
:其他聚类表达比例p_val_adj
:校正后p值
标记基因可视化
小提琴图
1 | VlnPlot(pbmc, features = c("NKG7", "PF4"), slot = "counts", log = TRUE) |
显示基因在各聚类的表达分布
特征图
1 | FeaturePlot(pbmc, features = c("MS4A1", "GNLY", "CD3E", "CD14", "FCER1A", "FCGR3A", "LYZ")) |
在UMAP上显示基因表达
热图
1 | top10 <- pbmc.markers %>% |
显示各聚类的标记基因表达模式
细胞类型注释
基于标记基因注释
1 | new.cluster.ids <- c("Naive CD4 T", "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", |
常见PBMC细胞类型标记
细胞类型 | 标记基因 |
---|---|
T细胞 | CD3D, CD3E |
CD4+ T | IL7R, CCR7 |
CD8+ T | CD8A |
B细胞 | CD79A, MS4A1 (CD20) |
NK细胞 | GNLY, NKG7, GZMB |
单核细胞 | CD14, LYZ, FCGR3A |
树突细胞 | FCER1A, CST3 |
血小板 | PF4, PPBP |
可视化注释结果
1 | DimPlot(pbmc, reduction = "umap", label = TRUE, pt.size = 0.5) + NoLegend() |
显示带细胞类型标签的UMAP图
保存结果
1 | saveRDS(pbmc, 'pbmc.rds') |
保存完整的Seurat对象,包含所有分析结果
重新加载
1 | pbmc <- readRDS('pbmc.rds') |
总结
单细胞RNA测序分析的标准流程:
- 数据准备:加载数据,创建Seurat对象
- 质量控制:过滤低质量细胞
- 数据处理:标准化、特征选择、缩放
- 降维分析:PCA、UMAP/t-SNE
- 细胞聚类:识别细胞群
- 生物学解释:标记基因、细胞类型注释
重要提示
- 参数选择:没有通用的最佳参数,需根据数据特点调整
- 生物学验证:结合已知标记基因验证结果
- 迭代优化:可能需要多次调整参数获得最佳结果
- 版本兼容:注意Seurat版本差异(v4 vs v5)
扩展学习
- 批次效应校正:多样本整合分析
- 轨迹推断:细胞发育轨迹分析
- 细胞通讯:配受体相互作用分析
- 空间转录组:结合空间信息的分析
参考资源
__END__