All skills
bulk-rna-seq
Bulk RNA-seq differential expression — experimental design, count modeling with DESeq2/edgeR, and enrichment.
Use this skill
- Read the full skill below — it’s all right here on this page. When you like it, hit copy.
- Paste it into a chat with Muse and add: “Please use this skill whenever I ask about bulk rna seq. Remember it for our future conversations.”
- That’s it. Muse follows the playbook for relevant tasks, and you approve anything it does.
The full skill
Overview
bulk-rna-seq covers the standard bulk RNA-seq workflow: experimental design (replicates, batching, depth), read quantification, differential expression with DESeq2/edgeR/limma-voom, and downstream interpretation (enrichment, visualization). Bulk RNA-seq remains the workhorse transcriptomic assay — cheaper and statistically better-powered than single-cell for condition comparisons.
When to use
- Experimental design: replicate numbers, randomization, batch planning, depth.
- Quantification: Salmon/kallisto (fast, bias-aware) vs STAR + featureCounts.
- Differential expression: DESeq2, edgeR, limma-voom — choosing and configuring.
- Contrasts and complex designs: interactions, time series, paired designs.
- QC: PCA, sample correlations, outlier handling, batch-effect diagnosis.
- Enrichment: ORA, GSEA, and background-set discipline.
- Visualization: volcano plots, heatmaps, MA plots.
Core concepts
- Design first. ≥3 biological replicates per condition (more for variable systems — clinical samples need 6+); randomize processing order; block batches across conditions (never confound batch with condition — the cardinal sin); decide depth by question (20-30M reads standard; more for splicing/rare transcripts). Power analysis via Scotty/RNASeqPower for grant proposals.
- Quantification. Salmon/kallisto with GC/sequence-bias correction are fast and accurate for gene-level DE; STAR + featureCounts when you need alignments (splicing, variants). Summarize to gene level with tximport (transcript-level uncertainty matters — don't ignore it). Use the same annotation (GENCODE/Ensembl version) throughout.
- Count models. RNA-seq counts are overdispersed — Poisson is wrong. DESeq2/edgeR fit negative binomial models with empirical-Bayes dispersion shrinkage; limma-voom transforms for linear modeling (good for complex designs). All three agree most of the time — pick one and know it well.
- Normalization. DESeq2 size factors / edgeR TMM estimate library-size + compositional effects. Never run DE on TPM/FPKM/RPKM. Check size factors for outliers (a sample with extreme size factor is telling you something).
- The DESeq2 workflow.
DESeqDataSetFromTximport→DESeq→ results with contrast → lfcShrink (apeglm/ashr — shrinkage stabilizes noisy fold changes, essential for ranking and visualization) → FDR control (Benjamini-Hochberg, typically padj < 0.05 + |log2FC| threshold chosen biologically, not by default). - QC before DE. PCA and sample-distance heatmaps first: outliers, batch effects, and mislabeled samples show up here. Investigate before modeling — removing an outlier post-hoc because it "ruins" the result is p-hacking; prespecified QC criteria aren't.
- Batch effects. Include batch in the design formula when unconfounded; use RUVSeq/sva when batch is unknown but PCA shows structure; ComBat-seq for batch-corrected counts. If batch is confounded with condition, the experiment is uninterpretable — redesign, don't "correct."
- Enrichment. ORA (hypergeometric on DE gene lists — threshold-dependent, use the detected gene universe as background, not the whole genome); GSEA (ranked-list, no threshold — generally preferred); both need multiple-testing correction and redundancy-aware interpretation (GO terms overlap heavily — use REVIGO or enrichment maps). An enriched pathway is a hypothesis, not a mechanism.
- Complex designs. Paired samples (
~patient + condition), interactions (~genotype*treatment), time series (likelihood-ratio tests, impulse models). Write the design formula from the experimental structure, not by trial and error.
Practical workflow
- Design. Replicates, randomization, batch blocking, depth — on paper, before libraries.
- Quantify. Salmon with bias correction → tximport to gene level; MultiQC over logs.
- QC. PCA, distances, size factors; handle outliers by prespecified criteria.
- Model. DESeq2/edgeR with the design reflecting the experiment; check dispersion plots.
- Extract. Contrasts of interest; lfcShrink; padj + effect-size thresholds.
- Interpret. Volcano/MA plots; GSEA on ranked lists; heatmaps of top genes (z-scored, annotated with condition bars).
- Validate. qPCR on key genes (independent samples ideally); functional follow-up for load-bearing claims.
- Report. Design, software versions, thresholds, full results tables (not just "significant" genes), GEO deposition.
Example (R sketch):
library(DESeq2)
dds <- DESeqDataSetFromTximport(txi, colData, ~batch + condition)
dds <- DESeq(dds)
res <- lfcShrink(dds, coef="condition_treated_vs_control", type="apeglm")
plotMA(res); EnhancedVolcano(res, lab=rownames(res), x="log2FoldChange", y="padj")
Common pitfalls
- Batch confounded with condition (unfixable).
- DE on TPM/FPKM instead of raw counts.
- Unshrunk log2FCs ranked and interpreted (noise at low counts).
- Outliers removed post-hoc to improve results.
- GO enrichment with whole-genome background (inflated).
- Enriched pathways reported as mechanistic findings.
- n=2 per group presented as adequately powered.