Differential protein expression analysis for TMT/LFQ mass spectrometry proteomics data using limma linear models with DEqMS PSM-count-aware variance correction.
Scanned 9/4/2026
Install to Claude Code
npx -y skills add gabrielmoreira/agent-skills-mirror --skill proteomics-diff-exp --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Proteomics Diff Exp?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/gabrielmoreira-proteomics-diff-exp)More formats (shields.io, HTML) on the badges page.
---
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)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!