02使用 MSigDB 获取基因集

通过 msigdbr 按物种、collection 和 subcollection 获取 MSigDB 基因集,并整理为统计表、TERM2GENE 或命名列表。

2026-04-06
MSigDBGene SetsmsigdbrEnrichment AnalysisR
本章目录 · 9

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 后,至少检查:

  1. 物种是否与表达矩阵或排序基因列表一致;
  2. 基因标识符类型是否一致;
  3. collection 与 subcollection 是否真的回答当前问题;
  4. 数据库版本是否已记录;
  5. 是否存在重复的 gene set–gene 对;
  6. gene set 是否过小、过大或彼此高度重叠;
  7. 富集结果中的关键 gene set 是否有可解释的来源和定义。

msigdbr 解决的是获取和整理问题,不负责替研究问题选择正确的 gene sets。真正的分析边界仍然由 collection 的含义、输入基因的背景集合和后续富集方法共同决定。