Use this skill to run GSVA or ssGSEA pathway-level differential analysis from a bulk expression matrix and a sample group file, then generate a heatmap from the saved GSVA result object. Trigger keywords: GSVA, ssGSEA, pathway enrichment, KEGG pathway analysis, MSigDB. NOT for: gene-level differential expression, single-cell analysis, methylation analysis, clinical diagnosis.
Scanned 6/6/2026
Install to Claude Code
npx -y skills add aipoch/medical-research-skills --skill gsva-analysis-and-visualization --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Gsva Analysis And Visualization?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/aipoch-gsva-analysis-and-visualization)More formats (shields.io, HTML) on the badges page.
---
name: gsva-analysis-and-visualization
description: "Use this skill to run GSVA or ssGSEA pathway-level differential analysis from a bulk expression matrix and a sample group file, then generate a heatmap from the saved GSVA result object. Trigger keywords: GSVA, ssGSEA, pathway enrichment, KEGG pathway analysis, MSigDB. NOT for: gene-level differential expression, single-cell analysis, methylation analysis, clinical diagnosis."
license: MIT
skill-author: AIPOCH
---
# GSVA Analysis And Visualization
## When to Use
Use this skill when the user wants one of the following:
- Pathway-level GSVA or ssGSEA analysis from a bulk expression matrix plus a sample group file
- Case-vs-control or treatment-vs-control pathway enrichment comparison using GSVA plus limma
- KEGG or MSigDB pathway analysis for bulk RNA-seq or microarray-like expression data
- Heatmap generation from an existing `data/GSVA_list.rda` result object
- A reproducible CLI-backed GSVA workflow with saved tables, an `.rda` object, and a PDF heatmap
Typical request patterns:
- "Run GSVA on my bulk RNA-seq matrix and compare case vs control"
- "Use ssGSEA to score pathways and save the pathway differential results"
- "Generate a KEGG pathway heatmap from my saved GSVA result"
- "Do pathway enrichment with GSVA for these grouped bulk samples"
## Execution Model
This is a hybrid skill.
1. Use `SKILL.md` to verify that the request is in scope.
2. Use `scripts/main.R` for real execution.
3. Use `--mode analyze` to compute pathway scores and differential results.
4. Use `--mode visualize` to reuse an existing `data/GSVA_list.rda` and generate a heatmap. In visualize mode, `GSVA_list.rda` must exist in `output_dir/data/`; run `analyze` or `full` mode first if it is missing (`SKILL_FILE_NOT_FOUND` will be raised otherwise).
5. Use `--mode full` to run analysis and visualization in one pass.
6. Read reference files only when you need algorithm details, troubleshooting, or additional CLI examples.
## When to Read External Files
| Situation | File to Read | Purpose |
|-----------|--------------|---------|
| Need algorithm details | `references/algorithm.md` | Understand GSVA, limma, and heatmap generation logic |
| Need to run analysis or plotting | `scripts/main.R` | Execute the CLI entry point |
| Encounter errors | `references/troubleshooting.md` | Find standard error codes and fixes |
| Need more CLI examples or the baseline execution record | `references/cli-guide.md` | Copy ready-to-run commands and review the recorded test run |
| Need sample input files | `tests/data/` | Use the bundled demo matrix and group file |
## When Not to Use
- Gene-level differential expression: use `differential-expression-analysis` instead
- Single-cell RNA-seq clustering or communication analysis: use `sc-clustering` or `cellchat`
- Immune infiltration scoring rather than pathway enrichment: use `ssgsea-r` or `ssgsea_immune`
- Clinical diagnosis, treatment selection, or patient-specific interpretation: do not use this skill; ask for a validated clinical workflow or human expert review
If the request falls outside these boundaries, stop and tell the user that this skill only covers bulk expression pathway-level GSVA/ssGSEA analysis plus downstream heatmap visualization.
## Method Selection Guide
Choose `--method` based on your data characteristics:
- `gsva`: kernel-based enrichment scores suitable for continuous expression data with moderate-to-large sample sizes (≥ 10 samples per group recommended).
- `ssgsea`: rank-based enrichment scores; less sensitive to outliers and more suitable for noisy data or smaller sample sizes.
For detailed methodological comparison, READ: `references/algorithm.md`
## Usage
```bash
Rscript scripts/main.R \
--mode full \
--input_file tests/data/expr_matrix.csv \
--group_file tests/data/group.csv \
--case_group Tumor \
--control_group Healthy \
--species "Homo sapiens" \
--category C2 \
--subcategory KEGG \
--output_dir ./output \
--seed 42
```
## Arguments
| Short | Long | Type | Default | Description |
|-------|------|------|---------|-------------|
| `-m` | `--mode` | character | `analyze` | Run mode: `analyze`, `visualize`, or `full` |
| `-i` | `--input_file` | character | required for `analyze`/`full` | Expression matrix file (CSV or TSV, genes as rows, samples as columns) |
| `-g` | `--group_file` | character | required for `analyze`/`full` | Sample group file (CSV or TSV with sample and group columns) |
| `-a` | `--case_group` | character | required for `analyze`/`full` | Case or treatment group label |
| `-c` | `--control_group` | character | required for `analyze`/`full` | Control group label |
| `-o` | `--output_dir` | character | `./output/` | Output directory |
| `-s` | `--species` | character | `Homo sapiens` | MSigDB species |
| `-C` | `--category` | character | `C2` | MSigDB category |
| `-S` | `--subcategory` | character | `KEGG` | MSigDB subcategory |
| | `--method` | character | `gsva` | GSVA method: `gsva` or `ssgsea` (see Method Selection Guide above) |
| | `--kcdf` | character | `Gaussian` | GSVA kernel: `Gaussian`, `Poisson`, or `none` |
| | `--min_sz` | integer | `2` | Minimum gene set size |
| | `--max_sz` | integer | `10000` | Maximum gene set size |
| | `--parallel_sz` | integer | `1` | Parallel worker count passed to GSVA |
| | `--mx_diff` | logical | `TRUE` | GSVA `mx.diff` flag |
| | `--tau` | double | `1` | GSVA `tau` value |
| | `--fdr_threshold` | double | `0.05` | FDR threshold used to select top pathways |
| | `--top_n` | integer | `20` | Number of pathways exported to the top score matrix |
| | `--seed` | integer | `42` | Random seed |
| | `--timeout_seconds` | integer | `0` | Optional timeout in seconds; `0` disables it |
| | `--plot_file` | character | `GSVA_heatmap.pdf` | Heatmap file name under `plot/` (file name only; no path separators) |
| | `--plot_title` | character | `GSVA Enrichment Heatmap` | Heatmap title |
| | `--width` | double | `14` | Heatmap width in inches |
| | `--height` | double | `8` | Heatmap height in inches |
| | `--colors` | character | `#91bfdb,#ffffbf,#fc8d59` | Comma-separated heatmap colors |
| | `--scale` | character | `none` | Heatmap scale mode: `none`, `row`, or `column` |
| | `--cluster_rows` | logical | `TRUE` | Cluster heatmap rows |
| | `--cluster_cols` | logical | `FALSE` | Cluster heatmap columns |
| | `--show_rownames` | logical | `TRUE` | Show pathway names on the heatmap |
| | `--show_colnames` | logical | `FALSE` | Show sample names on the heatmap |
| | `--fontsize` | double | `10` | Base heatmap font size |
| | `--fontsize_row` | double | `8` | Row label font size |
| | `--fontsize_col` | double | `9` | Column label font size |
| | `--legend_cex` | double | `1` | Legend text scaling factor |
| | `--top_up` | integer | optional | Number of up-regulated pathways retained for plotting |
| | `--top_down` | integer | optional | Number of down-regulated pathways retained for plotting |
| | `--top_mode` | character | `both` | Heatmap subset mode: `both`, `up`, `down`, or `total` |
| | `--sort_by` | character | `FDR` | Pathway ranking: `FDR`, `absLFC`, or `LFC` |
| | `--append_stats` | logical | `FALSE` | Append `FDR` and `logFC` to heatmap labels |
| | `--label_max_chars` | integer | `80` | Maximum heatmap label length |
## Input Format
### Expression Matrix
- CSV or TSV file
- First column contains gene identifiers
- Remaining columns are sample names
- Values must be numeric and contain no missing values
Example:
```csv
gene,S1,S2,S3,S4
TP53,8.1,7.9,6.5,6.3
EGFR,5.2,5.0,4.2,4.1
```
The bundled `tests/data/expr_matrix.csv` is derived from the public GEO series `GSE44076` after probe-to-gene collapsing and contains the `Tumor` versus `Healthy` subset.
### Group File
- CSV or TSV file with a header row
- One sample column: `sample`, `sample_name`, or `sample_id`
- One group column: `group`, `condition`, `cluster`, or `class`
- Sample names must match the expression matrix columns
Example:
```csv
sample,group
GSM1077746,Tumor
GSM1077747,Tumor
GSM1077598,Healthy
GSM1077599,Healthy
```
## Output Files
| File | Description |
|------|-------------|
| `table/GSVA_diff.csv` | limma differential pathway results with `logFC`, `P.Value`, and `adj.P.Val` |
| `table/GSVA_enrichment_results.csv` | Full GSVA score matrix |
| `table/GSVA_enrichment_results_topN.csv` | Top pathway score matrix selected by `--top_n` and `--fdr_threshold` |
| `data/GSVA_list.rda` | Saved `gsva_result` object for downstream visualization |
| `plot/GSVA_heatmap.pdf` | Heatmap PDF generated in `visualize` or `full` mode |
| `session_info.txt` | R session and package version information |
| `output_manifest.txt` | Append-only manifest of generated outputs across runs in the same `output_dir` |
| `run_record.txt` | Append-only run log with parameters, runtime, and output summaries across runs in the same `output_dir` |
### table/GSVA_diff.csv
| Column | Type | Description |
|--------|------|-------------|
| `logFC` | numeric | limma-estimated pathway score difference between case and control |
| `AveExpr` | numeric | Average pathway score across all samples |
| `t` | numeric | Moderated t statistic from limma |
| `P.Value` | numeric | Raw p-value from limma |
| `adj.P.Val` | numeric | Benjamini-Hochberg adjusted p-value |
| `B` | numeric | Log-odds that the pathway is differentially enriched |
| `geneset` | character | Pathway identifier used in the GSVA run |
## Workflow
### Step 1: Validate Input
- Check that the expression matrix and group file exist
- Validate supported columns and matching sample names
- Validate CLI ranges and mode-specific required parameters
### Step 2: Run Pathway Analysis
- Load MSigDB gene sets for the requested species and collection
- Compute GSVA or ssGSEA scores for each sample
- Fit a limma model for the case-vs-control pathway comparison
### Step 3: Generate Output
- Save the full score matrix, top pathway subset, and differential results to `table/`
- Save the reusable `gsva_result` object to `data/GSVA_list.rda`
- Generate the heatmap PDF in `plot/` when running `visualize` or `full`
- Append a new section to `output_manifest.txt` and `run_record.txt` for each invocation so earlier provenance is preserved when reusing one `output_dir`
## Examples
### Basic Usage
```bash
Rscript scripts/main.R \
--mode full \
--input_file ./expression_matrix.csv \
--group_file ./group_info.csv \
--case_group treatment \
--control_group control \
--output_dir ./output
```
### With ssGSEA and Custom Parameters
```bash
Rscript scripts/main.R \
--mode analyze \
--input_file ./expression_matrix.csv \
--group_file ./group_info.csv \
--case_group treatment \
--control_group control \
--method ssgsea \
--top_n 30 \
--fdr_threshold 0.1 \
--output_dir ./ssgsea_output \
--seed 123
```
### Reuse a Saved Result Object
```bash
Rscript scripts/main.R \
--mode visualize \
--output_dir ./output \
--plot_file custom_heatmap.pdf \
--top_up 10 \
--top_down 10 \
--top_mode both
```
For the bundled real-data baseline record, READ: `references/cli-guide.md`
## Error Handling
| Error Code | Meaning | Solution |
|------------|---------|----------|
| `SKILL_FILE_NOT_FOUND` | Input file or saved result file is missing; in visualize mode, `GSVA_list.rda` must exist in `output_dir/data/` — run analyze or full mode first | Check the path and rerun with the correct file |
| `SKILL_MISSING_COLUMNS` | Group file lacks a valid sample or group column | Rename the columns to a supported name |
| `SKILL_SAMPLE_MISMATCH` | Sample names do not match between files | Align sample names before running the skill |
| `SKILL_EMPTY_DATA` | Input matrix, gene set query, or plotting matrix is empty | Verify the input matrix and MSigDB settings |
| `SKILL_INVALID_PARAMETER` | A CLI argument is missing or out of range | Review the parameter table and rerun |
| `SKILL_PACKAGE_NOT_FOUND` | Required R packages are not installed | Install the missing packages listed in `references/cli-guide.md` |
If the error persists, READ: `references/troubleshooting.md`
## Input Validation
This skill accepts:
- A bulk expression matrix file in CSV or TSV format with genes as rows and samples as columns
- A sample group file with one supported sample column and one supported group column
- A valid case/control comparison for pathway-level GSVA or ssGSEA analysis
- Optional heatmap customization parameters for visualization of a saved `GSVA_list.rda`
Privacy and data-handling note:
- If your matrix or group file can be linked to patients or protected records, anonymize it before use
- This workflow writes result tables, a saved R object, plots, and session metadata to the local `output_dir`
- Review local output retention practices before using sensitive material
If the user's request does not involve bulk expression pathway enrichment analysis or GSVA heatmap generation — for example, asking for single-cell analysis, gene-level DE testing, methylation analysis, or clinical diagnosis — do not proceed with this workflow. Instead respond:
> "gsva-analysis-and-visualization is designed for bulk expression pathway-level GSVA/ssGSEA analysis and saved-result heatmap visualization. Your request appears to be outside this scope. Please provide a bulk expression matrix plus sample group file for GSVA/ssGSEA analysis, or use a more appropriate skill for your task."
## Testing
```bash
Rscript scripts/main.R --help
Rscript tests/run_tests.R
Rscript scripts/main.R \
--mode full \
--input_file tests/data/expr_matrix.csv \
--group_file tests/data/group.csv \
--case_group Tumor \
--control_group Healthy \
--species "Homo sapiens" \
--category C2 \
--subcategory KEGG \
--output_dir tests/output \
--seed 42
```
Expected outputs:
- `tests/output/table/GSVA_diff.csv`
- `tests/output/table/GSVA_enrichment_results.csv`
- `tests/output/table/GSVA_enrichment_results_topN.csv`
- `tests/output/data/GSVA_list.rda`
- `tests/output/plot/GSVA_heatmap.pdf`
- `tests/output/session_info.txt`
- `tests/output/output_manifest.txt`
- `tests/output/run_record.txt`
Optional post-check:
```bash
Rscript tests/test_skill.R tests/output
```
`tests/run_tests.R` executes the full demo workflow, validates the expected output files, then reruns `visualize` in the same `output_dir` to confirm that `output_manifest.txt` and `run_record.txt` preserve both run sections.
## References
1. Hanzelmann S, Castelo R, Guinney J. (2013) GSVA: gene set variation analysis for microarray and RNA-seq data. *BMC Bioinformatics*. doi:10.1186/1471-2105-14-7
2. Ritchie ME, Phipson B, Wu D, et al. (2015) limma powers differential expression analyses for RNA-sequencing and microarray studies. *Nucleic Acids Research*. doi:10.1093/nar/gkv007
3. Liberzon A, Birger C, Thorvaldsdottir H, et al. (2015) The Molecular Signatures Database Hallmark Gene Set Collection. *Cell Systems*. doi:10.1016/j.cels.2015.12.004
For detailed algorithm notes, READ: `references/algorithm.md`
## Implementation Checklist
- [x] CLI parsing with `optparse`
- [x] `set.seed()` for reproducibility
- [x] Only CRAN/Bioconductor packages
- [x] Documented parameters match script
- [x] `get_script_dir()` defined before any call to it
- [x] File reading instructions in `SKILL.md`
- [x] Test data provided in `tests/data/`
- [x] Error handling implemented with `SKILL_*` messages
- [x] `Rscript scripts/main.R --help` works
No comments yet. Be the first to comment!