Installs into .claude/skills of the current project.
Are you the author of Bulk Rnaseq Counts To De Deseq2?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/biotender-max-bulk-rnaseq-counts-to-de-deseq2)
---
id: bulk-rnaseq-counts-to-de-deseq2
name: Bulk RNAseq differential expression (DeSeq2)
category: transcriptomics
short-description: Perform differential expression analysis using DESeq2 on RNA-seq raw count data.
detailed-description: Perform differential expression analysis using DESeq2 on RNA-seq raw count data. Use when you have integer count matrices with biological replicates (n≥2 per group), need log fold change shrinkage for gene ranking, or want conservative p-value estimates. Best for medium to large sample sizes (n≥4 recommended). Creates DESeqDataSet objects, performs size factor normalization, estimates dispersions, and tests for differential expression using the Wald test or likelihood ratio test.
starting-prompt: Perform differential expression analysis using DESeq2 on my RNA-seq raw count data . .
---
# DESeq2 Differential Expression Analysis
Core DESeq2 workflow for RNA-seq differential expression analysis with count data.
## When to Use This Skill
Use DESeq2 when you have:
- ✅ **Raw integer count data** (not normalized TPM/FPKM)
- ✅ **Biological replicates** (≥2 per condition, ≥4 recommended)
- ✅ Need for **log fold change shrinkage** (ranking/visualization)
- ✅ **Medium to large sample sizes** (DESeq2's strength)
**Don't use DESeq2 for:**
- ❌ Normalized data (TPM/FPKM) → use limma-voom instead
- ❌ Very small samples (n=2-3) → consider edgeR quasi-likelihood
## Quick Start (Example Data)
**Test this skill with real RNA-seq data in ~2 minutes:**
```r
source("scripts/load_example_data.R")
data <- load_pasilla_data() # Auto-installs pasilla package if needed (~2 min, ~50MB)
counts <- data$counts # 14,599 genes × 7 samples
coldata <- data$coldata # Metadata: treated vs untreated
# Run complete workflow
source("scripts/basic_workflow.R") # Creates dds, res, resLFC objects + prints summary
```
**What you get:**
- **Dataset:** Drosophila pasilla gene RNAi knockdown (Brooks et al. 2011)
- **Comparison:** 3 treated vs 4 untreated samples
- **Expected results:** ~1,000 significant genes at padj < 0.1
**For your own data:** Replace data loading with your count matrix and metadata (see [Inputs](#inputs) section).
## Installation
**Core packages (required):**
```r
# Set CRAN mirror first (required for installation)
options(repos = c(CRAN = "https://cloud.r-project.org"))
if (!require('BiocManager', quietly = TRUE))
install.packages('BiocManager')
BiocManager::install(c('DESeq2', 'apeglm'))
```
**Example data packages (optional - for testing/learning):**
```r
BiocManager::install(c('pasilla', 'airway')) # ~70MB total, ~2-3 min
```
**Visualization packages (required for QC plots):**
```r
# For publication-quality plots (required - generates PNG)
install.packages(c('ggplot2', 'ggprism', 'ggrepel'))
# For SVG export (optional - generates both PNG + SVG)
install.packages('svglite')
```
**License:** LGPL (>= 3) (commercial use permitted)
## Inputs
**Required:**
- **Count matrix**: Raw integer counts (genes × samples)
- Rows = genes (any identifier: Ensembl, symbols, etc.)
- Columns = samples
- Values = non-negative integers
- **Sample metadata**: Data frame with sample information
- Row names must match count matrix column names
- Required column: `condition` (factor with 2+ levels)
- Optional: batch, covariates for complex designs
**Alternative inputs:**
- Salmon/Kallisto output (via tximport)
- SummarizedExperiment object
- featureCounts/HTSeq output
- Bioconductor data packages (pasilla, airway)
**See [references/deseq2-reference.md](references/deseq2-reference.md#alternative-input-formats) for loading examples.**
## Outputs
**Primary results:**
- `deseq2_results.csv` - Full differential expression table (baseMean, log2FC, lfcSE, pvalue, padj)
- `deseq2_results_shrunk.csv` - Shrunken LFC for visualization/ranking
- `dds_object.rds` - DESeqDataSet for further analysis
**Normalized data:**
- `normalized_counts.csv` - Size-factor normalized counts
- `vst_transformed.csv` / `rlog_transformed.csv` - Variance-stabilized values
**QC plots (PNG always, SVG strongly preferred, 300 DPI):**
- `dispersion_plot.png` / `.svg` - Dispersion estimates vs mean
- `pca_plot.png` / `.svg` - Principal component analysis
- `ma_plot.png` / `.svg` - Mean-average plot
- `volcano_plot.png` / `.svg` - Volcano plot (log2FC vs -log10 padj)
- ⚠️ SVG requires `svglite` package: `install.packages('svglite')` (falls back to PNG-only if unavailable)
## Clarification Questions
**⚠️ CRITICAL: Always ask question #1 first to check if user has provided input files before proceeding with analysis.**
Before starting, gather:
1. **Input Files** (ASK THIS FIRST):
- **Do you have specific count matrix file(s) to analyze?**
- If uploaded: Is this the count matrix (genes × samples, raw integer counts)?
- Expected formats: CSV/TSV, RDS (SummarizedExperiment), Salmon/Kallisto output
- **Or use example data for testing?**
- Use `source("scripts/load_example_data.R"); data <- load_pasilla_data()`
- Requires installing `pasilla` package (~2 min, ~50MB)
- **⚠️ If data is normalized (TPM/FPKM):** Use limma-voom skill instead
2. **Sample Metadata** (if using own data):
- What is the primary comparison (e.g., treated vs control)?
- Which group is the reference/control?
- Any covariates to adjust for (batch, sex, sequencing run)?
- **Validation:** Confirm sample IDs match between count matrix columns and metadata rows
3. **Experimental Design**:
- Simple: `~ condition` | Multi-factor: `~ batch + condition` | Paired: `~ individual + condition` | Interaction: `~ genotype * treatment`
- See [references/decision-guide.md#design-formulas](references/decision-guide.md#design-formulas)
4. **Sample Size Check**:
- n ≥ 4 per group (recommended) | n = 2-3 (consider edgeR) | n < 2 (insufficient)
5. **Significance Thresholds**:
- Standard: padj < 0.05, |log2FC| ≥ 1 | Relaxed: padj < 0.1 | Stringent: padj < 0.01, |log2FC| ≥ 2
6. **Analysis Goals**:
- Single pairwise comparison or multiple comparisons?
- Need visualizations (volcano, heatmap)? → Use de-results-to-plots skill after
- Need gene annotations? → Use de-results-to-gene-lists skill after
## Typical Complete Workflow
This skill performs **core differential expression analysis with QC plots**. For a complete RNA-seq workflow:
1. **This skill**: Run DESeq2 → get `dds`, `res`, normalized counts, QC plots (PCA, MA, volcano, dispersion)
2. **de-results-to-gene-lists**: Filter significant genes → add annotations → export
3. **de-results-to-plots** (optional): Advanced visualizations (heatmaps, custom plots)
**Quick start:** *"Run DESeq2 analysis and filter significant genes with annotations"*
**Why separate skills?** Modular design works across DE methods (DESeq2, edgeR, limma). See [Suggested Next Steps](#suggested-next-steps) for details.
## 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/bulk-rnaseq-counts-to-de-deseq2'))
> ```
🚨 **MANDATORY: USE SCRIPTS EXACTLY AS SHOWN - DO NOT WRITE INLINE CODE** 🚨
**This skill uses low-freedom script execution.** You must:
- ✅ Source the scripts using the exact commands below
- ✅ Wait for confirmation messages after each step
- ❌ NOT write inline DESeq2 code
- ❌ NOT rewrite plotting code
- ❌ NOT modify commands unless explicitly adapting for user-specific data
**WHY USE SCRIPTS:** They handle package installation, data validation, sample ID fixes, and error checking automatically. Writing inline code wastes time, introduces errors, and violates the skill design.
**Step 1 - Load example data:**
```r
source("scripts/load_example_data.R")
data <- load_pasilla_data()
counts <- data$counts
coldata <- data$coldata
```
**Step 2 - Run DESeq2 analysis:**
```r
source("scripts/basic_workflow.R")
```
**DO NOT expand this into inline code. DO NOT write the DESeq2 steps manually. Just source the script.**
**Step 3 - Generate QC plots:**
```r
source("scripts/qc_plots.R")
run_all_qc(dds, res, output_dir = "results")
```
🚨 **DO NOT write inline plotting code (ggsave, plotMA, etc.). Just source the script.** 🚨
**The script handles PNG + SVG export with graceful fallback for SVG dependencies.**
**Step 4 - Export results:**
```r
source("scripts/export_results.R")
export_all(dds, res, resLFC, output_dir = "results")
```
**DO NOT write custom export code. Use export_all() to save all standard outputs including RDS and transformed counts.**
**✅ VERIFICATION - You should see these messages:**
- After Step 1: `"✓ Pasilla dataset loaded successfully"` with dimensions
- After Step 2: `"✓ Basic workflow completed successfully!"` with summary statistics
- After Step 3: `"✓ All QC plots generated successfully!"` with file names
- After Step 4: `"=== Export Complete ==="` with list of 6-7 files saved
**❌ IF YOU DON'T SEE THESE MESSAGES:** You wrote inline code instead of using source(). Stop and use the commands above.
⚠️ **CRITICAL - DO NOT:**
- ❌ **Write inline data loading code** → **STOP: This violates the skill design. Use `source("scripts/load_example_data.R")` instead.** Inline loading causes sample ID mismatches and missing validations.
- ❌ **Write inline DESeq2 workflow code** → **STOP: This violates the skill design. Use `source("scripts/basic_workflow.R")` instead.** Inline workflow wastes time and introduces bugs.
- ❌ **Write inline plotting code (ggsave, plotMA, etc.)** → **STOP: This violates the skill design. Use `source("scripts/qc_plots.R")` and `run_all_qc()` instead.** If scripts fail, fix the script, don't rewrite inline.
- ❌ **Write custom export code** → **STOP: This violates the skill design. Use `source("scripts/export_results.R")` and `export_all()` instead.** Custom export code misses RDS objects and transformed counts needed downstream.
- ❌ **Try to install svglite** → script handles SVG fallback automatically
- ❌ **Use absolute paths for scripts** → Always use relative paths `scripts/file.R`
- ❌ WRONG: `source("/mnt/knowhow/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/load_example_data.R")`
- ❌ WRONG: `setwd("/absolute/path/to/skill")`
- ✅ CORRECT: `source("scripts/load_example_data.R")` (skill should already be working directory)
**⚠️ 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.**
**📁 Output Directory Paths:**
- ✅ Recommended: Use relative paths like `output_dir = "results"` (creates folder in working directory)
- ✅ Also valid: Environment-specific absolute paths like `output_dir = "/mnt/results"` (containerized environments only)
**✅ When to read references for adaptation (NOT rewriting):**
- **Design formulas** (multi-factor, interactions): Read [references/comprehensive-reference.md#design-formulas](references/comprehensive-reference.md#design-formulas) to understand patterns
- **Result extraction** (specific contrasts): Read [references/comprehensive-reference.md#extracting-results](references/comprehensive-reference.md#extracting-results)
- **Shrinkage methods** (ashr vs apeglm): Read [references/comprehensive-reference.md#log-fold-change-shrinkage](references/comprehensive-reference.md#log-fold-change-shrinkage)
**❌ When NOT to write custom inline code:**
- Unless user explicitly says: "show me the complete inline workflow without using scripts"
- The scripts already handle 95% of use cases - use them first, customize only if truly needed
**What the scripts provide:**
- [scripts/load_example_data.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/load_example_data.R) - `load_pasilla_data()`, `load_airway_data()`, `validate_input_data()`
- [scripts/basic_workflow.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/basic_workflow.R) - Complete DESeq2 pipeline with validation and error messages
- [scripts/qc_plots.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/qc_plots.R) - Publication-quality plots with ggplot2/ggprism/ggrepel (PNG + SVG if svglite installed)
- [scripts/export_results.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/export_results.R) - `export_all()` saves all outputs (CSV, RDS, transformed counts)
## When Scripts Fail
**When a script fails, follow this hierarchy:**
### 1. Fix and Retry (Preferred)
- **Read the error message** - Understand what went wrong
- **Install missing packages** - Use `BiocManager::install()` or `install.packages()`
- **Update dependencies** - If version conflicts, update packages: `install.packages('package_name')`
- **Check your data** - Ensure count matrices are integer counts and metadata is properly formatted
- **Re-run the script** - After fixing the issue, source the script again
### 2. Modify the Script (If Fix Doesn't Work)
- **Edit the script file** to fix the issue (e.g., change default parameters, add data validation)
- **Document your changes** - Add comment: `# Modified: [what and why]`
- **Source the modified script** - Use the edited version
### 3. Use Script as Reference (If Can't Modify Script)
- **Read the script** to understand the approach and logic
- **Adapt the approach** to your specific situation (different data format, missing dependencies)
- **Cite the source** - Comment: `# Adapted from scripts/basic_workflow.R`
- **Explain the deviation** - Why the original script couldn't be used
### 4. Write From Scratch (Absolute Last Resort)
- **Only if steps 1-3 are impossible** (e.g., script fundamentally incompatible with environment)
- **Explain to user** why scripts couldn't be used
- **Document the deviation** - Note what approach you're taking instead
**⚠️ DO NOT skip straight to step 4** - Always attempt steps 1-3 first. Scripts are designed, tested, and documented. Inline code should be a last resort, not a first choice.
**Example decision tree:**
- Missing package? → **Step 1** (install and retry)
- Script has bug? → **Step 2** (fix script and re-run)
- User's data format differs? → **Step 3** (adapt script logic)
- Can't install required packages? → **Step 4** (explain and provide alternative)
## Design Formulas
**Common patterns:** `~ condition` (simple), `~ batch + condition` (batch correction), `~ individual + condition` (paired), `~ genotype * treatment` (interaction).
**⚠️ Design must not be confounded** - ensure batches exist in both conditions.
**To understand patterns and choose the appropriate design formula for your experimental setup:** Read [references/comprehensive-reference.md#design-formulas](references/comprehensive-reference.md#design-formulas) and adapt the syntax to your specific experimental design.
## Extracting Results
Extract comparisons using `results()` with either **coefficient name** (`name = 'condition_treated_vs_control'`) or **contrast** (`contrast = c('condition', 'treated', 'control')`).
Use `resultsNames(dds)` to see available coefficients.
**For standard extraction patterns:** Use [scripts/extract_results.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/extract_results.R) (execute as-is).
**To understand extraction methods and choose the appropriate approach for your comparison:** Read [references/comprehensive-reference.md#extracting-results](references/comprehensive-reference.md#extracting-results) and adapt the syntax to your specific contrast needs.
## Log Fold Change Shrinkage
**⚠️ REQUIRED for visualization/ranking.** Use shrunk LFC for MA/volcano plots and gene ranking; use unshrunk for hypothesis testing.
Apply shrinkage with `lfcShrink(dds, coef = 'condition_treated_vs_control', type = 'apeglm')`. Use **apeglm** method (recommended), **ashr** (faster for large datasets), or **normal** (legacy).
**For standard shrinkage:** Use [scripts/extract_results.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/extract_results.R) `apply_lfc_shrinkage()` (execute as-is).
**To understand shrinkage methods and choose the appropriate approach for your analysis:** Read [references/comprehensive-reference.md#log-fold-change-shrinkage](references/comprehensive-reference.md#log-fold-change-shrinkage) to compare methods and adapt the syntax to your specific use case.
## Normalization & Transformations
```r
source("scripts/transformations.R")
transformed <- transform_counts(dds, method = "auto") # Auto-selects vst/rlog by sample size
```
**Script:** [scripts/transformations.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/transformations.R)
**Decision:** vst() for >30 samples (fast), rlog() for <30 samples (accurate). See [references/decision-guide.md#transformation](references/decision-guide.md#transformation)
## Quality Control
🚨 **REQUIRED: Use provided script (DO NOT write inline plotting code)**
**CRITICAL: Source the script and call run_all_qc(). DO NOT reimplement plotting.**
```r
source("scripts/qc_plots.R")
run_all_qc(dds, res, output_dir = "qc_plots") # Auto-generates all QC plots
```
**What you get automatically:**
- `dispersion_plot.svg` - Gene-wise dispersion vs mean expression (ggplot2 + ggprism theme)
- `pca_plot.svg` - Sample clustering with labeled samples (ggrepel prevents overlaps)
- `ma_plot.svg` - Log fold change vs expression with top genes labeled (ggrepel)
- `volcano_plot.svg` - Log2 fold change vs adjusted p-value with top genes labeled (ggrepel)
- Automatic quality checks printed to console
- Publication-ready plots styled with ggprism themes
**Features built-in:**
- ✅ ggplot2 for customizable, high-quality plots
- ✅ ggprism themes for publication-ready styling
- ✅ ggrepel for non-overlapping text labels
- ✅ Auto-selects vst/rlog by sample size
- ✅ Saves as SVG (vector) or PNG (raster) with 300 DPI
⚠️ **DO NOT write inline plotting code** - scripts handle all visualization needs
**Script:** [scripts/qc_plots.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/qc_plots.R) - Complete QC plotting functions
**For custom plot styling:** See [references/qc-guide.md#custom-plots](references/qc-guide.md#custom-plots) (only if user explicitly requests customization)
**Key checks:** Dispersion trend fit, PCA clustering by condition, symmetric MA plot. See [references/qc-guide.md](references/qc-guide.md)
## Exporting Results
```r
source("scripts/export_results.R")
export_all(dds, res, res_shrunk, output_dir = "deseq2_results")
```
**Script:** [scripts/export_results.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/export_results.R) - Exports results, shrunk LFC, normalized/transformed counts, significant genes
## Decision Points
### Decision 1: Transformation Method
**When:** Before creating PCA plots and heatmaps
**Options:**
- **vst()**: Use for >30 samples (fast, suitable for large datasets)
- **rlog()**: Use for <30 samples (better for small samples, slower)
**See [references/decision-guide.md#decision-point-1](references/decision-guide.md#decision-point-1-transformation-method) for detailed guidance.**
### Decision 2: LFC Shrinkage Method
**When:** Before ranking genes or creating MA/volcano plots
**Options:**
- **apeglm** (recommended): Best shrinkage, preserves large LFC
- **ashr**: Good for large datasets or when apeglm is slow
- **normal**: Legacy method, not recommended
**See [references/decision-guide.md#decision-point-2](references/decision-guide.md#decision-point-2-lfc-shrinkage-method) for detailed guidance.**
### Decision 3: Design Formula
**When:** Before creating DESeqDataSet
**Options:**
- **~ condition**: Simple design, no known batch effects
- **~ batch + condition**: Known batch effects (requires balanced design)
- **~ individual + condition**: Paired samples
- **~ genotype * treatment**: Test interactions
**Check PCA first** - if samples cluster by batch, add batch to design.
**See [references/decision-guide.md#decision-point-3](references/decision-guide.md#decision-point-3-design-formula) for detailed guidance.**
## Common Issues
| Issue | Solution | Details |
|-------|----------|---------|
| **Not seeing verification messages** ("✓ Pasilla dataset loaded successfully", "✓ Basic workflow completed successfully!") | **You wrote inline code instead of using source().** Stop and use the 3 commands in Standard Workflow section exactly as shown. | See Standard Workflow section |
| **"cannot open file" or "No such file"** when using absolute paths | **Use relative paths ONLY:** `source("scripts/file.R")` not `/mnt/knowhow/...` or `/workspace/...`. Skills use relative paths that work in any environment. | See Standard Workflow section |
| **"cannot open file"** for `scripts/load_example_data.R` | Working directory is not the skill root. Use `setwd("bulk-rnaseq-counts-to-de-deseq2")` or run from correct directory. | [Troubleshooting](references/troubleshooting.md#cannot-open-file) |
| "trying to use CRAN without setting a mirror" | Set with `options(repos = c(CRAN = "https://cloud.r-project.org"))` before `install.packages()` (scripts handle this automatically) | [Troubleshooting](references/troubleshooting.md#cran-mirror-error) |
| "there is no package called 'X'" | Install with `BiocManager::install('X')` (set CRAN mirror first, or use scripts which handle this) | [Troubleshooting](references/troubleshooting.md#missing-packages) |
| **Sample ID mismatch errors** | **PREVENTION:** Use `source("scripts/load_example_data.R"); validate_input_data(counts, coldata)` BEFORE creating DESeqDataSet. **FIX:** Check `colnames(counts)` vs `rownames(coldata)` for typos/suffixes | [Troubleshooting](references/troubleshooting.md#sample-id-mismatch) |
| Pasilla data sample name mismatch (untreated1 vs untreated1fb) | Use `load_pasilla_data()` from `scripts/load_example_data.R` - automatically fixes "fb" suffix issue | [Troubleshooting](references/troubleshooting.md#pasilla-sample-names) |
| "design matrix not full rank" | Remove confounded variables or combine into single factor | [Troubleshooting](references/troubleshooting.md#error-the-model-matrix-is-not-full-rank) |
| "counts should be integers" | Use `DESeqDataSetFromTximport()` for tximport data | [Troubleshooting](references/troubleshooting.md#error-counts-matrix-should-contain-integer-values) |
| "factor levels not in colData" | Check spelling in design formula vs colData columns | [Troubleshooting](references/troubleshooting.md#error-factor-levels-not-in-coldata) |
| Missing ggplot2/ggprism/ggrepel errors | Install with `install.packages(c('ggplot2', 'ggprism', 'ggrepel'))` (or use `scripts/qc_plots.R` which handles installation) | See Installation section |
| **SVG files missing** (only PNG generated) | Install svglite: `install.packages('svglite')`. **Note:** PNG output is identical quality for analysis (300 DPI). | See Installation section |
| NA values in padj | Normal - independent filtering removes low-count genes | [Troubleshooting](references/troubleshooting.md#too-many-na-values-in-padj-column) |
| No significant genes | Check PCA for batch effects, verify reference level | [Troubleshooting](references/troubleshooting.md#no-significant-genes-found) |
**See [references/troubleshooting.md](references/troubleshooting.md) for comprehensive troubleshooting guide.**
## Best Practices
1. 🚨 **CRITICAL: Use source() commands from Standard Workflow** - DO NOT write inline code
- Verify you see success messages: "✓ Pasilla dataset loaded successfully", "✓ Basic workflow completed successfully!"
- Scripts handle all package installation, validation, and error checking automatically
2. ✅ **REQUIRED: Validate sample IDs** match between counts and metadata (scripts do this automatically, or use `validate_input_data()`)
3. ✅ **REQUIRED: Pre-filter** low-count genes before `DESeq()` (basic_workflow.R does this)
4. ✅ **REQUIRED: Set reference level** explicitly with `relevel()` (basic_workflow.R does this)
5. ✅ **REQUIRED: Apply LFC shrinkage** for visualization/ranking, use unshrunk for testing (basic_workflow.R does this)
6. ✅ **Use padj** (not pvalue) for significance calling
7. ✅ **Check QC plots** before trusting results (PCA, dispersion, MA) - use `run_all_qc()`
8. ✅ **Use vst()** for >30 samples, rlog() for <30 samples (qc_plots.R auto-selects)
9. ✅ **Document design formula** and report DESeq2 version
## Suggested Next Steps
After completing DESeq2 analysis, you'll typically want to:
### 1. Filter and Export Results (de-results-to-gene-lists skill)
**RECOMMENDED NEXT STEP** - Use the de-results-to-gene-lists skill to:
- Filter significant genes (padj < 0.05, |log2FC| > 1)
- Add gene annotations (symbols, descriptions, IDs)
- Export to CSV, Excel, or gene list formats
- Create ranked gene lists for GSEA
**Example prompt:**
*"Filter the DESeq2 results to get significant genes with padj < 0.05 and |log2FC| > 1, add gene annotations, and export to CSV and Excel"*
**Inputs needed:** The `res` and `dds` objects from this analysis
### 2. Create Advanced Visualizations (de-results-to-plots skill)
**OPTIONAL** - This skill already generates basic QC plots (PCA, MA, volcano, dispersion). Use the de-results-to-plots skill for:
- Publication-quality visualizations with advanced customization
- Heatmaps of top differentially expressed genes
- Sample distance matrices
- Expression plots for specific genes of interest
**Example prompt:**
*"Create a heatmap of the top 50 significant genes and expression plots for genes FBgn0039155, FBgn0025111"*
**Inputs needed:** The `res`, `dds`, and transformed count data from this analysis
### 3. Functional Enrichment Analysis
After filtering significant genes (using de-results-to-gene-lists):
- **pathway-analysis** - GO/KEGG enrichment of gene lists
- **gsea** - Gene set enrichment on ranked genes
### 4. Quality Control
**If you see issues in QC plots:**
- **Batch effects in PCA**: Re-run with `~ batch + condition` design
- **Poor sample clustering**: Check sample metadata for swaps/errors
- **High dispersion**: May indicate low quality samples
## Related Skills
**Alternative methods (use instead of this skill):**
- **edger** - Use for small samples (n=2-3) or many contrasts (coming soon)
- **limma-voom** - Use for normalized data (TPM/FPKM) (coming soon)
## References
**Detailed documentation:**
- [references/deseq2-reference.md](references/deseq2-reference.md) - Complete code patterns and examples
- [references/decision-guide.md](references/decision-guide.md) - Detailed decision-making guidance
- [references/troubleshooting.md](references/troubleshooting.md) - Comprehensive error solutions
**Scripts:**
- [scripts/basic_workflow.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/basic_workflow.R) - Complete example workflow
- [scripts/qc_plots.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/qc_plots.R) - Quality control functions
- [scripts/extract_results.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/extract_results.R) - Results extraction functions
- [scripts/export_results.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/export_results.R) - Export functions
- [scripts/transformations.R](knowledge_base/scripts/bulk-rnaseq-counts-to-de-deseq2/transformations.R) - Transformation functions
**Official documentation:**
- DESeq2 Bioconductor: http://bioconductor.org/packages/DESeq2
- DESeq2 paper: Love et al. (2014) Genome Biology
**License:** LGPL (>= 3) (commercial use permitted)