AWS Labs logo

Skill

rna-seq-analysis

analyze bulk RNA-seq data

Covers Life Sciences Bioinformatics RNA-seq AWS

Description

Bulk RNA-seq analysis pipeline covering alignment (STAR), quantification (Salmon, featureCounts), and differential expression (DESeq2). Triggers on RNA-seq, STAR, Salmon, DESeq2, differential expression, gene expression, tximport, featureCounts, transcriptomics, "bulk RNA-seq", "STAR alignment", "Salmon quantification", "gene counts", "DESeq2 results", "shrinkage estimator", "volcano plot RNA-seq".

SKILL.md

RNA-seq Analysis — Pipeline Skill (Thin Scaffold)

Overview

Adds decision logic for choosing quantification paths (STAR vs Salmon), strandedness determination, and DESeq2 modeling pitfalls that LLMs routinely get wrong.

Usage

  • Activate when choosing between alignment-based (STAR+featureCounts) vs alignment-free (Salmon) quantification
  • Activate when setting up DESeq2 from either count source
  • Activate when debugging unexpected low counts or weak DE signal

Core Concepts

Decision Logic

Need BAMs? (variant calling, fusions, novel transcripts)
├── YES → STAR two-pass + featureCounts
└── NO → Salmon (faster, lower RAM, bias-corrected)

Salmon output → DESeq2:
└── Use DESeqDataSetFromTximport (preserves length offset)
    └── NEVER round txi$counts and pass to DESeqDataSetFromMatrix

Filtering strategy (VQSR equivalent):
├── ≥30 samples → VQSR-like (default DESeq2 shrinkage works well)
└── <30 samples → still works, but pre-filter aggressively

Strandedness determination (MUST verify before counting):

KitfeatureCounts -sSalmon -l
TruSeq Stranded / dUTP2ISR (PE) / SR (SE)
Ligation / forward1ISF / SF
Unstranded0IU / U

Verify with: infer_experiment.py (RSeQC) or Salmon's lib_format_counts.json.

Critical Parameters

ParameterValueWhen to change
--sjdbOverhangreadLength - 1 (default 100)Non-100bp reads
--twopassMode BasicAlways for DESkip only for speed in QC runs
Salmon --gcBias --seqBiasAlways onNever skip for Illumina
Salmon --validateMappingsAlways onEnables selective alignment
featureCounts -sKit-dependentALWAYS verify empirically
DESeq2 pre-filterrowSums(counts >= 10) >= smallest_groupAdjust 10 for shallow sequencing
lfcShrink type"apeglm"Use "ashr" for arbitrary contrasts
Design formula~ batch + condition (interest LAST)Always put interest term last

Common Mistakes

  • Wrong: Guessing strandedness (-s) instead of verifying empirically Right: Check with infer_experiment.py or Salmon lib_format_counts.json before running featureCounts Why: Wrong strandedness causes 2–10× lower counts and weak DE signal
  • Wrong: Passing normalized counts (TPM, FPKM, CPM) to DESeq2 Right: Always start from raw integer counts Why: Normalized values break the negative-binomial model
  • Wrong: Rounding txi$counts and passing to DESeqDataSetFromMatrixRight: Use DESeqDataSetFromTximport(txi, ...) which preserves the length offset Why: Rounding discards per-gene length correction for transcript-length bias
  • Wrong: Placing variable of interest first in design (~ condition + batch) Right: Put interest last: ~ batch + conditionWhy: DESeq2 tests the last term by default
  • Wrong: Assuming DESeq2 reorders samples to match Right: Assert stopifnot(all(colnames(cts) == rownames(coldata))) before creating DESeq object Why: DESeq2 silently mislabels samples if order doesn't match
  • Wrong: Skipping pre-filtering of low-count genes Right: Filter with rowSums(counts(dds) >= 10) >= smallest_group_sizeWhy: Near-zero genes inflate runtime and dilute multiple-testing correction
  • Wrong: Using STAR ReadsPerGene.out.tab column 2 for stranded libraries Right: Use column 3 (forward) or column 4 (reverse) matching your kit Why: Column 2 is unstranded; using it for stranded data halves effective counts
  • Wrong: Including samples with <10M mapped reads or <70% mapping rate Right: Exclude or flag before fitting Why: Low-quality samples distort size factors and dispersion estimates
  • Wrong: Modeling when batch is perfectly confounded with condition Right: Check table(coldata$batch, coldata$condition) first Why: No statistical model can separate perfectly correlated effects

Response Format

  • Lead with the command or code the user needs — explain after
  • Structure as: confirm inputs → working code → key parameters explained → gotchas
  • One complete working example per task; do not show every alternative
  • Keep code comments minimal and functional (what, not why-it-exists)
  • Target: 50-100 lines of code with brief surrounding explanation

© 2026 YourAI.tools. Every skill from an identity-verified publisher.

Independent catalog. Not affiliated with, endorsed by, or sponsored by Anthropic or any listed publisher. All trademarks belong to their respective owners.