1 包简介

GSEAlens 的名称源自 Lens(透镜),象征本包像 放大镜 一样,帮助研究者深入

探索 GSEA 富集分析中的关键通路。 GSEAlens 提供一个基于 Web 的交互式平台,用于展示通路简介与描述,并集成 AI 辅助的 通路富集结果导出功能。通过封装工作流并标准化输入格式,本 R 包简化了 GSEA 富集分析 结果的查看与探索过程。

1.1 与 Bioconductor 工作流的整合

GSEAlens 作为 DEG 后探索层(post-DEG exploration layer),被设计为可插入标准 Bioconductor RNA-seq 与功能富集工作流:

  • 上游(输入准备):GSEAlens 接收来自 limma 的已拟合模型对象 (limma::eBayes() 返回的 MArrayLM 对象,基于 edgeR + limma-voom 流程),或来自 DESeq2DESeqDataSet 对象。表达矩阵与样本元数据 可作为 SummarizedExperiment 对象传入,确保与 Bioconductor 核心数据 容器的互操作性。

  • 富集计算:在底层,GSEAlens 包装了 clusterProfilerGSEA() 函数), 并使用来自 msigdbr 的基因集集合。因此统计框架通过 clusterProfiler 继承了 fgsea 的方法论。

  • 并行化:GSEAlens 使用 futurefuture::multisession)执行多对比 并行计算。在并行运行前,用户的原始 future::plan()future.globals.maxSize 选项会被保存,并在函数退出时通过 on.exit() 恢复,因此全局状态不会被污染。在 开发阶段,我们经验性地观察到,对于本包的典型工作负载(需序列化较大的全局对象: 完整 DE 表 + 基因集字典 + 元数据字典),future::multisession 在 Windows 平台上 比 BiocParallelSnowParam / PSOCK 序列化)速度更有体感优势。 这只是开发过程中的一次非正式观察,并非严格的基准测试;如果 BiocParallel 更适合 您的运行环境,用户完全可以自行切换到 BiocParallel 重新运行分析。

  • 可视化:绘图构建于 enrichplotComplexHeatmapggplot2patchworkvisNetwork 之上, 产出的图形与下游发表流程兼容。

  • 下游:Shiny 应用中的“生成 R 代码”功能会输出自包含脚本,可嵌入 rmarkdown / Quarto 报告或集成到多步骤流水线。 典型的端到端 Bioconductor 工作流因此为:


RNA-seq counts

   |
   +--[edgeR + limma-voom]--> MArrayLM fit --+
   |                                         |
   +--[DESeq2]--------------> DESeqDataSet --+
                                             |
                                             v
                                   [setup_gsea_env]
                                             |
                                             v
                                  [batch_calc_gsea]
                                             |
                                             v
                                    Shiny 应用探索
                                             |
                                             v
                                  可复现 R 代码导出

这使得 GSEAlens 自然地补充了现有 Bioconductor 富集分析包:当 clusterProfilerGSVAgprofiler2ReactomePA 关注于

计算富集时,GSEAlens 关注于对结果通路列表的交互式解读

1.2 安装

GSEAlens 可从 Bioconductor 安装。使用以下命令安装稳定版本:

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
BiocManager::install("GSEAlens")

开发版本可从 GitHub 安装:

if (!requireNamespace("pak", quietly = TRUE))
    install.packages("pak")
pak::pkg_install("DDL095/GSEAlens")

2 快速开始

本节使用 airway 数据集演示 GSEAlens 的完整工作流。由于 GSEAlens

本身不做 DEG 分析,我们假定输入对象(fitdds_sedds)已按照标准 limma / DESeq2 流程准备完毕。

详细的输入准备步骤(limma-voom 拟合、DESeq2 对象构造、基因过滤)请参阅 补充 vignette vignette("GSEAlens-preprocessing-zh")

library(GSEAlens)
library(airway)

在本主 vignette 中,三个输入对象(fitdds_sedds)按照预处理 vignette 的 步骤准备完毕。由于在每次编译时重跑 DESeq2::DESeq() 与 limma-voom 流程会使 vignette 变慢,我们在 inst/extdata/ 中附带了这些对象的预计算版本; 重新生成它们的脚本位于 inst/scripts/make_preprocessed_inputs.R, 完全遵循预处理 vignette 的步骤。

关于附带的 dds_se 的说明:为满足 Bioconductor extdata 文件不超过 5 MB 的要求, 本 vignette 使用的 preprocessed_dds_se.rds 是经由 make_preprocessed_inputs.R 中的 slim_dds_se() 函数裁剪过DESeqDataSet。裁剪操作去除了 mu / H / cooks 这三个 assay(DESeq() 拟合的中间产物),并将 rowRangesGRangesList 展平为 GRanges(每个基因 仅保留一条代表性区间)。经 DESeq2::results() 与全部 GSEAlens 入口函数验证, 裁剪前后的 log2FoldChange / pvalue / padj 完全一致。如需重建未裁剪的完整 DESeqDataSet(用于 DESeq2 教学),请参阅预处理 vignette。

data(preprocessed_limma, package = "GSEAlens")
preproc_limma         <- preprocessed_limma
fit                   <- preproc_limma$fit
gsea_limma_voom_data  <- preproc_limma$gsea_limma_voom_data
data(preprocessed_dds_se, package = "GSEAlens")
dds_se <- preprocessed_dds_se
data(preprocessed_dds, package = "GSEAlens")
dds <- preprocessed_dds

若要从自己的数据中准备这些对象,请参阅补充预处理 vignette:


vignette("GSEAlens-preprocessing-zh")

2.1 GSEAlens处理

2.1.1 创建GSEA基因集对象

使用build_gsea_pathways函数构建用于GSEA富集分析的基因集对象

# 实际调用(在 Bioconductor 构建机上较慢,因需加载多个 MSigDB 集合;编译时跳过)
# gsea_pathwaysets <- build_gsea_pathways(
#   species = "HS", auto_select = c("H", "C2:CP:REACTOME", "C5:GO:BP")
# )
# 为加速 vignette 编译,此处加载预计算的轻量级基因集对象
# (Hallmark + KEGG_LEGACY,共 236 条通路)。
# 重新生成方法见 inst/scripts/make_gsea_pathwaysets_toy.R。
data(gsea_pathwaysets_toy, package = "GSEAlens")
gsea_pathwaysets <- gsea_pathwaysets_toy

2.1.2 组装运算对象

通过setup_gsea_env函数,组装用于计算分析的GSEAEnv对象,不同的终端使用同一个函数,仅纳入数据不同,对于limma-voom流程,由于fit对象当中不包含原始的基因读数,因此必须额外纳入过滤后用于生成fit对象的DGEList,本例中为多步过滤的gsea_limma_voom_data。 limma-voom 流程对象纳入分析。

gseadata_limmavoom <- setup_gsea_env(fit = fit,pathway_obj = gsea_pathwaysets,expr_data = gsea_limma_voom_data)

DESeq2 的 SummarizedExperiment 对象纳入分析。

gseadata_se <- setup_gsea_env(fit = dds_se,pathway_obj = gsea_pathwaysets)

DESeq2 的 Count matrix 流程的对象纳入分析。

gseadata_dds <- setup_gsea_env(fit = dds,pathway_obj = gsea_pathwaysets)

2.1.3 运行处理

所有对象均使用batch_calc_gsea这个函数处理,没有任何区别。 并行计算提示:可根据电脑性能调整 workers 选项,设置计算使用的核心数量。 比对数量越多,建议设置越高的核心数以提升计算效率。

# 将 vignette 输出写入临时目录,避免污染 Bioconductor 构建机器的工作目录。
out_dir <- tempdir()
# limma-voom 流程
gsea_res_limmavoom <- batch_calc_gsea(gseadata_limmavoom,
                                                 custom_series_name = "limmavoom_data",
                                                 output_dir = out_dir,
                                                 workers = 2,  # 根据比对数量和电脑性能调整
                                                 force = TRUE)
# DESeq2 SummarizedExperiment 流程
gsea_res_se <- batch_calc_gsea(gseadata_se,
                                          custom_series_name = "dds_se_data",
                                          output_dir = out_dir,
                                          workers = 2,
                                          force = TRUE)
# DESeq2 Count matrix 流程
gsea_res_dds <- batch_calc_gsea(gseadata_dds,
                                           custom_series_name = "dds_data",
                                           output_dir = out_dir,
                                           workers = 2,
                                           force = TRUE)

2.1.4 交互式分析与查看

batch_calc_gsea 运行后,会在输出目录生成一个 RDS 文件(“GSEA Capsule”)。可以 直接用 readRDS 读取,或使用 import_gsea_capsule,后者会自动将相关文件整理到 您的 .Rmd / .R 脚本所在目录,并执行数据体检。

gsea_res <- import_gsea_capsule("/path/to/your/files/")
# 或者直接读取 RDS 文件:
# gsea_res <- readRDS("/path/of/your/file/")

2.2 使用 Shiny 应用进行交互式探索

GSEAlens 提供了一个交互式 Shiny 应用,用于 GSEA 结果的可视化探索。将 batch_calc_gsea 返回的 GseaRes 对象(或通过 import_gsea_capsule 加载的对象) 传入 launch_gsea_app 即可启动。

2.2.1 启动应用

launch_gsea_app(gsea_res)

可选:传入 addition_data 数据框(或 .csv / .rds 文件路径),将通路注释合并到 主表。若为 NULL,应用会自动检测工作目录下的 addition_data_gsealens.rdsaddition_data_gsealens.csv

launch_gsea_app(gsea_res, addition_data = "pathway_annotations.csv")

2.2.2 应用布局

应用采用 侧边栏 + 主面板 布局,主面板包含 6 个 tab。侧边栏(数据预处理 模块)提供全局控件;主面板承载六个功能 tab。

2.2.2.1 侧边栏 – 数据预处理

提供跨 tab 可见的全局控件:

  • 对比选择:选择要探索的两两比较

  • 基因集子组过滤:按集合(如 H、C2、C5)子集化通路

  • DEG marker 选择:高亮关注的基因

  • 组显示顺序:自定义因子排序

  • 表达指标:切换 CPM / logCPM / VST / FPKM

源文件:R/08_shiny_mod_data_prep.R

2.2.2.2 Tab 1 – 主工作区(Main Workspace)

默认起始 tab,整合两个子模块:

  • 主表DT::datatable):所有富集通路的交互式表格,支持列排序(NES、pvalue、 p.adjust、setSize)与 checkbox 选择。选中的行会推送到其他 tab。

  • 组合通路绘图:将多个选中通路聚合为单张组合图(底层使用 patchwork)。 导出模态框包含 WYSIWYG 实时预览、PDF/PNG/SVG/TIFF 输出,以及“复制 R 代码” 按钮(通过 generate_combined_plot_code() 生成自包含脚本)。 点击任意通路行会打开通路详情 Modal,展示完整描述、leading-edge 基因,并提供 “加入绘图队列”选项。 源文件:R/09_shiny_mod_table.RR/11_shiny_mod_modal.RR/12_shiny_mod_multi_plot.R

2.2.2.3 Tab 2 – 全息四象限联动(Holographic Quadruple Linkage)

四个同步面板:

  1. 左上:通路选择器(与主工作区联动)

  2. 右上:基因排名表(按 |stat| 排序)

  3. 左下:所选对比的 volcano 图

  4. 右下:所选基因的表达 boxplot

选择双向同步——在表中点击基因会在 volcano 中高亮;在 volcano 中点击点会滚动 表格到对应行。 源文件:R/10_shiny_mod_quadrant.R

2.2.2.4 Tab 3 – 通路关系探索(Pathway Relationship Exploration)

通路间关系的网络可视化,节点为通路,边表示共享基因(Jaccard 相似度)。两种选择 模式:

  • 单选模式:探索一个通路及其邻居

  • 批量模式:从主工作区选中多个通路,可视化它们的相互连接

本 Tab 提供两个子面板:

  • DotPlot 面板:横向点图。横轴为 NES,点颜色编码显著性 (-log10(FDR) / -log10(P-value) / |NES|,用户可选),点尺寸编码 基因集量级。尺寸映射采用数据驱动(无固定域、无变换),使点尺寸 忠实反映底层基因集量级范围。这与 enrichplot::dotplot 使用的 ggplot2::scale_size_continuous(range=c(3,8)) 范式一致——尺寸 上下限由数据本身决定,而非人为施加固定域。

  • Network 面板:图布局(Fruchterman-Reingold / Kamada-Kawai / 圆形), 提供两种用户可选的边粗细编码

    • Weight-based(默认,emapplot 范式):边粗细与 Jaccard 值线性正比, 视觉忠实反映相似度量级。推荐用于发表。

    • Rank-based:边粗细按 Jaccard 排名分配,保证所有边在视觉上等距分布, 不受绝对权重影响。适合权重方差很小的密集网络。 节点大小反映 |NES|;节点颜色反映富集方向(红色 = 左组上调,蓝色 = 右组 上调)。

导出中心(两个面板均有):点击 “Export Publication Plot” 弹出 modal,

含宽度 / 高度 / DPI / 格式(PDF、PNG、SVG、TIFF)控件,以及两个动作:通过 ggsave 下载静态 ggplot2 渲染图像(不依赖 kaleido/orca 等外部工具), 或复制完整可复现 R 脚本(generate_dotplot_code() / generate_network_code()) 到剪贴板。静态图与复制的代码运行结果字节一致。 源文件:R/13_shiny_mod_pathway_relation.R、辅助函数 R/utils_hubgene.R, 代码生成器见 R/15_code_generator.R

2.2.2.5 Tab 4 – HubGene 网络(HubGene Network)

识别并可视化 HubGene(在多个富集通路中高度连接的基因),使用 visNetwork 交互式 图。可调参数:

  • 物理模拟:开关,调整力导向参数

  • 通路节点尺寸编码:三种用户可选模式

    • 按基因集大小setSize,默认):与 enrichplot::cnetplot 范式一致; 通路节点大小与基因集基因数(sqrt 缩放)成正比。推荐用于生物学解读。

    • 按显著性-log10(FDR)):突出最值得信任的通路。

    • 固定大小:滑块控制的常量大小(旧行为)。 滑块值始终作为基准尺寸,所选编码在其 [0.6×, 1.4×] 区间缩放,以保证 visNetwork 力导向布局稳定(尺寸差异超过 ~2.3 倍会导致布局抖动)。 基因节点尺寸不受影响(始终为 base + degree * 3)。

  • 网络统计:节点数、边数、密度的汇总面板

导出中心:与 Tab 3 相同的 modal 模式。静态复现使用

generate_hubgene_code(),通过 igraph + ggplot2(无 ggraph 依赖)将 通路节点绘制为菱形、基因节点绘制为圆形的二分图。当前尺寸编码模式会保留到生成 的脚本中。 源文件:R/16_shiny_mod_hubgene_vis.R,代码生成器见 R/15_code_generator.R

2.2.2.6 Tab 5 – AI 解读(AI Interpretation)

为外部 LLM(如 GPT-4、Claude)生成结构化 prompt,用于解读选中通路。支持自定义 模板,用户可强制要求特定输出格式(如“生成一段引用 leading-edge 基因的三段式生物学 解读”)。生成的 prompt 可一键复制到剪贴板。 源文件:R/17_shiny_mod_AI.R

注意:本 tab 仅生成 prompt,不直接调用外部 API。作者刻意如此设计,以便用户 自行管控 API key 与网络调用。

2.2.2.7 Tab 6 – 联合 GSEA 画布(Joint GSEA Canvas)

将多个选中通路的富集 running-score 曲线聚合为单张画布。图像导出模态框 包含 WYSIWYG 实时预览、PDF/PNG/SVG/TIFF 输出、可调画布边距,以及“复制 R 代码”按钮(通过 generate_joint_canvas_code() 生成自包含 R 脚本,可在 Shiny 环境外重现该图)。 源文件:R/14_shiny_mod_joint_canvas.R,代码生成器 R/15_code_generator.R

2.2.3 输出解读指南

可视化 关注要点 生物学含义
NES(标准化富集得分) 符号与幅度 正 NES -> 该通路在对比右组中上调
p.adjust < 0.05 阈值 BH 校正后的统计显著性
Volcano(Tab 2) 对称 / 不对称 对称表明全局性变化;不对称表明靶向调控
通路网络(Tab 3) 簇结构 紧密连接的簇提示共调控的生物学模块
HubGene(Tab 4) 高度数基因 Hub 基因是潜在的生物标志物或调控节点
联合画布(Tab 6) 曲线重叠 重叠的 running-score 曲线提示协同调控

2.2.4 可重现代码导出

Tab 1(组合通路绘图)、2、3、4、6 均在各自的图像导出模态框中集成了

“复制 R 代码” 按钮,会生成一份独立 R 脚本重现当前可视化。

这是生成发表级图表的推荐方式:在 Shiny 应用中迭代调整图像,然后导出代码用于最终 定制。

3 R包中间对象说明

3.1 GseaEnv 对象

setup_gsea_env 函数返回的 GseaEnv 对象包含以下组件: | 组件 | 说明 | |——|——| | backend_info | 后端类型信息(limma-voom 或 DESeq2) | | contrast_registry | 对比组注册表,包含所有成对比较信息 | | de_store | 差异分析结果存储 | | expr_bundle | 表达数据封装(原始计数、标准化矩阵、样本元数据) | | geneset | 基因集信息(TERM2GENE、元数据字典、物种) |

3.2 GseaRes 对象

batch_calc_gsea 函数返回的 GseaRes 对象包含以下组件: | 组件 | 说明 | |——|——| | metadata | 计算元数据(运行时间、使用的核心数、参数设置) | | backend_info | 后端类型信息 | | contrast_registry | 对比组注册表 | | de_store | 差异分析结果存储 | | expr_bundle | 表达数据封装 | | geneset_info | 基因集信息 | | results | GSEA 结果列表,每个对比组对应一个条目 |

3.3 GseaTask 对象

extract_gsea_task 函数返回的 GseaTask 对象用于单对比分析:

组件 说明
gsea_res GSEA result 对象
meta 元信息(对比组信息、基因集名称、表达数据)

4 Session info

sessionInfo()
## R version 4.6.1 (2026-06-24)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.4 LTS
## 
## Matrix products: default
## BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so 
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_GB              LC_COLLATE=C              
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: America/New_York
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] GSEAlens_0.99.35            DESeq2_1.53.2              
##  [3] edgeR_4.11.6                limma_3.69.4               
##  [5] airway_1.33.2               SummarizedExperiment_1.43.0
##  [7] Biobase_2.73.2              GenomicRanges_1.65.1       
##  [9] Seqinfo_1.3.0               IRanges_2.47.2             
## [11] S4Vectors_0.51.6            BiocGenerics_0.59.12       
## [13] generics_0.1.4              MatrixGenerics_1.25.0      
## [15] matrixStats_1.5.0           BiocStyle_2.41.0           
## 
## loaded via a namespace (and not attached):
##   [1] splines_4.6.1           later_1.4.8             ggplotify_0.1.3        
##   [4] tibble_3.3.1            polyclip_1.10-7         enrichit_0.2.1         
##   [7] lifecycle_1.0.5         httr2_1.3.0             doParallel_1.0.17      
##  [10] globals_0.19.1          processx_3.9.0          lattice_0.23-1         
##  [13] MASS_7.3-66             magrittr_2.0.5          plotly_4.12.1          
##  [16] sass_0.4.10             rmarkdown_2.31          jquerylib_0.1.4        
##  [19] yaml_2.3.12             httpuv_1.6.17           otel_0.2.0             
##  [22] ggtangle_0.1.2          DBI_1.3.0               RColorBrewer_1.1-3     
##  [25] abind_1.4-8             purrr_1.2.2             msigdbr_26.1.0         
##  [28] yulab.utils_0.2.4       tweenr_2.0.3            rappdirs_0.3.4         
##  [31] aisdk_1.4.12            gdtools_0.5.1           circlize_0.4.18        
##  [34] enrichplot_1.33.0       ggrepel_0.9.8           listenv_1.0.0          
##  [37] tidytree_0.4.8          parallelly_1.48.0       codetools_0.2-20       
##  [40] DelayedArray_0.39.5     DOSE_4.7.2              DT_0.34.0              
##  [43] ggforce_0.5.0           tidyselect_1.2.1        shape_1.4.6.1          
##  [46] aplot_0.3.1             farver_2.1.2            jsonlite_2.0.0         
##  [49] GetoptLong_1.1.1        progressr_1.0.0         iterators_1.0.14       
##  [52] systemfonts_1.3.2       foreach_1.5.2           tools_4.6.1            
##  [55] ggnewscale_0.5.2        treeio_1.37.0           Rcpp_1.1.2             
##  [58] glue_1.8.1              SparseArray_1.13.2      BiocBaseUtils_1.15.1   
##  [61] xfun_0.60               qvalue_2.45.0           dplyr_1.2.1            
##  [64] withr_3.0.3             BiocManager_1.30.27     fastmap_1.2.0          
##  [67] shinyjs_2.1.1           callr_3.8.0             digest_0.6.39          
##  [70] mime_0.13               R6_2.6.1                gridGraphics_0.5-1     
##  [73] colorspace_2.1-3        GO.db_3.23.1            dichromat_2.0-1        
##  [76] RSQLite_3.53.3          tidyr_1.3.2             fontLiberation_0.1.0   
##  [79] data.table_1.18.4       httr_1.4.8              htmlwidgets_1.6.4      
##  [82] S4Arrays_1.13.0         scatterpie_0.2.6        pkgconfig_2.0.3        
##  [85] gtable_0.3.6            blob_1.3.0              ComplexHeatmap_2.29.0  
##  [88] S7_0.2.2                XVector_0.53.0          clusterProfiler_4.21.1 
##  [91] htmltools_0.5.9         fontBitstreamVera_0.1.1 bookdown_0.47          
##  [94] clue_0.3-68             scales_1.4.0            png_0.1-9              
##  [97] ggfun_0.2.1             knitr_1.51              reshape2_1.4.5         
## [100] rjson_0.2.23            visNetwork_2.1.4        nlme_3.1-170           
## [103] curl_7.1.0              cachem_1.1.0            GlobalOptions_0.1.4    
## [106] stringr_1.6.0           shinycssloaders_1.1.0   parallel_4.6.1         
## [109] AnnotationDbi_1.75.2    pillar_1.11.1           grid_4.6.1             
## [112] vctrs_0.7.3             promises_1.5.0          tidydr_0.0.6           
## [115] xtable_1.8-8            cluster_2.1.8.3         evaluate_1.0.5         
## [118] cli_3.6.6               locfit_1.5-9.12         compiler_4.6.1         
## [121] rlang_1.3.0             crayon_1.5.3            future.apply_1.20.2    
## [124] ps_1.9.3                plyr_1.8.9              fs_2.1.0               
## [127] ggiraph_0.9.6           stringi_1.8.9           viridisLite_0.4.3      
## [130] BiocParallel_1.47.0     assertthat_0.2.1        babelgene_22.9         
## [133] Biostrings_2.81.6       lazyeval_0.2.3          GOSemSim_2.39.2        
## [136] fontquiver_0.2.1        Matrix_1.7-6            patchwork_1.3.2        
## [139] bit64_4.8.2             future_1.75.0           ggplot2_4.0.3          
## [142] KEGGREST_1.53.6         statmod_1.5.2           shiny_1.14.0           
## [145] clipr_0.8.1             igraph_2.3.3            memoise_2.0.1          
## [148] bslib_0.12.0            ggtree_4.3.0            bit_4.6.0              
## [151] ape_5.8-1               gson_0.2.1

5 References