本节概览:
- AUCell简介:了解AUCell的核心思想及其与常规差异/富集分析的本质区别。
- 为什么单细胞需要AUCell:解析单细胞数据稀疏性背景下基因集活性评分的独特价值。
- 数据准备:从Seurat对象出发,准备表达矩阵与自定义基因集。
- 核心分析:构建基因排序 → 计算AUC分数两步流程。
-
结果可视化:使用Seurat原生
VlnPlot和FeaturePlot展示基因集活性。 - 结果解读:如何从AUC分数中识别细胞类型特异激活的基因程序。
在前几节中,我们完成了细胞注释、差异分析和功能富集,回答了“细胞是什么”“差异基因有哪些”等问题。但在实际研究中,常遇到更具体的需求:“某个基因集在哪些细胞中活跃?”
AUCell 通过在每个细胞内对基因独立排序,评估目标基因集在排序列表中的富集位置,为每个细胞计算一个活性分数,从而解决该问题。
本文将从已注释的Seurat对象出发,使用纯R语言完成AUCell分析的完整流程,并直接用Seurat内置的VlnPlot和FeaturePlot 进行可视化。
一、AUCell的核心思想
1.1 什么是“基因集活性”?
在单细胞数据中,我们关心的是:某个预定义的基因集合(如某个通路的全部基因、某个细胞类型的标志基因、某个转录因子的靶基因等)在单个细胞中是否整体高表达。
这与常规的“差异表达”不同——差异表达关心的是单个基因在不同细胞间的表达差异;而基因集活性关心的是一组基因在单个细胞内部的整体表达趋势。
1.2 AUCell的工作原理
AUCell的核心算法分为三步:
第一步:对每个细胞内部的基因进行排序
对于每个细胞,将所有基因按照表达量从高到低排序。这个排序完全在细胞内部进行,不涉及细胞间的比较。
第二步:评估基因集在排序列表中的位置
对于每个目标基因集(如“小胶质细胞标志基因”),检查该基因集中的基因在排序列表中的分布位置。如果这些基因集中出现在列表的前列(高表达区域),说明该基因集在该细胞中活跃。
第三步:计算恢复曲线下面积(AUC)
AUCell通过计算恢复曲线(recovery curve) 下的面积来量化这种富集程度。AUC值越高,代表该基因集在该细胞中的激活程度越高。
二、准备工作:安装与加载R包
2.1 安装AUCell
# AUCell安装
# 通过BiocManager安装
if (!requireNamespace("BiocManager", quietly = TRUE)) {
install.packages("BiocManager")
}
BiocManager::install("AUCell")
2.2 加载R包与数据
# 1. 加载R包
rm(list = ls())
library(Seurat)
library(ggplot2)
library(dplyr)
library(AUCell) # 核心包
# 2. 读取数据
scRNA <- readRDS("4_scRNA_celltype.rds")
# 查看细胞类型
table(scRNA$cell_type)
数据简介:该数据集包含小鼠中枢神经系统的多种细胞类型,包括神经元(Neuron)、星形胶质细胞(Astrocyte)、少突胶质前体细胞(OPC)、小胶质细胞(Microglia)等。
三、准备基因集
AUCell的输入之一是需要评估的基因集。我们可以直接定义自己关注的基因集,比如细胞类型标志基因:
# 自定义基因集
my_gene_sets <- list(
"Neuron_Markers" = c("Rbfox3", "Tubb3", "Stmn2", "Snap25", "Syp"),
"Astrocyte_Markers" = c("Aqp4", "Gfap", "Slc1a3", "Aldh1l1", "Agt"),
"Microglia_Markers" = c("Cx3cr1", "P2ry12", "Tmem119", "Cd68", "Aif1"),
"OPC_Markers" = c("Pdgfra", "Cspg4", "Olig2", "Sox10", "Nkx2-2")
)
# 查看基因集
names(my_gene_sets)
四、核心分析:AUCell两步流程
4.1 提取表达矩阵并构建基因排序
# 提取标准化表达矩阵
# 从Seurat对象提取log-normalized数据
expr_mat <- GetAssayData(scRNA, assay = "RNA", layer = "data")
# 确保矩阵格式:基因为行,细胞为列
dim(expr_mat)
# 构建基因排序(核心步骤1)
# AUCell_buildRankings 对每个细胞内部的基因进行排序
cells_rankings <- AUCell_buildRankings(
expr_mat,
plotStats = TRUE, # 显示排序统计信息
splitByBlocks = TRUE # 分块处理,节省内存
)
# 查看排序对象
cells_rankings


这一步做了什么?
- 对每个细胞,将所有基因按表达量从高到低排序
- 存储排序结果供后续使用
-
plotStats = TRUE会显示一个统计图,帮助评估数据质量
4.2 计算AUC分数
# 计算AUC分数(核心步骤2)
cells_AUC <- AUCell_calcAUC(
geneSets = my_gene_sets,
rankings = cells_rankings,
nCores = 1,
aucMaxRank = nrow(cells_rankings) * 0.1 # 使用前10%的基因
)
# 提取AUC矩阵(基因集 × 细胞)
auc_matrix <- getAUC(cells_AUC)
dim(auc_matrix) # 基因集数 × 细胞数
aucMaxRank参数说明:
- 默认使用排序列表中前5% 的基因来计算AUC
- 本教程设置为 前10%(
nrow(cells_rankings) * 0.1),可以根据你的生物学问题调整 - 如果基因集较小,可以提高此值以捕获更多信号;如果基因集较大,可以降低此值以增强特异性
4.3 将AUC分数添加到Seurat对象
为了方便直接使用Seurat的可视化函数,我们将AUC矩阵添加到metadata中:
# 将AUC分数添加到metadata
# 转置AUC矩阵(行为细胞,列为基因集)
AUC_matrix_t <- t(getAUC(cells_AUC))
# 添加为meta.data
scRNA <- AddMetaData(scRNA, metadata = as.data.frame(AUC_matrix_t))
# 检查新增的列
head(scRNA@meta.data)

现在,每个基因集的AUC分数都作为一列存在于 scRNA@meta.data 中,可以直接用于可视化。
五、结果可视化
5.1 小提琴图:展示基因集在不同细胞类型中的活性分布
使用Seurat自带的VlnPlot,直接在metadata列上绘图:
dir.create("AUCell")
setwd("AUCell")
# 小提琴图:各基因集在不同细胞类型中的AUC分布
# 直接使用VlnPlot,features为基因集名称,group.by为细胞类型
p1<-VlnPlot(scRNA,
features = names(my_gene_sets),
group.by = "cell_type",
ncol = 2, # 2列分面
pt.size = 0, # 不显示点(可选)
combine = TRUE) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggsave("AUCell_violin_plot.pdf", p1,width = 10, height = 6)

小提琴图解读:
- 每个基因集一个小提琴分面,横轴为细胞类型,纵轴为该基因集的AUC分数
-
预期结果:
Neuron_Markers应在神经元中AUC最高,Astrocyte_Markers应在星形胶质细胞中最高,以此类推 - 这直接验证了你的细胞类型注释的合理性
5.2 FeaturePlot:在UMAP上展示基因集活性
将AUC分数映射到UMAP空间,直观看到基因程序在组织中的分布:
# FeaturePlot展示单个基因集的活性
# 选择感兴趣的基因集(如小胶质细胞标志基因)
p2<-FeaturePlot(scRNA,
features = "Microglia_Markers",
order = TRUE,
cols = c("grey90", "red")) +
ggtitle("Microglia Marker Gene Set Activity")
ggsave("AUCell_FeaturePlot_Microglia.pdf", p2,width = 8, height = 6)
# 展示多个基因集
p3<-FeaturePlot(scRNA,
features = names(my_gene_sets),
order = TRUE,
cols = c("grey90", "red"),
ncol = 2)
ggsave("AUCell_FeaturePlot_all.pdf", p3,width = 10, height = 8)


FeaturePlot解读:
- 颜色越红,表示该基因集在该细胞中的活性越高
- 观察活性热点是否与特定细胞群重叠
六、结果解读与生物学意义
6.1 从小提琴图看基因集特异性
- 检查每个基因集的AUC分数是否在对应的细胞类型中最高
- 如果某个标志基因集的AUC分布在多种细胞类型中都很高,说明该基因程序可能不是完全特异的
6.2 从FeaturePlot看基因集的空间分布
- 某个基因集的AUC热点是否与特定细胞群重叠?
- 如果重叠,说明该基因程序在该细胞群中被特异激活
- 这可以帮助发现新的细胞亚群或功能状态
6.3 活性 vs 表达量:为什么不一样?
可能会发现:某个基因在细胞类型A中的表达量并不高,但其基因集的AUC分数却很高。这是完全正常的——因为AUC分数是基于一组基因的整体排名计算的,反映的是该基因程序的集体激活状态而非单个基因的丰度。
💡 重要提示:AUCell提供的是基因集水平的活性,而非单个基因的表达量。这对于理解细胞功能状态至关重要。
七、常见问题与注意事项
7.1 AUCell运行很慢怎么办?
- 减少基因数量:过滤低表达基因(在<3个细胞中表达的基因)
- 减少细胞数量:随机抽样500-1000个细胞进行探索性分析
-
设置
splitByBlocks = TRUE:分块处理,节省内存 -
使用
nCores参数:设置多核并行
7.2 基因集太大或太小怎么办?
- 太大(>5000基因):AUCell的富集信号可能被稀释,考虑使用更特异的基因集
- 太小(<10基因):统计效力不足,建议合并相关基因集或使用其他方法
7.3 Seurat v5兼容性
本教程使用 layer = "data" 来提取表达矩阵,兼容Seurat v5。
八、总结
至此,我们完成了从Seurat对象到AUCell基因集活性分析的完整流程:
| 步骤 | 函数/操作 | 输出 |
|---|---|---|
| 准备基因集 | 自定义列表 | 基因集列表 |
| 构建排序 | AUCell_buildRankings() |
排序对象 |
| 计算AUC | AUCell_calcAUC() |
AUC矩阵(基因集×细胞) |
| 添加metadata | AddMetaData() |
每个细胞都有AUC分数 |
| 小提琴图 | VlnPlot() |
基因集在细胞类型中的分布 |
| 空间分布 | FeaturePlot() |
基因集活性在UMAP上的分布 |
在单细胞研究中,AUCell填补了“如何评估基因集在单个细胞中的活性” 这一分析空白。它直接回答“这个基因程序在哪些细胞中被激活” 这一核心生物学问题。
这里是两栖生物手册,中科院生物医学博士,持续记录生物医学实验和生物信息学笔记,干湿结合两不误~正努力成为最贴心负责的生信数据分析者和实验技术分享者,欢迎大家关注~