GSEA、GSVA 与 ssGSEA

· Analysis Notes

GSEA、GSVA 与 ssGSEA

摘要: 三种互补的基因集富集方法:GSEA 比较两种条件,GSVA 将表达数据转换为跨样本的通路评分,ssGSEA 为每个独立样本计算通路评分。请根据您的实验设计和研究问题进行选择。


什么是基因集富集分析?

基因集方法不分析单个基因,而是检验相关基因的集合(通路、GO 术语)是否表现出协同变化。这可以:

  • 提高统计功效(生物学信号 > 单个基因噪声)
  • 提供机制性见解(通路层面,而非仅仅是基因列表)
  • 实现在通路层面的跨研究比较

GSEA 概念图


方法比较

方法 输入要求 输出 使用场景 是否监督?
GSEA 排序的基因列表 + 2 个组 NES、p 值、FDR 比较不同条件 是
GSVA 表达矩阵(无需分组) 每个样本的通路评分 无监督聚类 否
ssGSEA 表达矩阵(无需分组) 每个样本的富集评分 样本层面的特征分析 否

快速决策指南

您是否有两个组需要比较?
├─ 是 → 使用 GSEA
└─ 否 → 您是否想进行基于通路的聚类?
    ├─ 是 → 使用 GSVA
    └─ 否 → 需要每个样本的评分? → 使用 ssGSEA

方法一:GSEA(基因集富集分析)

目的

检验一个预定义的基因集是否在比较两种条件的排序基因列表的顶部或底部富集。

何时使用

  • ✅ 两组间的差异表达分析(疾病 vs. 对照,处理 vs. 未处理)
  • ✅ 您有足够的重复样本进行统计检验
  • ✅ 希望识别驱动差异的通路

输入要求

  1. 标准化表达矩阵
  2. 表型标签(A 组 vs. B 组)
  3. 基因集(例如 MSigDB、GO、KEGG)

在 R 中运行 GSEA

library(fgsea)
library(msigdbr)

# 1. 准备排序的基因列表(来自 DESeq2、edgeR 等)
res <- results(dds, contrast = c("condition", "treated", "control"))
gene_ranks <- res$log2FoldChange
names(gene_ranks) <- rownames(res)
gene_ranks <- sort(gene_ranks, decreasing = TRUE)

# 2. 加载基因集(来自 MSigDB 的 Hallmark 通路)
hallmark <- msigdbr(species = "Homo sapiens", category = "H")
pathways <- split(hallmark$gene_symbol, hallmark$gs_name)

# 3. 运行 GSEA
fgsea_res <- fgsea(
  pathways = pathways,
  stats = gene_ranks,
  minSize = 15,
  maxSize = 500,
  nperm = 10000
)

# 4. 查看显著富集的通路
fgsea_res %>%
  filter(padj < 0.05) %>%
  arrange(NES) %>%
  select(pathway, NES, padj, size)

结果解读

指标 含义
NES > 0 基因集在 A 组富集(上调)
NES < 0 基因集在 B 组富集(下调)
** NES
padj < 0.05 具有统计学显著性

示例:
NES = 2.3, padj = 0.001 对应 "HALLMARK_INFLAMMATORY_RESPONSE" → 处理样本中炎症基因强烈上调。


方法二:GSVA(基因集变异分析)

目的

将基因表达数据转换为通路层面的评分,用于每个样本,从而支持无监督分析和样本聚类。

何时使用

  • ✅ 没有预定义的分组(探索性分析)
  • ✅ 希望通过通路活性对样本进行聚类
  • ✅ 将通路与连续的临床变量进行关联分析

在 R 中运行 GSVA

library(GSVA)
library(limma)

# 1. 准备表达矩阵(log2 TPM/CPM)
expr_matrix <- assay(vst(dds))  # 方差稳定化计数

# 2. 加载基因集
pathways <- getGmt("c2.cp.kegg.v7.5.symbols.gmt")  # KEGG 通路

# 3. 运行 GSVA
gsva_scores <- gsva(
  expr_matrix,
  pathways,
  method = "gsva",
  kcdf = "Gaussian",  # 对于计数数据使用 "Poisson"
  min.sz = 10,
  max.sz = 500,
  verbose = TRUE
)

# 4. 差异通路分析
design <- model.matrix(~ condition, data = colData(dds))
fit <- lmFit(gsva_scores, design)
fit <- eBayes(fit)
topTable(fit, coef = "conditiontreated", number = 10)

# 5. 通路评分热图
pheatmap(gsva_scores, 
         annotation_col = data.frame(condition = colData(dds)$condition),
         scale = "row")

输出解读

  • 正评分: 通路活性高于样本平均水平
  • 负评分: 通路活性低于样本平均水平
  • 用途: 样本聚类、与元数据关联

方法三:ssGSEA(单样本 GSEA)

目的

为每个基因集计算单个样本内的富集评分,适用于单样本预测或异质性数据集。

何时使用

  • ✅ 单样本或样本量非常小
  • ✅ 样本特异性的通路特征分析(例如,肿瘤亚型分型)
  • ✅ 构建基于通路的分类器

在 R 中运行 ssGSEA

library(GSVA)

# 1. 准备表达矩阵
expr_matrix <- assay(vst(dds))

# 2. 运行 ssGSEA
ssgsea_scores <- gsva(
  expr_matrix,
  pathways,
  method = "ssgsea",  # 与 GSVA 的关键区别
  ssgsea.norm = TRUE,  # 标准化评分
  verbose = TRUE
)

# 3. 示例:对新样本评分
new_sample <- read.csv("new_sample.csv")
new_scores <- gsva(
  as.matrix(new_sample),
  pathways,
  method = "ssgsea"
)

# 4. 与参考队列比较
reference_mean <- rowMeans(ssgsea_scores)
deviation <- new_scores - reference_mean

ssGSEA 与 GSVA 对比

特性 GSVA ssGSEA
算法 核平滑 样本内排序
标准化 跨样本 样本内
最适合 组间比较 个体特征分析

其他方法

PLAGE(通路水平分析)

使用奇异值分解(SVD) 来概括基因集表达:

plage_scores <- gsva(
  expr_matrix,
  pathways,
  method = "plage"
)

最适合: 在保留通路结构的同时降低维度。

Z-score 方法

简单的标准化均值:

zscore_scores <- gsva(
  expr_matrix,
  pathways,
  method = "zscore"
)

最适合: 快速的探索性分析。


实用工作流程

步骤 1:选择基因集

来源 描述 规模
MSigDB Hallmark 50 个明确定义的生物学过程 经过人工整理,重叠最小
KEGG ~300 条通路 代谢 + 信号通路
GO 生物过程 ~7,000 个术语 全面但冗余
Reactome ~2,000 条通路 详细,层次化
# 通过 msigdbr 下载
library(msigdbr)

# Hallmark(推荐的起点)
hallmark <- msigdbr(species = "Homo sapiens", category = "H")

# KEGG
kegg <- msigdbr(species = "Homo sapiens", category = "C2", subcategory = "CP:KEGG")

# GO 生物过程
go_bp <- msigdbr(species = "Homo sapiens", category = "C5", subcategory = "GO:BP")

步骤 2:数据预处理

# 过滤低表达基因
keep <- rowSums(counts(dds) >= 10) >= 3
dds <- dds[keep,]

# 标准化
vsd <- vst(dds, blind = FALSE)  # 或使用 rlog()

步骤 3:运行分析

# 用于组间比较:GSEA
fgsea_res <- fgsea(pathways, gene_ranks)

# 用于无监督分析:GSVA
gsva_scores <- gsva(assay(vsd), pathways)

# 用于单样本分析:ssGSEA
ssgsea_scores <- gsva(assay(vsd), pathways, method = "ssgsea")

步骤 4:可视化

# GSEA 富集图
plotEnrichment(pathways[["HALLMARK_HYPOXIA"]], gene_ranks)

# GSVA 热图
pheatmap(gsva_scores, scale = "row", clustering_distance_rows = "correlation")

# 通路条形图
top_pathways <- fgsea_res %>% filter(padj < 0.05) %>% top_n(20, abs(NES))
ggplot(top_pathways, aes(x = reorder(pathway, NES), y = NES, fill = NES > 0)) +
  geom_col() +
  coord_flip() +
  labs(title = "Top Enriched Pathways")

故障排除

"GSEA 中没有显著富集的通路"

可能原因:

  • 效应量太小
  • 重复样本不足
  • 基因 ID 格式错误

解决方法:

# 检查基因 ID 转换
sum(names(gene_ranks) %in% unlist(pathways))  # 应 > 80%

# 为探索性分析放宽 FDR 阈值
filter(fgsea_res, pval < 0.05)

GSVA 评分全部接近零

原因: 表达数据未正确标准化
解决方法: 使用方差稳定化或 log2 转换后的数据,而非原始计数

大型基因集导致内存错误

解决方法:

# 减小基因集大小
filtered_pathways <- pathways[sapply(pathways, length) < 500]

# 或使用并行处理
gsva(..., parallel.sz = 4)

对比总结

选择 GSEA 如果:

  • 您有两个组和足够的重复样本
  • 希望识别驱动条件差异的通路
  • 需要进行统计显著性检验

选择 GSVA 如果:

  • 没有预定义分组的探索性分析
  • 希望通过通路活性对样本进行聚类
  • 将通路与连续变量进行关联分析

选择 ssGSEA 如果:

  • 单样本预测
  • 构建基于通路的分类器
  • 异质性数据集(例如,肿瘤样本)

资源


另请参阅:

GSEA Pathway Analysis