Run GSEA on a ranked gene list and produce the enrichment table, running-score table, and enrichment plots.
Scanned 6/6/2026
Install via CLI
openskills install aipoch/medical-research-skills---
name: gsea
description: Run GSEA on a ranked gene list and produce the enrichment table, running-score table, and enrichment plots.
license: MIT
author: AIPOCH
---
> **Source**: [https://github.com/aipoch/medical-research-skills](https://github.com/aipoch/medical-research-skills)
## When to read external files
| Situation | Read | Purpose |
|---|---|---|
| Need algorithm details | `references/algorithm.md` | Statistical method and formulas |
| Need to run an analysis | `scripts/main.R` | Full command reference |
| Hit an error | `references/troubleshooting.md` | Look up error codes and fixes |
| Need CLI examples | `references/cli-guide.md` | Worked argument examples |
## Scope
Use this skill for:
- Running GSEA on a gene list ranked by a statistic
- Generating enrichment curve plots from existing `enrichGSEA.csv` and `gsea_running_scores.csv`
- Smoke-testing the pipeline with `tests/data/sample_deg_results.csv`
Do not use it for:
- Differential expression on raw expression matrices
- Single-sample ssGSEA
- Network analysis or multi-omics integration
## Usage
Analysis mode:
`Rscript scripts/main.R --input tests/data/sample_deg_results.csv --outdir ./GSEA_analysis --type KEGG --species human --seed 42 --timeout 300`
Plot mode:
`Rscript scripts/main.R --running_file ./GSEA_analysis/Table/gsea_running_scores.csv --enrich_file ./GSEA_analysis/Table/enrichGSEA.csv --plot_output ./GSEA_analysis/plot/gsea_plot.pdf --top_n 5 --plot_format pdf --seed 42 --timeout 300`
See `references/cli-guide.md` for more.
Mode selection:
- Passing only `--input` runs analysis mode
- Passing both `--running_file` and `--enrich_file` runs plot mode
- If both sets of arguments are provided, plot mode takes precedence; analysis mode is skipped and a warning is logged
## Arguments
### Analysis-mode arguments
| Short | Long | Type | Default | Required | Description |
|---|---|---|---|---|---|
| `-i` | `--input` | character | `NULL` | yes | Input CSV file |
| `-o` | `--outdir` | character | `GSEA_analysis` | no | Output directory |
| `-g` | `--gene_col` | character | `name` | no | Gene column name |
| `-f` | `--fc_col` | character | `logFC` | no | Ranking-statistic column name |
| `-t` | `--type` | character | `KEGG` | no | Gene-set type: `KEGG`, `HALLMARKS`, `GO_BP`, `GO_MF`, `GO_CC`. With a preloaded RDS, `HALLMARKS` is automatically mapped to the asset key `Hallmarks` |
| `-s` | `--species` | character | `human` | no | Species: `human`, `mouse`, `rat` |
| `-p` | `--pvalue_cutoff` | numeric | `0.05` | no | Significance threshold |
| `-m` | `--method` | character | `fgsea` | no | GSEA backend: `fgsea` or `DOSE` |
| `-c` | `--chunk_size` | numeric | `1000` | no | Chunk size for large gene-set conversion |
| `-r` | `--rds_path` | character | `NULL` | no | Path to a pre-stored gene-set RDS |
| `-v` | `--verbose` | logical | `FALSE` | no | Verbose logging |
| | `--seed` | integer | `42` | no | Random seed |
| | `--timeout` | integer | `300` | no | Timeout in seconds; `<=0` disables it |
| `-h` | `--help` | logical | `FALSE` | no | Show help |
### Plot-mode arguments
| Short | Long | Type | Default | Required | Description |
|---|---|---|---|---|---|
| | `--running_file` | character | `NULL` | yes | Path to `gsea_running_scores.csv` |
| | `--enrich_file` | character | `NULL` | yes | Path to `enrichGSEA.csv` |
| | `--plot_output` | character | `gsea_plot.pdf` | no | Output plot path |
| | `--plot_width` | numeric | `8` | no | Plot width |
| | `--plot_height` | numeric | `6` | no | Plot height |
| | `--plot_format` | character | `pdf` | no | Output format: `pdf` or `png` |
| | `--top_n` | numeric | `1` | no | Number of top pathways to plot when `geneSetID` is not given |
| | `--rank_by` | character | `p.adjust` | no | Column used to rank pathways |
| | `--geneSetID` | character | `""` | no | Comma-separated pathway IDs |
| | `--plot_title` | character | `""` | no | Plot title |
| | `--colors` | character | `#4DBBD5,#E64B35,#00A087,#F39B7F,#3C5488,#8491B4` | no | Color list |
| | `--base_size` | numeric | `11` | no | Base font size |
| | `--subplots` | character | `1,2,3` | no | Sub-panel indices to display |
| | `--rel_heights` | character | `1.5,0.8,1` | no | Relative panel heights |
| | `--NES_table` | logical | `TRUE` | no | Show NES annotation |
| | `--no_NES_table` | logical | `FALSE` | no | Disable NES annotation |
| | `--NES_label_size` | numeric | `4` | no | NES label font size |
| | `--NES_label_x` | numeric | `0.75` | no | NES label x position |
| | `--NES_label_y` | numeric | `0.75` | no | NES label y position |
| | `--NES_label_color` | character | `black` | no | NES label color |
| | `--NES_label_hjust` | numeric | `0` | no | NES label horizontal justification |
| | `--NES_label_vjust` | numeric | `1` | no | NES label vertical justification |
| | `--line_width` | numeric | `1` | no | ES line width |
| | `--dot_size` | numeric | `1.2` | no | ES dot size |
| | `--legend_position` | character | `auto` | no | Legend position |
| | `--legend_x` | numeric | `0.02` | no | Inset legend x coordinate |
| | `--legend_y` | numeric | `0.02` | no | Inset legend y coordinate |
| | `--legend_just_x` | numeric | `0` | no | Legend horizontal justification |
| | `--legend_just_y` | numeric | `0` | no | Legend vertical justification |
| | `--legend_text_size` | numeric | `9` | no | Legend text size |
| | `--legend_key_size` | numeric | `0.6` | no | Legend key size |
| | `--legend_bg_alpha` | numeric | `0` | no | Legend background alpha |
| | `--grid_major_color` | character | `grey92` | no | Major grid color |
| | `--grid_minor_color` | character | `grey92` | no | Minor grid color |
| | `--ylab_es` | character | `Enrichment Score` | no | ES panel y-axis title |
| | `--ylab_rank` | character | `Ranked List Metric` | no | Rank panel y-axis title |
| | `--xlab_rank` | character | `Rank in Ordered Dataset` | no | Rank panel x-axis title |
| | `--hit_height` | numeric | `1` | no | Hit-bar height |
| | `--hit_gap` | numeric | `0` | no | Hit-bar gap |
| | `--hit_linewidth` | numeric | `0.5` | no | Hit-bar line width |
| | `--rank_bar_alpha` | numeric | `0.9` | no | Rank-bar alpha |
| | `--rank_bar_height_ratio` | numeric | `0.3` | no | Rank-bar height ratio |
| | `--rank_metric_segment_color` | character | `grey` | no | Rank-line color |
| | `--rank_metric_segment_width` | numeric | `0.3` | no | Rank-line width |
| | `--rank_metric_segment_alpha` | numeric | `1` | no | Rank-line alpha |
| | `--pvalue_table` | logical | `FALSE` | no | Show p-value table |
| | `--ES_geom` | character | `line` | no | ES geometry: `line` or `dot` |
| | `--verbose` | logical | `FALSE` | no | Verbose logging |
| | `--seed` | integer | `42` | no | Random seed |
| | `--timeout` | integer | `300` | no | Timeout in seconds; `<=0` disables it |
| `-h` | `--help` | logical | `FALSE` | no | Show help |
## Input format
Analysis-mode input is a CSV with at least:
- a gene column (default name `name`)
- a ranking-statistic column (default name `logFC`)
Example:
```csv
name,logFC,pvalue,padj
TP53,2.5,0.001,0.01
BRCA1,1.8,0.005,0.02
EGFR,-1.2,0.01,0.05
```
Value constraints:
- `type` accepts `KEGG`, `HALLMARKS`, `GO_BP`, `GO_MF`, `GO_CC`
- When using a preloaded RDS, `HALLMARKS` is automatically matched to the asset key `Hallmarks`
- `species` accepts `human`, `mouse`, `rat`
## Output files
| File | Format | Description |
|---|---|---|
| `data/GSEA_list.rda` | RDA | Full GSEA result object |
| `Table/enrichGSEA.csv` | CSV | Enrichment result table |
| `Table/gsea_running_scores.csv` | CSV | Running-score table; if no enrichment passes, a header-only file is still written |
| `plot/` | directory | Plot output directory |
| `session_info.txt` | TXT | R version and package versions |
`enrichGSEA.csv` mainly contains: `ID`, `Description`, `NES`, `pvalue`, `p.adjust`, `core_enrichment`.
## Error handling
Common error codes:
- `SKILL_FILE_NOT_FOUND`: input file does not exist
- `SKILL_MISSING_COLUMNS`: required columns are missing
- `SKILL_EMPTY_DATA`: input is empty, or empty after filtering
- `SKILL_INVALID_PARAMETER`: an argument has an invalid value
- `SKILL_PACKAGE_NOT_FOUND`: a required package is not installed
- `SKILL_ANALYSIS_FAILED`: GSEA still failed after retries
Triage doc: `references/troubleshooting.md`
Exit codes:
- `0`: success
- `1`: failure
## Testing
Minimal test dataset: `tests/data/sample_deg_results.csv`
Minimal command:
`Rscript scripts/main.R --input tests/data/sample_deg_results.csv --outdir ./test_output --type KEGG --species human --seed 42 --timeout 300 --verbose`
Expected output:
- `./test_output/data/GSEA_list.rda`
- `./test_output/Table/enrichGSEA.csv`
- `./test_output/Table/gsea_running_scores.csv`
- `./test_output/session_info.txt`
- If no significant enrichment is found, `gsea_running_scores.csv` is still written but contains only the header
- Exit code `0`
No comments yet. Be the first to comment!