Use when performing sample-level dimensionality reduction and visualization on abundance or OTU-style matrices with a companion group file, generating UMAP and/or t-SNE coordinates and plots for group separation assessment. NOT for: differential expression testing, single-cell workflows requiring dedicated embeddings pipelines, or analyses without a sample grouping file.
Scanned 6/6/2026
Install via CLI
openskills install aipoch/medical-research-skills---
name: umap-tsne-analysis
description: "Use when performing sample-level dimensionality reduction and visualization on abundance or OTU-style matrices with a companion group file, generating UMAP and/or t-SNE coordinates and plots for group separation assessment. NOT for: differential expression testing, single-cell workflows requiring dedicated embeddings pipelines, or analyses without a sample grouping file."
license: MIT
skill-author: AIPOCH
---
# UMAP and t-SNE Analysis
## Prerequisites
Run the following before the first analysis to install all required R packages:
```bash
Rscript scripts/install_dependencies.R
```
Alternative manual installation:
```bash
Rscript -e "install.packages(c('optparse','data.table','Rtsne','umap','ggplot2','vegan','R.utils'), repos='https://cloud.r-project.org')"
```
> Note: `R.utils` is only required when `--timeout > 0`, but pre-installing it avoids environment drift across runs. `testthat` is installed by `scripts/install_dependencies.R` as the development test dependency.
**The skill cannot run until these packages are installed.** In new or bare R environments, always run the prerequisite step first.
---
## When to Read External Files
| Situation | File to Read | Purpose |
|-----------|--------------|---------|
| **Need algorithm details** | `references/algorithm.md` | Dimensionality reduction methods, assumptions, parameter interpretation |
| **Need to run analysis** | `scripts/main.R` | Execute: `Rscript scripts/main.R --input_file ... --group_file ...` |
| **Encounter errors** | `references/troubleshooting.md` | Common errors and solutions |
| **Need CLI examples** | `references/cli-guide.md` | Detailed CLI usage examples |
| **Need test data** | `tests/data/` | Sample input files for testing |
---
## Usage
```bash
Rscript scripts/main.R \
--input_file ./otu_table.csv \
--group_file ./group_info.csv \
--output_dir ./output/ \
--method both \
--seed 42
```
---
## Arguments
| Short | Long | Type | Default | Description |
|-------|------|------|---------|-------------|
| `-i` | `--input_file` | character | **required** | Abundance / OTU matrix file |
| `-g` | `--group_file` | character | **required** | Group information file |
| `-o` | `--output_dir` | character | `./output/` | Output directory |
| `-m` | `--method` | character | `both` | Method: `tsne`, `umap`, or `both` |
| | `--sample_id_col` | character | first column | Sample ID column in group file |
| | `--group_col` | character | second column | Group column in group file |
| | `--perplexity` | numeric | `25` | t-SNE perplexity |
| | `--theta` | numeric | `0.0` | t-SNE theta |
| | `--pca` | logical | `FALSE` | Whether to use PCA before t-SNE |
| | `--check_duplicates` | logical | `FALSE` | Whether t-SNE should check duplicated rows |
| | `--normalize` | logical | `TRUE` | Whether to normalize data before UMAP |
| | `--norm_method` | character | `hellinger` | Normalization method for `vegan::decostand()` |
| | `--n_neighbors` | integer | `10` | UMAP neighborhood size |
| `-s` | `--seed` | integer | `42` | Random seed for reproducibility |
| `-t` | `--timeout` | integer | `0` | Timeout in seconds; `0` disables timeout |
---
## Dependency Baseline
The skill was validated with the exact package baseline recorded in `dependencies.lock.tsv`.
| Package | Tested Version |
|---------|----------------|
| `optparse` | `1.7.5` |
| `data.table` | `1.15.4` |
| `Rtsne` | `0.17` |
| `umap` | `0.2.10.0` |
| `ggplot2` | `3.4.0` |
| `vegan` | `2.7.3` |
| `R.utils` | `2.13.0` |
| `testthat` | `3.1.2` |
Use this file as the reproducibility baseline when validating a new environment.
---
## Input Format
### Abundance / OTU Matrix (`input_file`)
Features as rows, samples as columns, CSV/TSV-like tabular file with feature ID in the first column.
```csv
OTU_ID,S1,S2,S3,S4
OTU_1,10,3,0,5
OTU_2,2,8,1,0
OTU_3,0,0,6,9
```
### Group File (`group_file`)
Tabular file with at least two columns: sample ID and group label.
```csv
SampleID,Group
S1,Control
S2,Control
S3,Treatment
S4,Treatment
```
Requirements:
- At least 2 groups with at least 2 samples per group are required.
- All sample IDs in the group file must exist in the matrix columns.
- Single-group inputs will produce a `SKILL_INVALID_PARAMETER` error because dimensionality reduction without group contrast produces uninterpretable plots.
---
## Output Files
| File | Description |
|------|-------------|
| `table/tsne_coordinates.csv` | t-SNE coordinates with sample and group annotations |
| `table/umap_coordinates.csv` | UMAP coordinates with sample and group annotations |
| `plot/tsne_plot.pdf` | t-SNE scatter plot with group colors and ellipses |
| `plot/umap_plot.pdf` | UMAP scatter plot with group colors and ellipses |
| `data/session_info.txt` | R session and package version info |
| `data/analysis_data.rda` | Saved analysis object with aligned matrix, metadata, colors, and runtime parameters |
---
## Workflow
### Step 1: Validate Input
- Check that matrix file and group file exist
- Resolve sample ID and group columns
- Validate at least 2 groups and at least 2 samples per group
- Ensure all group-file sample IDs exist in the matrix
- Remove samples with zero total abundance after alignment if needed
### Step 2: Prepare Matrix
- Convert input table into numeric matrix
- Align matrix columns to sample order from the group file
- Transpose matrix so rows become samples and columns become features
### Step 3: Run Dimensionality Reduction
- Run t-SNE if `--method tsne` or `--method both`
- Run UMAP if `--method umap` or `--method both`
- Apply fixed random seed for reproducibility
### Step 4: Generate Visualizations
- Plot sample embeddings
- Color points by group
- Draw group ellipses when enabled
- Save PDF outputs
---
## Methods
### t-SNE
t-SNE is a non-linear dimensionality reduction method that preserves local neighborhood structure. It is useful for identifying local sample clustering patterns.
### UMAP
UMAP is a manifold learning method that aims to preserve both local and some global structure. It is often faster than t-SNE and can produce stable low-dimensional embeddings when parameters are chosen appropriately.
### Normalization
When `--normalize TRUE`, the script uses `vegan::decostand()` with the selected `--norm_method` before UMAP. This is helpful for abundance-style ecological matrices.
---
## Agent Response Contract
After a successful run, report:
1. **Method(s) run** (tsne, umap, or both)
2. **Sample count** and **group count** processed
3. **Key parameters** used (perplexity for t-SNE, n_neighbors for UMAP)
4. **Group separation quality** (describe visible clustering from coordinate ranges if accessible)
5. **Artifact paths**: coordinate CSV(s) and plot PDF(s) produced
---
## Examples
### Basic Usage
```bash
Rscript scripts/main.R \
-i otu_table.csv \
-g group_info.csv \
-o ./output \
-m both
```
### Only t-SNE
```bash
Rscript scripts/main.R \
-i otu_table.csv \
-g group_info.csv \
-o ./output \
-m tsne \
--perplexity 10
```
### Only UMAP with Custom Group Column
```bash
Rscript scripts/main.R \
-i otu_table.csv \
-g metadata.csv \
-o ./output \
-m umap \
--sample_id_col SampleID \
--group_col Treatment \
--n_neighbors 15
```
---
## Error Handling
### Common Errors
| Error | Cause | Solution |
|-------|-------|----------|
| `SKILL_FILE_NOT_FOUND` | Input file does not exist | Check file path |
| `SKILL_MISSING_COLUMNS` | Group or matrix file lacks required columns | Verify file format |
| `SKILL_SAMPLE_MISMATCH` | Sample IDs in group file do not match matrix columns | Check sample naming consistency |
| `SKILL_EMPTY_DATA` | Matrix becomes empty after preprocessing | Check input values and filtering |
| `SKILL_INVALID_PARAMETER` | Invalid method, invalid parameter value, or single-group input | Adjust CLI arguments; ensure at least 2 groups are present |
| `SKILL_PACKAGE_NOT_FOUND` | Required R package is missing | Run `Rscript scripts/install_dependencies.R`; note that file errors will only surface after packages are installed |
| `SKILL_TIMEOUT` | Analysis exceeded the configured timeout | Increase `--timeout` or set `--timeout 0` |
**IF error persists**, READ: `references/troubleshooting.md`
**Troubleshooting note:** In environments where packages are not yet installed, `SKILL_PACKAGE_NOT_FOUND` will fire before file-validation errors. Install dependencies first, then re-run to expose any file-related errors.
---
## Input Validation
This skill accepts:
1. An abundance or OTU-style feature matrix (CSV/TSV, features as rows, samples as columns)
2. A group file with at least two groups (CSV/TSV, sample IDs and group labels)
If the user's request does not involve UMAP or t-SNE dimensionality reduction for group separation visualization — for example, asking to run differential expression testing, process single-cell RNA-seq with specialized pipelines, perform clustering without a group file, or impute missing values — do not proceed with the workflow. Instead respond:
> "UMAP and t-SNE Analysis is designed to perform sample-level dimensionality reduction and visualization on abundance or OTU-style matrices. Your request appears to be outside this scope. Please provide a feature matrix and group file for UMAP/t-SNE, or use a more appropriate tool for differential expression testing, single-cell analysis, or clustering."
---
## Testing
### Test with Sample Data
```bash
Rscript scripts/install_dependencies.R
Rscript scripts/main.R --help
Rscript scripts/main.R \
-i tests/data/otu_table.csv \
-g tests/data/group_info.csv \
-o tests/output/ \
-m both
Rscript tests/test_skill.R
Rscript tests/run_smoke_test.R
```
### Validation Commands
```bash
ls -la tests/output/
ls -la tests/output/table
ls -la tests/output/plot
ls -la tests/output/data
wc -l tests/output/table/tsne_coordinates.csv
wc -l tests/output/table/umap_coordinates.csv
```
The canonical sample data live in `tests/data/`. Use those files for examples, smoke tests, and regression checks. The canonical output layout is `output_dir/table`, `output_dir/plot`, and `output_dir/data`.
---
## Implementation Checklist
- [x] CLI parsing with `optparse`
- [x] `set.seed()` for reproducibility
- [x] `requireNamespace()` dependency checks
- [x] Dependency bootstrap script
- [x] Session info recording
- [x] File reading instructions in SKILL.md
- [x] Modular script structure
- [x] Error handling with SKILL_* codes
- [x] Test data provided in `tests/data/`
- [x] Version-pinned dependency baseline in `dependencies.lock.tsv`
- [x] Automated `testthat` coverage for validation and plotting edge cases
- [x] Scripts in `scripts/` directory
- [x] References in `references/` directory
---
*Last updated: 2026-04-27 | Version: 1.1.0*
No comments yet. Be the first to comment!