2026版单细胞测序scRNA-seq入门实战(十六):AUCell基因集活性分析——给每个细胞的“基因程序”打分

本节概览:

  • AUCell简介:了解AUCell的核心思想及其与常规差异/富集分析的本质区别。
  • 为什么单细胞需要AUCell:解析单细胞数据稀疏性背景下基因集活性评分的独特价值。
  • 数据准备:从Seurat对象出发,准备表达矩阵与自定义基因集。
  • 核心分析:构建基因排序 → 计算AUC分数两步流程。
  • 结果可视化:使用Seurat原生VlnPlotFeaturePlot展示基因集活性。
  • 结果解读:如何从AUC分数中识别细胞类型特异激活的基因程序。

在前几节中,我们完成了细胞注释、差异分析和功能富集,回答了“细胞是什么”“差异基因有哪些”等问题。但在实际研究中,常遇到更具体的需求:“某个基因集在哪些细胞中活跃?”

AUCell 通过在每个细胞内对基因独立排序,评估目标基因集在排序列表中的富集位置,为每个细胞计算一个活性分数,从而解决该问题。

本文将从已注释的Seurat对象出发,使用纯R语言完成AUCell分析的完整流程,并直接用Seurat内置的VlnPlotFeaturePlot 进行可视化。

一、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填补了“如何评估基因集在单个细胞中的活性” 这一分析空白。它直接回答“这个基因程序在哪些细胞中被激活” 这一核心生物学问题。

这里是两栖生物手册,中科院生物医学博士,持续记录生物医学实验和生物信息学笔记,干湿结合两不误~正努力成为最贴心负责的生信数据分析者和实验技术分享者,欢迎大家关注~

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容