Back to skills
SKILL.md
Proteomics Diff Exp
ASecurityDifferential protein expression analysis for TMT/LFQ mass spectrometry proteomics data using limma linear models with DEqMS PSM-count-aware variance correction.
- 171 stars
- 0 votes
- 0 copies
- 0 views
- Added September 6, 2026
Works with
Security analysis
100/100npx -y skills add BioTender-max/awesome-bio-agent-skills --skill proteomics-diff-exp --agent claude-codeAre you the author of Proteomics Diff Exp?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/biotender-max-proteomics-diff-exp)---
id: proteomics-diff-exp
name: Proteomics Differential Expression (limma + DEqMS)
category: proteomics_metabolomics
short-description: "Differential protein expression analysis on mass spectrometry proteomics data using limma and DEqMS with PSM-aware variance estimation."
detailed-description: "Analyze TMT or LFQ mass spectrometry proteomics data for differential protein expression. Uses limma linear models with DEqMS spectra-count-aware empirical Bayes variance estimation for improved statistical power. Supports MaxQuant, Proteome Discoverer, or generic protein intensity matrices. Includes missing value imputation (MinProb/kNN), normalization, QC visualization, and publication-quality plots."
starting-prompt: Perform differential protein expression analysis on my proteomics mass spectrometry data.
---
# Proteomics Differential Expression (limma + DEqMS)
Differential protein expression analysis for TMT/LFQ mass spectrometry proteomics data using limma linear models with DEqMS PSM-count-aware variance correction.
## When to Use This Skill
Use this skill when you have:
- ✅ **Protein quantification data** from TMT or LFQ mass spectrometry
- ✅ **PSM/peptide counts per protein** (for DEqMS variance correction)
- ✅ **Biological replicates** (≥2 per condition, ≥3 recommended)
- ✅ Need for **PSM-aware statistical testing** (improved power over standard limma)
**Don't use this skill for:**
- ❌ RNA-seq data → use bulk-rnaseq-counts-to-de-deseq2
- ❌ Metabolomics data → different normalization/statistics needed
- ❌ Pre-computed fold changes without raw intensities
## Quick Start (Example Data)
**Test this skill with real TMT proteomics data in ~2 minutes:**
```r
source("scripts/load_example_data.R")
data <- load_example_data() # Auto-downloads A431 TMT 10-plex data (~30s)
psm_data <- data$psm_data # 316,726 PSMs × 10 TMT channels
metadata <- data$metadata # 4 conditions: ctrl, miR191, miR372, miR519
# Run complete workflow
source("scripts/basic_workflow.R") # Creates fit_deqms, deqms_results + prints summary
```
**What you get:**
- **Dataset:** A431 human epidermoid carcinoma cells treated with miRNAs (TMT 10-plex)
- **Comparison:** miR372 vs ctrl (3 vs 3 replicates)
- **Expected results:** ~9,000 proteins quantified, significant DE proteins at adj.p < 0.05
**For your own data:** Replace data loading with your protein intensity matrix and metadata (see [Inputs](#inputs) section).
## Installation
**Core packages (required):**
```r
options(repos = c(CRAN = "https://cloud.r-project.org"))
if (!require('BiocManager', quietly = TRUE)) install.packages('BiocManager')
BiocManager::install(c('limma', 'DEqMS', 'ExperimentHub'))
```
**Visualization packages (required):**
```r
install.packages(c('ggplot2', 'ggprism', 'ggrepel', 'circlize', 'matrixStats'))
BiocManager::install('ComplexHeatmap')
```
**Optional packages:**
```r
install.packages(c('rmarkdown', 'knitr')) # PDF report
BiocManager::install(c('impute', 'vsn')) # kNN imputation, VSN normalization
```
| Software | Version | License | Commercial Use | Installation |
|----------|---------|---------|----------------|--------------|
| limma | ≥3.50.0 | GPL (≥2) | ✅ Permitted | `BiocManager::install('limma')` |
| DEqMS | ≥1.12.0 | LGPL | ✅ Permitted | `BiocManager::install('DEqMS')` |
| ExperimentHub | ≥2.0.0 | Artistic-2.0 | ✅ Permitted | `BiocManager::install('ExperimentHub')` |
| ggplot2 | ≥3.4.0 | MIT | ✅ Permitted | `install.packages('ggplot2')` |
| ggprism | ≥1.0.3 | GPL (≥3) | ✅ Permitted | `install.packages('ggprism')` |
| ggrepel | ≥0.9.0 | GPL-3 | ✅ Permitted | `install.packages('ggrepel')` |
| ComplexHeatmap | ≥2.10.0 | MIT | ✅ Permitted | `BiocManager::install('ComplexHeatmap')` |
| circlize | ≥0.4.15 | MIT | ✅ Permitted | `install.packages('circlize')` |
| matrixStats | ≥0.60.0 | Artistic-2.0 | ✅ Permitted | `install.packages('matrixStats')` |
| rmarkdown | ≥2.20 | GPL-3 | ✅ Permitted | Optional |
**Note:** Scripts automatically generate both PNG and SVG formats. SVG export uses base R svg() device (always available) or svglite if installed. No additional setup needed.
## Inputs
**Required:**
- **Protein intensity matrix**: Rows = proteins, Columns = samples
- PSM-level table with gene/protein column (recommended — enables medianSweeping aggregation)
- OR protein-level intensities (log2 or raw)
- **Sample metadata**: data.frame with `condition` column
**Optional but recommended:**
- **PSM/peptide counts per protein** (critical for DEqMS variance correction)
**Supported formats:** MaxQuant proteinGroups.txt, Proteome Discoverer export, generic CSV/TSV
## Outputs
**Result tables (CSV):**
- `all_results.csv` — Full DEqMS results (logFC, sca.P.Value, sca.adj.pval, count)
- `significant_results.csv` — Filtered by adjusted p-value and fold change
- `normalized_protein_matrix.csv` — Log2 normalized protein intensities
- `psm_counts.csv` — PSM counts per protein
- `top100_proteins.csv` — Top 100 by DEqMS adjusted p-value
**Analysis objects (RDS):**
- `analysis_object.rds` — Complete analysis object for downstream skills
- Load with: `obj <- readRDS('results/analysis_object.rds')`
- Contains: fit_deqms, deqms_results, protein_matrix, metadata, psm_counts
**Plots (PNG + SVG):**
- `intensity_distribution` — Before/after normalization boxplots
- `missing_values_heatmap` — Missing value pattern across samples
- `pca_plot` — PCA colored by condition
- `sample_correlation_heatmap` — Pearson correlation between samples
- `volcano_plot` — Differential expression with labeled top hits
- `ma_plot` — Log2 fold change vs average expression
- `variance_psm_plot` — DEqMS variance vs PSM count relationship
**Reports:**
- `analysis_report.pdf` — PDF report (requires rmarkdown + LaTeX)
- `analysis_report.md` — Markdown report (always generated)
## Clarification Questions
### 1. **Input Files** (ASK THIS FIRST):
- Do you have proteomics data files to analyze?
- If uploaded: What format? (MaxQuant proteinGroups.txt / Proteome Discoverer / CSV)
- Expected: protein intensity matrix + sample metadata
- **Or use example data?** TMT 10-plex A431 cancer cell line dataset (auto-downloads ~30s)
### 2. **Analysis Options** (structured):
- *(If using example data)* The demo dataset contains A431 human cancer cells treated with miRNAs (3 ctrl + 3 miR372 replicates). Choose analysis mode:
- a) Standard analysis with default comparison miR372 vs ctrl (recommended)
- b) Custom comparison (miR191 vs ctrl or miR519 vs ctrl)
- *(If using your own data)* Which conditions to compare? (e.g., Treatment-Control)
### 3. **Thresholds:**
- a) Standard: adjusted p-value < 0.05, |log2FC| > 0.58 / 1.5-fold change (recommended)
- b) Relaxed: adjusted p-value < 0.1, |log2FC| > 0 (any fold change)
- c) Stringent: adjusted p-value < 0.01, |log2FC| > 1 (2-fold change)
## Standard Workflow
> **Note:** Run from the OmicsClaw root directory and add the workflow scripts to `sys.path`:
> ```python
> import sys; import os; sys.path.insert(0, os.path.abspath('knowledge_base/scripts/proteomics-diff-exp'))
> ```
🚨 **MANDATORY: USE SCRIPTS EXACTLY AS SHOWN - DO NOT WRITE INLINE CODE** 🚨
**Step 1 - Load data:**
```r
source("scripts/load_example_data.R")
data <- load_example_data()
psm_data <- data$psm_data
metadata <- data$metadata
```
**For your own data:** Replace with your loading code, then call `validate_input_data()`.
**Step 2 - Run DE analysis:**
```r
source("scripts/basic_workflow.R")
```
**DO NOT expand this into inline code. DO NOT write limma/DEqMS steps manually. Just source the script.**
**Step 3 - Generate plots:**
```r
source("scripts/qc_plots.R")
generate_all_plots(fit_deqms, deqms_results, protein_matrix,
metadata, output_dir = "results", raw_matrix = raw_matrix)
```
🚨 **DO NOT write inline plotting code (ggsave, ggplot, Heatmap, etc.). Just use the script.** 🚨
**Step 4 - Export results:**
```r
source("scripts/export_results.R")
export_all(fit_deqms, deqms_results, protein_matrix, metadata,
output_dir = "results")
```
**DO NOT write custom export code. Use export_all() to save all outputs including RDS.**
**✅ VERIFICATION - You should see:**
- After Step 1: `"✓ Example data loaded successfully"` with PSM/protein counts
- After Step 2: `"✓ Proteomics DE analysis completed successfully!"` with summary
- After Step 3: `"✓ All plots generated successfully!"`
- After Step 4: `"=== Export Complete ==="` with file list
**❌ IF YOU DON'T SEE THESE MESSAGES:** You wrote inline code. Stop and use source().
⚠️ **CRITICAL - DO NOT:**
- ❌ **Write inline limma/DEqMS code** → **STOP: Use `source("scripts/basic_workflow.R")`**
- ❌ **Write inline plotting code** → **STOP: Use `generate_all_plots()`**
- ❌ **Write custom export code** → **STOP: Use `export_all()`**
- ❌ **Try to install svglite** → scripts handle SVG fallback automatically
- ❌ **Use absolute paths** → Always use `scripts/file.R`
**⚠️ IF SCRIPTS FAIL - Script Failure Hierarchy:**
1. **Fix and Retry (90%)** - Install missing package, re-run script
2. **Modify Script (5%)** - Edit the script file itself, document changes
3. **Use as Reference (4%)** - Read script, adapt approach, cite source
4. **Write from Scratch (1%)** - Only if genuinely impossible, explain why
**NEVER skip directly to writing inline code without trying the script first.**
**What the scripts provide:**
- [scripts/load_example_data.R](knowledge_base/scripts/proteomics-diff-exp/load_example_data.R) — `load_example_data()`, `validate_input_data()`
- [scripts/basic_workflow.R](knowledge_base/scripts/proteomics-diff-exp/basic_workflow.R) — Complete limma+DEqMS pipeline with PSM aggregation, imputation, normalization
- [scripts/qc_plots.R](knowledge_base/scripts/proteomics-diff-exp/qc_plots.R) — Publication-quality plots with ggprism/ComplexHeatmap (PNG + SVG with automatic fallback)
- [scripts/export_results.R](knowledge_base/scripts/proteomics-diff-exp/export_results.R) — `export_all()` saves all outputs (CSV, RDS, PDF report)
## Customizing the Analysis
**To change the comparison** (before sourcing basic_workflow.R):
```r
comparison_name <- "miR519-ctrl" # or any valid contrast
source("scripts/basic_workflow.R")
```
**To change imputation/normalization:**
```r
imputation_method <- "kNN" # "MinProb" (default) or "kNN"
normalization_method <- "quantile" # "median" (default), "quantile", or "none"
source("scripts/basic_workflow.R")
```
**For detailed method documentation:** See [references/proteomics-reference.md](references/proteomics-reference.md)
**For normalization guidance:** See [references/normalization-guide.md](references/normalization-guide.md)
## Common Issues
| Issue | Cause | Fix |
|-------|-------|-----|
| **Not seeing verification messages** | Wrote inline code instead of source() | Stop and use Standard Workflow commands exactly |
| **"cannot open file" error** | Using absolute paths | Use relative paths: `source("scripts/file.R")` |
| **ExperimentHub download fails** | Network timeout | Set `options(timeout = 300)` and retry |
| **Missing package errors** | Package not installed | `BiocManager::install('package')` or `install.packages('package')` |
| **SVG export error "svglite required"** | Missing optional dependency | Use `generate_all_plots()` — it handles fallback automatically. DO NOT try to install svglite manually |
| **svglite dependency conflict** | System library version mismatch | Normal — `generate_all_plots()` falls back to base R svg() device automatically. Both PNG and SVG will be created |
| **All proteins filtered out** | Too stringent missing value filter | Adjust filter threshold in basic_workflow.R |
| **No significant proteins** | Weak effect or wrong comparison | Check PCA for condition separation; try relaxed thresholds |
## Suggested Next Steps
After running this skill:
1. **Pathway enrichment** → functional-enrichment skill with significant proteins
2. **Biomarker panel** → lasso-biomarker-panel with DE proteins as features
3. **Network analysis** → coexpression-network with protein matrix
4. **Gene list processing** → de-results-to-gene-lists for annotation
## Related Skills
| Skill | Relationship | When to Use |
|-------|-------------|-------------|
| bulk-rnaseq-counts-to-de-deseq2 | Alternative | RNA-seq count data (not proteomics) |
| lasso-biomarker-panel | Downstream | Build biomarker panel from DE proteins |
| coexpression-network | Downstream | Protein co-expression modules |
## References
- **DEqMS:** Zhu Y, et al. *Molecular & Cellular Proteomics*. 2020;19(6):1047-1057
- **limma:** Ritchie ME, et al. *Nucleic Acids Research*. 2015;43(7):e47
- [Detailed method reference](references/proteomics-reference.md)
- [Normalization guide](references/normalization-guide.md)
Attribution
Comments
Loading comments…