MSigDB(Molecular Signatures Database)收集了用于富集分析的基因集。一个 gene set 通常代表某条通路、某种生物过程、实验扰动产生的表达 signature,或一组具有共同调控特征的基因。
R 包 msigdbr 将 MSigDB 内容整理成长表,可以按物种、collection 和 subcollection 选择需要的部分,再交给富集分析函数使用。
install.packages("msigdbr")
library(msigdbr)
先明确要取哪一类基因集
MSigDB 不是一张没有层次的基因列表。使用前至少需要确定三个条件:
| 条件 | 回答的问题 | 示例 |
|---|---|---|
species |
基因应映射到哪个物种 | "Homo sapiens", "Mus musculus" |
collection |
使用哪个主集合 | "H", "C2" |
subcollection |
是否只取主集合中的特定子集合 | "CGP" |
不要先下载所有内容再随意挑一个名字。collection 的来源、构建方式和粒度不同,会影响富集结果能够回答什么问题。
获取一个物种的全部基因集
获取小鼠基因集:
all_gene_sets <- msigdbr(species = "Mus musculus")
head(all_gene_sets)
返回值是一张长表:同一个 gene set 会占据多行,每行对应它与一个基因的关系。它不是“每个基因集一行”的宽表,因此行数不能直接理解为基因集数量。
先查看表的结构和规模:
dim(all_gene_sets)
names(all_gene_sets)
object.size(all_gene_sets)
需要快速检查列类型与缺失情况时,可以使用 skimr:
library(skimr)
skim(all_gene_sets)
获取 Hallmark gene sets
Hallmark collection 使用代码 H:
hallmark_gene_sets <- msigdbr(
species = "Mus musculus",
collection = "H"
)
head(hallmark_gene_sets)
Hallmark gene sets 对多个相关 signature 进行整合,旨在表达较明确的生物状态或过程。它们数量相对集中,适合作为初步通路层面的概览,但不能替代针对具体研究问题选择更细的基因集。
统计每个 gene set 包含多少个基因:
table(hallmark_gene_sets$gs_name)
若同一 gene set 与 gene symbol 的组合可能重复,可以在计数前明确去重:
library(dplyr)
hallmark_sizes <- hallmark_gene_sets |>
distinct(gs_name, gene_symbol) |>
count(gs_name, name = "n_genes", sort = TRUE)
获取 C2:CGP
C2 是 curated gene sets,其中 CGP 收集 chemical and genetic perturbations 相关 signature:
cgp_gene_sets <- msigdbr(
species = "Mus musculus",
collection = "C2",
subcollection = "CGP"
)
head(cgp_gene_sets)
这类集合通常比 Hallmark 更具体,也更容易出现名称相似、基因集重叠或实验背景差异。解释富集结果时,应继续查看 gene set 的来源和描述,不能只根据名称推断机制。
查看可用物种与集合
不确定参数值时,先让包列出当前可用选项:
msigdbr_species()
msigdbr_collections()
检查已经取得的数据中有哪些 collection 和 subcollection:
table(all_gene_sets$gs_collection)
table(all_gene_sets$gs_subcollection, useNA = "ifany")
数据库内容会随发布版本变化。保存分析结果时,同时记录数据表中的版本信息:
unique(all_gene_sets$db_version)
只记录 R 包版本并不足以说明使用了哪一版 MSigDB;包版本、数据库版本和物种映射都是复现分析所需的信息。
整理为分析函数需要的格式
不同富集工具接收的输入结构不同。msigdbr() 返回的长表可以整理为常见的两种形式。
两列 TERM2GENE 表
需要“基因集—基因”对应表时:
term2gene <- hallmark_gene_sets |>
select(gs_name, gene_symbol) |>
distinct()
这张表的一行代表一个 membership,可以直接检查重复、缺失和每个集合的大小。
命名 list
需要“每个基因集对应一个基因向量”时:
gene_sets <- split(
hallmark_gene_sets$gene_symbol,
hallmark_gene_sets$gs_name
)
gene_sets <- lapply(gene_sets, unique)
length(gene_sets)
head(names(gene_sets))
lengths(gene_sets)
整理格式前先确认下游函数需要 gene symbol、Entrez ID 还是 Ensembl ID。ID 类型不匹配会造成大量基因无法进入分析,即使代码本身没有报错。
使用前检查
取到 gene sets 后,至少检查:
- 物种是否与表达矩阵或排序基因列表一致;
- 基因标识符类型是否一致;
- collection 与 subcollection 是否真的回答当前问题;
- 数据库版本是否已记录;
- 是否存在重复的 gene set–gene 对;
- gene set 是否过小、过大或彼此高度重叠;
- 富集结果中的关键 gene set 是否有可解释的来源和定义。
msigdbr 解决的是获取和整理问题,不负责替研究问题选择正确的 gene sets。真正的分析边界仍然由 collection 的含义、输入基因的背景集合和后续富集方法共同决定。