news 2026/4/27 23:05:37

手把手教你用R和fgsea包,从差异基因列表到发表级GSEA图的保姆级教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用R和fgsea包,从差异基因列表到发表级GSEA图的保姆级教程

从差异基因到发表级GSEA图:R语言全流程实战指南

在转录组数据分析领域,基因集富集分析(GSEA)已成为揭示生物学意义的重要工具。与传统的差异基因分析不同,GSEA能够发现那些虽然单个基因变化不大但整体协调变化的通路,这对于理解复杂疾病的发病机制尤为重要。本文将带领您使用R语言中的fgsea包,从原始的差异基因列表出发,逐步完成基因标识转换、基因集获取、富集分析到可视化呈现的全过程,最终生成可直接用于学术发表的图表。

1. 准备工作与环境配置

1.1 安装必要R包

首先确保已安装以下关键R包,这些工具构成了GSEA分析的基础生态:

install.packages(c("fgsea", "msigdbr", "org.Hs.eg.db", "ggplot2", "dplyr"))

注意:如果遇到Bioconductor依赖问题,可先运行:

if (!require("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager::install("org.Hs.eg.db")

1.2 数据准备与加载

假设您已完成差异表达分析,获得包含基因符号(SYMBOL)和log2FC值的数据框。典型输入数据格式如下:

SYMBOLlogFCP.Value
TP532.11.2e-05
BRCA1-1.83.4e-04
.........

加载数据并检查结构:

library(tidyverse) diff_data <- read_csv("diff_genes.csv") # 替换为您的实际文件路径 head(diff_data)

2. 基因标识转换与数据预处理

2.1 SYMBOL到ENTREZID的转换

fgsea分析需要ENTREZID格式的基因标识,转换过程中需注意:

library(org.Hs.eg.db) # 执行转换并处理可能的重复或缺失 gene_mapping <- bitr(diff_data$SYMBOL, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db) %>% distinct(SYMBOL, .keep_all = TRUE) # 合并并清理数据 analysis_data <- diff_data %>% inner_join(gene_mapping, by = "SYMBOL") %>% filter(!is.na(ENTREZID)) %>% arrange(desc(logFC))

常见问题排查

  • 若转换率低于70%,检查基因命名是否为最新版本
  • 使用clusterProfiler::bitrdrop参数控制是否保留未匹配基因
  • 对于模式生物,需更换对应的OrgDb包(如org.Mm.eg.db)

2.2 构建fgsea输入格式

fgsea要求一个命名数值向量,其中:

  • 名称:ENTREZID
  • 值:排序指标(通常为logFC)
ranked_gene_list <- analysis_data$logFC names(ranked_gene_list) <- analysis_data$ENTREZID ranked_gene_list <- sort(ranked_gene_list, decreasing = TRUE)

重要提示:基因必须按所关注的生物学特征排序(如上调/下调程度),这是GSEA算法的核心假设。

3. 基因集获取与定制

3.1 使用msigdbr获取标准基因集

MSigDB数据库提供了多种高质量的基因集分类:

library(msigdbr) # 获取Hallmark基因集 hallmark_sets <- msigdbr(species = "Homo sapiens", category = "H") %>% split(x = .$entrez_gene, f = .$gs_name) # 获取KEGG通路 kegg_sets <- msigdbr(species = "Homo sapiens", category = "C2", subcategory = "KEGG") %>% split(x = .$entrez_gene, f = .$gs_name)

基因集类别选择指南

类别代码描述适用场景
HHallmark核心生物学过程
C2精选通路特定通路分析
C5GO术语功能注释
C7免疫特征免疫相关研究

3.2 自定义基因集构建

对于特定研究需求,可创建自定义基因集:

custom_sets <- list( "My_Pathway1" = c("1234", "5678", "9012"), # 使用ENTREZID "Metabolic_Cluster" = scan("metabolic_genes.txt", what = "") )

4. 执行GSEA分析与结果解读

4.1 运行fgsea核心分析

library(fgsea) gsea_results <- fgsea(pathways = hallmark_sets, stats = ranked_gene_list, minSize = 15, maxSize = 500, eps = 1e-10)

关键参数解析

  • minSize/maxSize:控制分析的基因集大小范围
  • eps:影响p值计算精度,值越小计算越精确但耗时增加
  • nproc:多线程加速,适用于大型基因集

4.2 结果筛选与解释

典型GSEA结果包含以下重要列:

列名含义判断标准
pathway基因集名称-
pval原始p值<0.05
padj校正后p值(FDR)<0.25
NES标准化富集分数>1或<-1
size基因集中匹配到的基因数量适中(15-500)
leadingEdge核心驱动基因列表关注高影响基因

筛选显著结果的两种方法:

# 方法1:基于统计显著性 sig_results <- gsea_results[padj < 0.25 & abs(NES) > 1, ] # 方法2:按NES排序取Top N top_results <- gsea_results[order(-abs(NES)), ][1:20, ]

5. 高级可视化技巧

5.1 发表级气泡图绘制

library(ggplot2) sig_results %>% mutate(Pathway = str_remove(pathway, "HALLMARK_")) %>% ggplot(aes(x = NES, y = reorder(Pathway, NES), color = -log10(padj), size = size)) + geom_point(alpha = 0.8) + scale_color_gradient(low = "blue", high = "red") + labs(x = "Normalized Enrichment Score (NES)", y = "", color = "-log10(FDR)", size = "Gene Set Size") + theme_minimal(base_size = 12) + theme(panel.grid.major.y = element_line(linetype = "dotted"))

图表优化技巧

  • 使用str_remove清理基因集名称中的前缀
  • 颜色映射采用-log10(padj)增强可视化对比
  • 调整点的大小透明度避免重叠

5.2 单个通路富集曲线

selected_pathway <- "HALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION" plot_data <- plotEnrichment(hallmark_sets[[selected_pathway]], ranked_gene_list) + labs(title = selected_pathway, subtitle = paste("NES =", round(gsea_results[pathway == selected_pathway, ]$NES, 2), "FDR =", format(gsea_results[pathway == selected_pathway, ]$padj, scientific = TRUE, digits = 2))) + theme_classic() # 添加统计标注 plot_data + annotate("text", x = 0.8 * max(ranked_gene_list), y = 0.9, hjust = 0, label = paste("Leading Edge:", length(gsea_results[pathway == selected_pathway, ]$leadingEdge[[1]]), "genes"))

6. 进阶应用与问题排查

6.1 批次分析与结果整合

对于多组比较,可自动化处理:

run_gsea <- function(ranked_list, gene_sets) { fgsea(pathways = gene_sets, stats = ranked_list, minSize = 15) } # 假设有多个对比组 comparisons <- list("Group1_vs_Control" = ranked_gene_list1, "Group2_vs_Control" = ranked_gene_list2) results <- lapply(comparisons, run_gsea, gene_sets = hallmark_sets)

6.2 常见错误与解决方案

问题1Error: pathways should be a list with unique names

  • 检查基因集名称是否唯一
  • 使用make.unique()处理重复名称

问题2:分析结果为空

  • 确认输入基因列表与基因集有足够重叠
  • 调整minSize参数(默认15可能过大)

问题3:可视化时基因集名称显示不全

  • 使用stringr::str_wrap处理长名称
  • 调整图形长宽比例
sig_results %>% mutate(Pathway = str_wrap(str_remove(pathway, "HALLMARK_"), width = 30)) %>% ggplot(...) # 其余绘图代码

7. 完整代码模板与实战案例

以下是一个可直接运行的完整示例:

# 加载包 library(fgsea) library(msigdbr) library(org.Hs.eg.db) library(tidyverse) # 1. 数据准备 data("example_diff_data") # 假设这是您的差异分析结果 gene_mapping <- bitr(example_diff_data$SYMBOL, fromType = "SYMBOL", toType = "ENTREZID", OrgDb = org.Hs.eg.db) # 2. 构建排序列表 ranked_list <- example_diff_data %>% inner_join(gene_mapping, by = "SYMBOL") %>% arrange(desc(logFC)) %$% setNames(logFC, ENTREZID) # 3. 获取基因集 hallmark_sets <- msigdbr(species = "human", category = "H") %>% split(x = .$entrez_gene, f = .$gs_name) # 4. 运行GSEA gsea_res <- fgsea(pathways = hallmark_sets, stats = ranked_list, eps = 0) # 5. 可视化 ggplot(gsea_res[padj < 0.25], aes(x = NES, y = reorder(pathway, NES), color = -log10(padj), size = size)) + geom_point() + theme_minimal()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 23:02:42

HoRain云--PowerShell Cmdlet高效管理指南

&#x1f3ac; HoRain 云小助手&#xff1a;个人主页 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站&#xff0c;性价比超高&#xff0c;大内存超划算&#xff01;忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …

作者头像 李华
网站建设 2026/4/27 22:57:38

文心一言和DeepSeek V4哪个更好?

做长文本 / 代码 / 深度推理选 DeepSeek V4&#xff1b;做中文合规 / 多模态 / 搜索联动选文心一言 5.0。下面从核心差异、能力对比、场景选型三方面说清楚。一、核心差异&#xff08;一眼看懂&#xff09;表格对比项文心一言 5.0&#xff08;ERNIE 5.0&#xff09;DeepSeek V4…

作者头像 李华
网站建设 2026/4/27 22:57:34

小程序商城如何设置页面弹窗?吗?一文搞懂(附详细解答)

这是一个被商家问到最多的问题之一&#xff0c;今天一次性讲清楚。一、问题背景在实际运营小程序商城的过程中&#xff0c;不少商家会遇到&#xff1a;小程序商城如何设置页面弹窗&#xff1f;二、详细解答1.添加弹窗&#xff1a;在小程序设置界面&#xff0c;点击【控件--弹窗…

作者头像 李华
网站建设 2026/4/27 22:51:23

2026降AI率工具实测:AI占比90%也能稳降到个位数

距离毕业答辩只剩一周&#xff0c;打开知网AIGC检测报告&#xff0c;AI率赫然显示43%——这绝对是不少毕业生毕业季的噩梦级场景。未必是没有认真写论文&#xff0c;平时整理资料用AI辅助梳理思路、写初稿时借助AI捋顺逻辑&#xff0c;甚至只是用了AI语法纠错工具&#xff0c;都…

作者头像 李华