CDEnrich: Complete Usage Guide for Cell Death Enrichment

Introduction

CDEnrich is an R package for enrichment analysis of curated cell death pathways. It provides gene sets for multiple forms of regulated cell death, including apoptosis, ferroptosis, pyroptosis, necroptosis, cuproptosis, and disulfidptosis.

The package supports over-representation analysis (ORA), gene set enrichment analysis (GSEA), single-sample GSEA (ssGSEA), multi-group comparison, and visualization of enrichment results.

This vignette demonstrates a complete workflow using built-in demonstration data.

Key Features

  • Exclusive standardized gene sets for programmed cell death pathways
  • Supports single-group and multi-group ORA enrichment analysis
  • Supports single-group and multi-group GSEA enrichment analysis
  • Supports ssGSEA-based sample-level scoring and multi-group differential analysis - Scenario-matched visualization functions for all analysis modes
  • All plots are fully customizable and ready forpublication

Installation

CDEnrich and its dependencies should be installed before running this vignette. The current development version can be installed from GitHub:

remotes::install_github("Yushan-Chen-829/CDEnrich")

After acceptance into Bioconductor, the package will be available through BiocManager:

BiocManager::install("CDEnrich")

Load the package as follows:

library(CDEnrich)
packageVersion("CDEnrich")
## [1] '0.99.1'

Cell Death Gene Sets

CDEnrich provides curated gene sets representing 27 cell death types. The gene sets were compiled from published literature, PMID-supported annotations, and GeneCards.

The 27 cell death types are organized into two source categories:

  • PMID-supported literature and GeneCards (13 types): Disulfidptosis, Ferroptosis, Cuproptosis, Apoptosis, Pyroptosis, Autophagy, Necroptosis, NETosis, Immunogenic Cell Death, Anoikis, Phagocytosis, Efferocytosis, and PANoptosis.

  • GeneCards (14 types): Parthanatos, Entotic cell death, Lysosome-dependent cell death, Alkaliptosis, Oxeiptosis, Paraptosis, Methuosis, Intrinsic apoptosis, Extrinsic apoptosis, Mitochondrial permeability transition (MPT)-driven necrosis, Autosis (autophagic cell death), Mitotic death, Accidental cell death, and paraptosis-like death.

GeneCards-based gene sets should be interpreted as exploratory resources, particularly when no PMID is available in the package metadata.

Available Gene Sets

The curated gene sets can be loaded with:

gene_sets <- load_cell_death_genes()

length(gene_sets)
## [1] 160
head(names(gene_sets))
## [1] "Accidental cell death_GeneCards" "Alkaliptosis_GeneCards"         
## [3] "Anoikis_BLCA_Prognosis_37275895" "Anoikis_CM_Prognosis_40721013"  
## [5] "Anoikis_COAD_Prognosis_39850875" "Anoikis_CRC_Prognosis_40820175"

The returned object is a named list in which each element is a character vector of gene symbols. The number of gene sets may differ from 27 because one cell death type can contain multiple gene sets.

The size of each gene set can be inspected with:

gene_set_summary <- data.frame(
  gene_set = names(gene_sets),
  n_genes = lengths(gene_sets),
  row.names = NULL
)

head(gene_set_summary)
##                          gene_set n_genes
## 1 Accidental cell death_GeneCards     540
## 2          Alkaliptosis_GeneCards       3
## 3 Anoikis_BLCA_Prognosis_37275895       9
## 4   Anoikis_CM_Prognosis_40721013      11
## 5 Anoikis_COAD_Prognosis_39850875       9
## 6  Anoikis_CRC_Prognosis_40820175      10

Gene set names may include the cell death type, source, and PMID. For example:

"Ferroptosis_FerrDb V2(36305834)"

Representative Gene Sets

For selected cell death types, CDEnrich provides a recommended representative gene set:

get_representative_pathway("Ferroptosis")
##          Type     PMID IF Cite                         Pathway Source
## 2 Ferroptosis 36305834 15  263 Ferroptosis_FerrDb V2(36305834)       
##                                                                                                                                                  Description
## 2 Curated from the FerrDb V2 database (a collection of ferroptosis-related genes from journal articles published in 2020-2021, plus externally added genes).
##                                                        Notes
## 2 FerrDb was updated to V3 in January 2026 (PMID: 41171133).
get_representative_pathway("Disulfidptosis")
##             Type     PMID   IF Cite                    Pathway
## 1 Disulfidptosis 36747082 22.7  642 Disulfidptosis_Up_36747082
##                 Source
## 1 Supplementary-table1
##                                                                              Description
## 1 Genes were experimentally identified; from the seminal study defining this death type.
##   Notes
## 1

The returned information may include the cell death type, pathway name, PMID, source, and description. If no representative pathway is available, the function returns NULL.

get_representative_pathway("Mitosis")
## NULL

Pathway Selection

All enrichment functions share the same term_select logic:

Global analysis

Omit term_select to use all curated gene sets:

data("demo_deg", package = "CDEnrich")
data("demo_all_genes", package = "CDEnrich")

ora_global <- celldeath_enrich(
  deg = demo_deg,
  universe = demo_all_genes
)

All gene sets within a cell death type

Set use_recommended = FALSE to use all gene sets associated with a cell death type:

ora_ferroptosis_all <- celldeath_enrich(
  deg = demo_deg,
  universe = demo_all_genes,
  term_select = "Ferroptosis",
  use_recommended = FALSE
)

Exact gene set name

An exact gene set name can be supplied. The name must match the output of load_cell_death_genes() exactly:

ora_exact <- celldeath_enrich(
  deg = demo_deg,
  universe = demo_all_genes,
  term_select = "Ferroptosis_FerrDb V2(36305834)"
)

The same pathway-selection rules apply to GSEA, ssGSEA, and multi-group analysis.

Workflow Overview

CDEnrich provides three main enrichment workflows:

  • Over-Representation Analysis (ORA): Identifies cell death pathways over-represented in a gene list.
  • Gene Set Enrichment Analysis (GSEA): Evaluates cell death pathways across a ranked gene list.
  • Single-Sample GSEA (ssGSEA): Calculates a cell death pathway score for each sample and supports group-level comparisons.

The package also supports multi-group ORA and GSEA, differential analysis of ssGSEA scores, and visualization of enrichment results.

The general workflow is:

Input data
  -> Select cell death gene sets
  -> Run ORA, GSEA, or ssGSEA
  -> Compare groups when appropriate
  -> Visualize and interpret the results

The main analysis functions are:

Analysis Function
Single-group ORA celldeath_enrich()
Multi-group ORA celldeath_compare_enrich()
Single-group GSEA celldeath_gsea()
Multi-group GSEA celldeath_gsea_multiple()
ssGSEA celldeath_ssgsea()
Differential ssGSEA celldeath_ssgsea_diff()

Input Data Specification

The main input formats required by each analysis function are summarized below.

Single-group ORA

celldeath_enrich() accepts a character vector of gene symbols.

Input requirements:

  • deg: A character vector of gene symbols.
  • At least three genes are required.
  • universe: An optional character vector of background genes.
ora_genes <- c("GPX4", "ACSL4", "SLC7A11")

Single-group GSEA

celldeath_gsea() requires a named numeric vector sorted in decreasing order.

Input requirements:

  • Names: Gene symbols.
  • Values: A ranking statistic, such as log2 fold change or a test statistic.
  • Order: Values must be sorted in decreasing order.
gene_rank <- c(
  GPX4 = 2.8,
  ACSL4 = 2.4,
  SLC7A11 = 2.1
)

gene_rank <- sort(gene_rank, decreasing = TRUE)

Multi-group ORA

celldeath_compare_enrich() accepts a named list of gene vectors.

Input requirements:

  • Each list element must be a character vector of gene symbols.
  • The list must be named.
  • List names represent the group labels.
  • Each gene vector must contain at least three genes.
gene_groups <- list(
  Control = c("GPX4", "ACSL4", "FTH1"),
  Treatment = c("GPX4", "SLC7A11", "GSDMD")
)

Multi-group GSEA

celldeath_gsea_multiple() accepts a named list of ranked gene vectors.

Input requirements:

  • Each list element must be a named numeric vector.
  • Each vector must be sorted in decreasing order.
  • The list must be named.
  • List names represent the group labels.
ranked_groups <- list(
  Control = c(GPX4 = 2.1, ACSL4 = 1.5, SLC7A11 = 0.8),
  Treatment = c(GPX4 = 2.8, ACSL4 = 2.4, SLC7A11 = 1.9)
)

ssGSEA

celldeath_ssgsea() accepts a numeric matrix or data frame with genes in rows and samples in columns.

Input requirements:

  • Rows represent genes; columns represent samples.
  • Row names must contain gene symbols.
  • Column names must contain sample names.
  • Missing values are not allowed.
  • Duplicated gene symbols are not allowed.
  • The optional group vector must contain one label for each sample.
expr <- matrix(
  rnorm(30),
  nrow = 3,
  ncol = 10,
  dimnames = list(
    c("GPX4", "ACSL4", "SLC7A11"),
    paste0("Sample", 1:10)
  )
)

group <- rep(c("Control", "Treatment"), each = 5)

Minimal Working Examples

Single-group ORA

The following example performs global ORA using all curated gene sets:

data("demo_deg", package = "CDEnrich")
data("demo_all_genes", package = "CDEnrich")

ora_global <- celldeath_enrich(
  deg = demo_deg,
  universe = demo_all_genes
)

ora_global
## #
## # over-representation test
## #
## #...@organism     unknown 
## #...@ontology     unknown 
## #...@keytype      unknown 
## #...@gene     chr [1:100] "RPL8" "IREB2" "ATP5MC3" "CS" "EMC2" "ACSF2" "NOX1" "CYBB" ...
## #...pvalues adjusted by 'BH' with cutoff < 0.05
## #...72 enriched terms found
## 'data.frame':    72 obs. of  13 variables:
##  $ ID            : chr  "Ferroptosis_FerrDb V2(36305834)" "Intrinsic apoptosis_GeneCards" "Mitotic death_GeneCards" "Ferroptosis_Pan Cancer_37968457" ...
##  $ Description   : chr  "Ferroptosis_FerrDb V2(36305834)" "Intrinsic apoptosis_GeneCards" "Mitotic death_GeneCards" "Ferroptosis_Pan Cancer_37968457" ...
##  $ GeneRatio     : chr  "100/100" "87/100" "80/100" "64/100" ...
##  $ BgRatio       : chr  "486/3486" "406/3486" "343/3486" "252/3486" ...
##  $ RichFactor    : num  0.206 0.214 0.233 0.254 0.254 ...
##  $ FoldEnrichment: num  7.17 7.47 8.13 8.85 8.86 ...
##  $ oddsRatio     : num  Inf 64.3 47.5 30.2 29.5 ...
##  $ zScore        : num  25.2 23.8 23.9 22.2 22.1 ...
##  $ pvalue        : num  1.96e-90 1.62e-70 3.31e-65 7.01e-51 6.75e-50 ...
##  $ p.adjust      : num  1.71e-88 7.05e-69 9.61e-64 1.53e-49 1.18e-48 ...
##  $ qvalue        : num  3.10e-89 1.28e-69 1.74e-64 2.77e-50 2.13e-49 ...
##  $ geneID        : chr  "ALOX15/PIK3CA/ATG5/MIOX/PRKAA1/VDAC2/ACVR1B/DPP4/GABARAPL1/TF/BAP1/ATG13/NCOA4/ATG16L1/MAPK8/EGFR/EMC2/TFRC/GLS"| __truncated__ "ALOX15/PIK3CA/ATG5/PRKAA1/VDAC2/ACVR1B/DPP4/GABARAPL1/TF/BAP1/ATG13/NCOA4/ATG16L1/MAPK8/EGFR/TFRC/MAPK14/SAT1/G"| __truncated__ "ALOX15/PIK3CA/ATG5/PRKAA1/VDAC2/ACVR1B/DPP4/GABARAPL1/TF/BAP1/ATG13/ATG16L1/MAPK8/EGFR/EMC2/TFRC/MAPK14/SAT1/GA"| __truncated__ "MIOX/PRKAA1/ACVR1B/DPP4/GABARAPL1/ATG13/ATG16L1/MAPK8/EGFR/EMC2/SAT1/GABARAPL2/ABCC1/ULK1/CARS1/IDH1/FLT3/ATG3/"| __truncated__ ...
##  $ Count         : int  100 87 80 64 63 51 33 20 24 17 ...
## #...Citation

A bubble plot can be used to visualize the enriched pathways:

plot_death_enrich_bubble(
  ora_global,
  show_category = 10
)

A targeted analysis can be performed by specifying a cell death type. The recommended representative gene set is selected automatically:

ora_ferroptosis <- celldeath_enrich(
  deg = demo_deg,
  universe = demo_all_genes,
  term_select = "Ferroptosis"
)

ora_ferroptosis
## #
## # over-representation test
## #
## #...@organism     unknown 
## #...@ontology     unknown 
## #...@keytype      unknown 
## #...@gene     chr [1:100] "RPL8" "IREB2" "ATP5MC3" "CS" "EMC2" "ACSF2" "NOX1" "CYBB" ...
## #...pvalues adjusted by 'BH' with cutoff < 0.05
## #...1 enriched terms found
## 'data.frame':    1 obs. of  13 variables:
##  $ ID            : chr "Ferroptosis_FerrDb V2(36305834)"
##  $ Description   : chr "Ferroptosis_FerrDb V2(36305834)"
##  $ GeneRatio     : chr "100/100"
##  $ BgRatio       : chr "486/3486"
##  $ RichFactor    : num 0.206
##  $ FoldEnrichment: num 7.17
##  $ oddsRatio     : num Inf
##  $ zScore        : num 25.2
##  $ pvalue        : num 1.96e-90
##  $ p.adjust      : num 1.96e-90
##  $ qvalue        : num NA
##  $ geneID        : chr "ALOX15/PIK3CA/ATG5/MIOX/PRKAA1/VDAC2/ACVR1B/DPP4/GABARAPL1/TF/BAP1/ATG13/NCOA4/ATG16L1/MAPK8/EGFR/EMC2/TFRC/GLS"| __truncated__
##  $ Count         : int 100
## #...Citation

The universe argument should represent the genes that were available for detection or testing in the original experiment.

The targeted enrichment result can be visualized with plot_death_enrich_targeted():

plot_death_enrich_targeted(
  ora_ferroptosis
)

This plot provides a compact visualization for a targeted analysis containing a single representative pathway.

Single-group GSEA

The following example performs GSEA using a built-in ranked gene list:

data("demo_rank_apop", package = "CDEnrich")

apoptosis_id <- get_representative_pathway("Apoptosis")$Pathway

gsea_global <- celldeath_gsea(
  geneList = demo_rank_apop,
  pvalueCutoff = 0.05
)

gsea_global
## #
## # Gene Set Enrichment Analysis
## #
## #...@organism     unknown 
## #...@setType      unknown 
## #...@keytype      unknown 
## #...@geneList     Named num [1:3146] 8 7.97 7.93 7.9 7.86 ...
##  - attr(*, "names")= chr [1:3146] "TP53" "TERT" "PTCH1" "MYC" ...
## #...nPerm     1000 
## #...pvalues adjusted by 'BH' with cutoff < 0.05
## #...27 enriched terms found
## 'data.frame':    27 obs. of  12 variables:
##  $ ID             : chr  "Apoptosis_Pan Cancer_37968457" "Intrinsic apoptosis_GeneCards" "Mitotic death_GeneCards" "Extrinsic apoptosis_GeneCards" ...
##  $ Description    : chr  "Apoptosis_Pan Cancer_37968457" "Intrinsic apoptosis_GeneCards" "Mitotic death_GeneCards" "Extrinsic apoptosis_GeneCards" ...
##  $ setSize        : int  146 136 124 95 93 56 41 40 38 39 ...
##  $ enrichmentScore: num  0.998 0.996 0.992 0.983 0.982 ...
##  $ NES            : num  3.26 3.24 3.23 3.1 3.07 ...
##  $ pvalue         : num  1e-10 1e-10 1e-10 1e-10 1e-10 ...
##  $ p.adjust       : num  1.08e-10 1.08e-10 1.08e-10 1.08e-10 1.08e-10 1.08e-10 1.08e-10 1.08e-10 1.08e-10 1.08e-10 ...
##  $ qvalue         : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ rank           : int  152 149 148 147 148 135 137 132 125 147 ...
##  $ leading_edge   : chr  "tags=100%, list=5%, signal=100%" "tags=100%, list=5%, signal=100%" "tags=100%, list=5%, signal=99%" "tags=100%, list=5%, signal=98%" ...
##  $ core_enrichment: chr  "TP53/TERT/PTCH1/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/NDE1/GLI1/CYCS/SALL4/MD"| __truncated__ "TP53/TERT/PTCH1/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/NDE1/GLI1/CYCS/SALL4/MD"| __truncated__ "TP53/TERT/PTCH1/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/NDE1/GLI1/CYCS/SALL4/MD"| __truncated__ "TP53/TERT/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/GLI1/CYCS/MDM2/AIFM1/CAV1/EDN"| __truncated__ ...
##  $ log2err        : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
## #...Citation

The enrichment profile of the representative apoptosis pathway can be visualized with:

plot_death_gsea_curve(
  gsea_global,
  pathway = apoptosis_id
)

A targeted GSEA can be performed using the representative apoptosis gene set:

gsea_apoptosis <- celldeath_gsea(
  geneList = demo_rank_apop,
  term_select = apoptosis_id,
  pvalueCutoff = 0.05
)

gsea_apoptosis
## #
## # Gene Set Enrichment Analysis
## #
## #...@organism     unknown 
## #...@setType      unknown 
## #...@keytype      unknown 
## #...@geneList     Named num [1:3146] 8 7.97 7.93 7.9 7.86 ...
##  - attr(*, "names")= chr [1:3146] "TP53" "TERT" "PTCH1" "MYC" ...
## #...nPerm     1000 
## #...pvalues adjusted by 'BH' with cutoff < 0.05
## #...1 enriched terms found
## 'data.frame':    1 obs. of  12 variables:
##  $ ID             : chr "Apoptosis_Pan Cancer_37968457"
##  $ Description    : chr "Apoptosis_Pan Cancer_37968457"
##  $ setSize        : int 146
##  $ enrichmentScore: num 0.998
##  $ NES            : num 3.26
##  $ pvalue         : num 1e-10
##  $ p.adjust       : num 1e-10
##  $ qvalue         : num NA
##  $ rank           : int 152
##  $ leading_edge   : chr "tags=100%, list=5%, signal=100%"
##  $ core_enrichment: chr "TP53/TERT/PTCH1/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/NDE1/GLI1/CYCS/SALL4/MD"| __truncated__
##  $ log2err        : num NaN
## #...Citation

The demonstration ranking list contains a strong apoptosis signal. Depending on the installed version of fgsea, very small p-values may be reported.

Multi-group ORA

Multi-group ORA requires a named list of gene vectors:

data("demo_deg_list", package = "CDEnrich")
data("demo_all_genes", package = "CDEnrich")

compare_ora <- celldeath_compare_enrich(
  deg_list_list = demo_deg_list,
  universe = demo_all_genes,
  pvalueCutoff = 0.05,
  qvalueCutoff = 0.2,
  minGSSize = 3
)

compare_ora
## #
## # Result of Comparing 2 gene clusters 
## #
## #.. @fun      gene 
## #.. @geneClusters    List of 2
##  $ Control  : chr [1:15] "RPL8" "IREB2" "ATP5MC3" "CS" ...
##  $ Treatment: chr [1:100] "RPL8" "IREB2" "ATP5MC3" "CS" ...
##  - attr(*, "split_type")= chr "data.frame"
##  - attr(*, "split_labels")='data.frame': 2 obs. of  1 variable:
##   ..$ group: chr [1:2] "Control" "Treatment"
## #...Result   'data.frame':   86 obs. of  15 variables:
##  $ Cluster       : Factor w/ 2 levels "Control","Treatment": 1 1 1 1 1 1 1 1 1 1 ...
##  $ group         : chr  "Control" "Control" "Control" "Control" ...
##  $ ID            : chr  "Ferroptosis_FerrDb V2(36305834)" "Mitotic death_GeneCards" "Ferroptosis_Pan Cancer_37968457" "Intrinsic apoptosis_GeneCards" ...
##  $ Description   : chr  "Ferroptosis_FerrDb V2(36305834)" "Mitotic death_GeneCards" "Ferroptosis_Pan Cancer_37968457" "Intrinsic apoptosis_GeneCards" ...
##  $ GeneRatio     : chr  "15/15" "12/15" "10/15" "11/15" ...
##  $ BgRatio       : chr  "486/3486" "343/3486" "252/3486" "406/3486" ...
##  $ RichFactor    : num  0.0309 0.035 0.0397 0.0271 0.1091 ...
##  $ FoldEnrichment: num  7.17 8.13 9.22 6.3 25.35 ...
##  $ oddsRatio     : num  Inf 37.9 26.7 21.4 46.6 ...
##  $ zScore        : num  9.64 9.14 8.91 7.46 11.97 ...
##  $ pvalue        : num  1.21e-13 2.38e-10 7.14e-09 4.17e-08 5.24e-08 ...
##  $ p.adjust      : num  4.12e-12 4.05e-09 8.09e-08 3.54e-07 3.56e-07 ...
##  $ qvalue        : num  2.04e-12 2.01e-09 4.01e-08 1.75e-07 1.77e-07 ...
##  $ geneID        : chr  "NOX1/EMC2/ACSF2/CYBB/DUOX2/G6PD/NOX4/IREB2/NOX3/ATP5MC3/CS/PGD/NOX5/RPL8/DUOX1" "NOX1/EMC2/CYBB/DUOX2/G6PD/NOX4/IREB2/ATP5MC3/CS/PGD/RPL8/DUOX1" "NOX1/EMC2/CYBB/DUOX2/G6PD/NOX3/CS/PGD/NOX5/DUOX1" "NOX1/CYBB/DUOX2/G6PD/NOX4/IREB2/NOX3/CS/PGD/RPL8/DUOX1" ...
##  $ Count         : int  15 12 10 11 6 2 4 2 3 2 ...
## #.. number of enriched terms found for each gene cluster:
## #..   Control: 14 
## #..   Treatment: 72 
## #
## #...Citation
## T Wu, E Hu, S Xu, M Chen, P Guo, Z Dai, T Feng, L Zhou, 
## W Tang, L Zhan, X Fu, S Liu, X Bo, and G Yu. 
## clusterProfiler 4.0: A universal enrichment tool for interpreting omics data. 
## The Innovation. 2021, 2(3):100141

The results can be visualized with a comparative heatmap:

plot_death_compare_heatmap(
  compare_ora,
  show_category = 10
)

A targeted comparison can be performed by specifying a cell death type:

compare_ora_ferroptosis <- celldeath_compare_enrich(
  deg_list_list = demo_deg_list,
  universe = demo_all_genes,
  term_select = "Ferroptosis",
  pvalueCutoff = 0.05,
  qvalueCutoff = 0.2,
  minGSSize = 3
)

compare_ora_ferroptosis
## #
## # Result of Comparing 2 gene clusters 
## #
## #.. @fun      gene 
## #.. @geneClusters    List of 2
##  $ Control  : chr [1:15] "RPL8" "IREB2" "ATP5MC3" "CS" ...
##  $ Treatment: chr [1:100] "RPL8" "IREB2" "ATP5MC3" "CS" ...
##  - attr(*, "split_type")= chr "data.frame"
##  - attr(*, "split_labels")='data.frame': 2 obs. of  1 variable:
##   ..$ group: chr [1:2] "Control" "Treatment"
## #...Result   'data.frame':   2 obs. of  15 variables:
##  $ Cluster       : Factor w/ 2 levels "Control","Treatment": 1 2
##  $ group         : chr  "Control" "Treatment"
##  $ ID            : chr  "Ferroptosis_FerrDb V2(36305834)" "Ferroptosis_FerrDb V2(36305834)"
##  $ Description   : chr  "Ferroptosis_FerrDb V2(36305834)" "Ferroptosis_FerrDb V2(36305834)"
##  $ GeneRatio     : chr  "15/15" "100/100"
##  $ BgRatio       : chr  "486/3486" "486/3486"
##  $ RichFactor    : num  0.0309 0.2058
##  $ FoldEnrichment: num  7.17 7.17
##  $ oddsRatio     : num  Inf Inf
##  $ zScore        : num  9.64 25.21
##  $ pvalue        : num  1.21e-13 1.96e-90
##  $ p.adjust      : num  1.21e-13 1.96e-90
##  $ qvalue        : num  NA NA
##  $ geneID        : chr  "NOX1/EMC2/ACSF2/CYBB/DUOX2/G6PD/NOX4/IREB2/NOX3/ATP5MC3/CS/PGD/NOX5/RPL8/DUOX1" "ALOX15/PIK3CA/ATG5/MIOX/PRKAA1/VDAC2/ACVR1B/DPP4/GABARAPL1/TF/BAP1/ATG13/NCOA4/ATG16L1/MAPK8/EGFR/EMC2/TFRC/GLS"| __truncated__
##  $ Count         : int  15 100
## #.. number of enriched terms found for each gene cluster:
## #..   Control: 1 
## #..   Treatment: 1 
## #
## #...Citation
## T Wu, E Hu, S Xu, M Chen, P Guo, Z Dai, T Feng, L Zhou, 
## W Tang, L Zhan, X Fu, S Liu, X Bo, and G Yu. 
## clusterProfiler 4.0: A universal enrichment tool for interpreting omics data. 
## The Innovation. 2021, 2(3):100141

Multi-group GSEA

Multi-group GSEA requires a named list of ranked gene vectors:

data("demo_rank_apop_list", package = "CDEnrich")

multi_gsea <- celldeath_gsea_multiple(
  geneList_list = demo_rank_apop_list,
  pvalueCutoff = 1
)

multi_gsea
## $Control
## #
## # Gene Set Enrichment Analysis
## #
## #...@organism     unknown 
## #...@setType      unknown 
## #...@keytype      unknown 
## #...@geneList     Named num [1:3146] 3.72 3.45 3.27 3.24 3.08 ...
##  - attr(*, "names")= chr [1:3146] "BackgroundGene_2703" "BackgroundGene_1113" "BackgroundGene_1084" "BackgroundGene_1346" ...
## #...nPerm     1000 
## #...pvalues adjusted by 'BH' with cutoff < 1
## #...27 enriched terms found
## 'data.frame':    27 obs. of  12 variables:
##  $ ID             : chr  "Autophagy_Pan Cancer_41554207" "Mitotic_catastrophe_GeneCards" "Accidental cell death_GeneCards" "Paraptosis_GeneCards" ...
##  $ Description    : chr  "Autophagy_Pan Cancer_41554207" "Mitotic_catastrophe_GeneCards" "Accidental cell death_GeneCards" "Paraptosis_GeneCards" ...
##  $ setSize        : int  10 56 32 10 136 146 14 15 41 22 ...
##  $ enrichmentScore: num  -0.532 -0.259 0.277 -0.365 0.199 ...
##  $ NES            : num  -1.388 -1.023 0.988 -0.953 0.948 ...
##  $ pvalue         : num  0.11 0.415 0.464 0.51 0.615 ...
##  $ p.adjust       : num  0.994 0.994 0.994 0.994 0.994 ...
##  $ qvalue         : num  0.994 0.994 0.994 0.994 0.994 ...
##  $ rank           : int  852 852 447 569 109 114 71 71 913 629 ...
##  $ leading_edge   : chr  "tags=60%, list=27%, signal=44%" "tags=32%, list=27%, signal=24%" "tags=19%, list=14%, signal=16%" "tags=20%, list=18%, signal=16%" ...
##  $ core_enrichment: chr  "TP73/TNFSF10/F2R/CDKN1A/SIRT1/TNFRSF10A" "TP73/TNFSF10/PSIP1/EGFR/H1-1/BCL2L1/PRKCA/TUBB/AIFM1/ENDOG/UBE3C/CDKN1A/CYCS/PRDX5/PLA2G4A/EDN1/CASP9/TERF1" "APP/CD4/EPO/NOS2/SNCA/FAS" "AIFM1/CASP9" ...
##  $ log2err        : num  0.1864 0.0881 0.0843 0.0763 0.0746 ...
## #...Citation
## 
## $Treatment
## #
## # Gene Set Enrichment Analysis
## #
## #...@organism     unknown 
## #...@setType      unknown 
## #...@keytype      unknown 
## #...@geneList     Named num [1:3146] 8 7.97 7.93 7.9 7.86 ...
##  - attr(*, "names")= chr [1:3146] "TP53" "TERT" "PTCH1" "MYC" ...
## #...nPerm     1000 
## #...pvalues adjusted by 'BH' with cutoff < 1
## #...27 enriched terms found
## 'data.frame':    27 obs. of  12 variables:
##  $ ID             : chr  "Apoptosis_Pan Cancer_37968457" "Intrinsic apoptosis_GeneCards" "Mitotic death_GeneCards" "Extrinsic apoptosis_GeneCards" ...
##  $ Description    : chr  "Apoptosis_Pan Cancer_37968457" "Intrinsic apoptosis_GeneCards" "Mitotic death_GeneCards" "Extrinsic apoptosis_GeneCards" ...
##  $ setSize        : int  146 136 124 95 93 56 40 38 41 39 ...
##  $ enrichmentScore: num  0.998 0.996 0.992 0.983 0.982 ...
##  $ NES            : num  3.25 3.25 3.22 3.15 3.1 ...
##  $ pvalue         : num  1e-10 1e-10 1e-10 1e-10 1e-10 ...
##  $ p.adjust       : num  1.12e-10 1.12e-10 1.12e-10 1.12e-10 1.12e-10 ...
##  $ qvalue         : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ rank           : int  152 149 148 147 148 135 132 125 137 147 ...
##  $ leading_edge   : chr  "tags=100%, list=5%, signal=100%" "tags=100%, list=5%, signal=100%" "tags=100%, list=5%, signal=99%" "tags=100%, list=5%, signal=98%" ...
##  $ core_enrichment: chr  "TP53/TERT/PTCH1/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/NDE1/GLI1/CYCS/SALL4/MD"| __truncated__ "TP53/TERT/PTCH1/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/NDE1/GLI1/CYCS/SALL4/MD"| __truncated__ "TP53/TERT/PTCH1/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/NDE1/GLI1/CYCS/SALL4/MD"| __truncated__ "TP53/TERT/MYC/VIM/BCL2/MAPK1/TNF/DNAH8/EGFR/FAS/GSN/RAF1/CASP3/CCND1/JAK2/AR/TUBB/GLI1/CYCS/MDM2/AIFM1/CAV1/EDN"| __truncated__ ...
##  $ log2err        : num  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
## #...Citation

A GSEA curve can be generated for the representative apoptosis pathway:

curves <- plot_death_gsea_curve_multiple(
  multi_gsea,
  pathway = apoptosis_id
)

curves$Control

curves$Treatment

The pvalueCutoff = 1 setting retains results for all groups, including groups without a strong enrichment signal, which facilitates comparison across groups.

ssGSEA and Differential Analysis

ssGSEA calculates a pathway score for each sample:

data("demo_expr", package = "CDEnrich")
data("demo_group", package = "CDEnrich")

ssgsea_result <- celldeath_ssgsea(
  expr = demo_expr,
  group = demo_group
)

ssgsea_result
## Cell death ssGSEA result
##   Pathways scored: 95 
##   Samples scored : 12 
##   Groups         : Control, Treatment 
##   Samples/group  : Control=6, Treatment=6

A heatmap can be used to visualize pathway scores across samples:

plot_death_ssgsea_heatmap(
  ssgsea_result
)

Differential analysis can be performed when group labels are available:

ssgsea_difference <- celldeath_ssgsea_diff(
  ssgsea_result
)

head(ssgsea_difference)
##                           Pathway     Control Treatment Statistic     P_value
## 1 Accidental cell death_GeneCards  0.05121547 0.3381389         0 0.005074868
## 2 Anoikis_LUAD_Prognosis_41187171 -0.07601467 0.3973248         0 0.005074868
## 3           Anoikis_LUSC_40028162  0.06134317 0.3739529         0 0.005074868
## 4     Anoikis_Pan Cancer_37275895  0.06876107 0.3860521         0 0.005074868
## 5 Apoptosis_OS_Prognosis_35576501  0.07605482 0.3877590         0 0.005074868
## 6   Apoptosis_Pan cancer_36044785  0.08519270 0.3715857         0 0.005074868
##      P_adjust
## 1 0.008171398
## 2 0.008171398
## 3 0.008171398
## 4 0.008171398
## 5 0.008171398
## 6 0.008171398

For two groups, the function uses a Wilcoxon test. For three or more groups, it uses a Kruskal-Wallis test.

Group-level scores can also be displayed with a boxplot:

plot_death_ssgsea_boxplot(
  ssgsea_result
)

Exporting Results

Results can be exported using the savefile, filename, or filename_prefix arguments. The following examples are shown but not executed during vignette construction:

celldeath_enrich(
  deg = demo_deg,
  universe = demo_all_genes,
  savefile = TRUE,
  filename = "single_group_ORA_result.csv"
)
celldeath_gsea(
  geneList = demo_rank_apop,
  savefile = TRUE,
  filename = "single_group_GSEA_result.csv"
)
celldeath_compare_enrich(
  deg_list_list = demo_deg_list,
  universe = demo_all_genes,
  savefile = TRUE,
  filename = "multi_group_ORA_result.csv"
)
celldeath_gsea_multiple(
  geneList_list = demo_rank_apop_list,
  savefile = TRUE
)
celldeath_ssgsea(
  expr = demo_expr,
  group = demo_group,
  savefile = TRUE,
  filename = "ssGSEA_score_matrix.csv"
)

celldeath_ssgsea_diff(
  ssgsea_result,
  savefile = TRUE,
  filename = "ssGSEA_differential_results.csv"
)

Data Sources and Limitations

The curated gene sets were compiled from published literature and public annotations. PMID-supported gene sets are linked to their corresponding publications when PMID information is available. Some gene sets are based primarily on GeneCards annotations and should be interpreted as exploratory resources.

Enrichment results depend on the input genes, ranking statistic, background gene set, pathway definition, and statistical thresholds. They should be interpreted together with the experimental design and the original publications. Enrichment does not by itself establish a causal relationship or absolute pathway activity.

Session Information

sessionInfo()
## R version 4.6.1 (2026-06-24)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 26.04.1 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.32.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [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: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] CDEnrich_0.99.1  BiocStyle_2.41.0
## 
## loaded via a namespace (and not attached):
##   [1] RColorBrewer_1.1-3          sys_3.4.3                  
##   [3] jsonlite_2.0.0              tidydr_0.0.7               
##   [5] magrittr_2.0.5              ggtangle_0.1.4             
##   [7] magick_2.9.1                farver_2.1.2               
##   [9] rmarkdown_2.32              fs_2.1.0                   
##  [11] vctrs_0.7.3                 memoise_2.0.1              
##  [13] DelayedMatrixStats_1.35.0   ggtree_4.3.0               
##  [15] htmltools_0.5.9             S4Arrays_1.13.2            
##  [17] BiocBaseUtils_1.15.1        Rhdf5lib_2.1.0             
##  [19] SparseArray_1.13.4          rhdf5_2.57.20              
##  [21] gridGraphics_0.5-1          sass_0.4.10                
##  [23] bslib_0.12.0                htmlwidgets_1.6.4          
##  [25] plyr_1.8.9                  httr2_1.3.0                
##  [27] cachem_1.1.0                buildtools_1.0.0           
##  [29] igraph_2.3.4                lifecycle_1.0.5            
##  [31] pkgconfig_2.0.3             gson_0.2.2                 
##  [33] Matrix_1.7-6                R6_2.6.1                   
##  [35] fastmap_1.2.0               MatrixGenerics_1.25.0      
##  [37] digest_0.6.39               aplot_0.3.2                
##  [39] enrichplot_1.99.8           ggnewscale_0.5.2           
##  [41] patchwork_1.3.2             AnnotationDbi_1.75.2       
##  [43] S4Vectors_0.51.10           aisdk_1.4.12               
##  [45] ps_1.9.3                    GenomicRanges_1.65.4       
##  [47] RSQLite_3.53.3              labeling_0.4.3             
##  [49] polyclip_1.10-7             httr_1.4.9                 
##  [51] abind_1.4-8                 compiler_4.6.1             
##  [53] withr_3.0.3                 fontquiver_0.2.1           
##  [55] bit64_4.8.6                 S7_0.2.2                   
##  [57] BiocParallel_1.47.0         DBI_1.3.0                  
##  [59] ggforce_0.5.0               HDF5Array_1.41.3           
##  [61] MASS_7.3-66                 rappdirs_0.3.4             
##  [63] DelayedArray_0.39.8         rjson_0.2.23               
##  [65] tools_4.6.1                 otel_0.2.0                 
##  [67] scatterpie_0.2.6            ape_5.8-1                  
##  [69] glue_1.8.1                  h5mread_1.5.3              
##  [71] callr_3.8.0                 nlme_3.1-171               
##  [73] GOSemSim_2.39.4             rhdf5filters_1.25.4        
##  [75] grid_4.6.1                  cluster_2.1.8.3            
##  [77] reshape2_1.4.5              generics_0.1.4             
##  [79] memuse_4.2-3                gtable_0.3.6               
##  [81] tidyr_1.3.2                 XVector_0.53.0             
##  [83] BiocGenerics_0.59.12        ggrepel_0.9.8              
##  [85] pillar_1.11.1               stringr_1.6.0              
##  [87] yulab.utils_0.2.5           GSVA_2.7.23                
##  [89] splines_4.6.1               tweenr_2.0.3               
##  [91] dplyr_1.2.1                 treeio_1.37.1              
##  [93] lattice_0.23-1              bit_4.6.0                  
##  [95] annotate_1.91.0             tidyselect_1.2.1           
##  [97] fontLiberation_0.1.0        GO.db_3.23.1               
##  [99] SingleCellExperiment_1.35.2 maketools_1.3.2            
## [101] Biostrings_2.81.9           knitr_1.52                 
## [103] fontBitstreamVera_0.1.1     IRanges_2.47.5             
## [105] Seqinfo_1.3.2               SummarizedExperiment_1.43.0
## [107] stats4_4.6.1                xfun_0.61                  
## [109] Biobase_2.73.2              matrixStats_1.5.0          
## [111] pheatmap_1.0.13             stringi_1.8.9              
## [113] lazyeval_0.2.3              ggfun_0.2.2                
## [115] yaml_2.3.12                 evaluate_1.0.5             
## [117] codetools_0.2-20            qvalue_2.45.0              
## [119] gdtools_0.5.1               tibble_3.3.1               
## [121] BiocManager_1.30.27         graph_1.91.0               
## [123] ggplotify_0.1.4             cli_3.6.6                  
## [125] systemfonts_1.3.2           xtable_1.8-8               
## [127] processx_3.9.0              jquerylib_0.1.4            
## [129] Rcpp_1.1.2                  png_0.1-9                  
## [131] XML_3.99-0.25               parallel_4.6.1             
## [133] ggplot2_4.0.3               blob_1.3.0                 
## [135] clusterProfiler_4.21.3      DOSE_4.7.3                 
## [137] sparseMatrixStats_1.25.0    SpatialExperiment_1.23.0   
## [139] tidytree_0.4.8              GSEABase_1.75.0            
## [141] ggiraph_0.9.6               enrichit_0.2.6             
## [143] scales_1.4.0                purrr_1.2.2                
## [145] crayon_1.5.3                rlang_1.3.0                
## [147] KEGGREST_1.53.6