Complete workflow for single-cell RNA-seq analysis using Seurat v5. Process raw data through quality control, normalization, clustering, and cell type annotation with publication-ready visualizations.
Scanned 9/4/2026
Install to Claude Code
npx -y skills add gabrielmoreira/agent-skills-mirror --skill scrnaseq-seurat-core-analysis --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Scrnaseq Seurat Core Analysis?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/gabrielmoreira-scrnaseq-seurat-core-analysis)More formats (shields.io, HTML) on the badges page.
---
id: scrnaseq-seurat-core-analysis
name: Single-Cell RNA-seq Core Analysis (Seurat)
category: transcriptomics
short-description: Complete single-cell RNA-seq analysis using Seurat from raw data to cell type annotation with clustering and visualization.
detailed-description: Complete single-cell RNA-seq analysis using Seurat v5 from raw data to cell type annotation. Use when you have 10X Chromium, Drop-seq, or other scRNA-seq data requiring QC, normalization, clustering, and visualization. Implements current best practices including ambient RNA correction (SoupX), batch-aware adaptive QC (MAD), doublet detection (DoubletFinder), SCTransform normalization, batch integration (Harmony/CCA), multi-resolution clustering, and pseudobulk differential expression for condition comparisons. Best for human or mouse data with 500+ cells per sample. Produces publication-ready plots and annotated Seurat objects.
starting-prompt: "Analyze my single-cell RNA-seq data using Seurat from QC through cell type annotation. Generate a PDF report with an intro, methods, results, conclusions and figures from all of the analyses you perform."
---
# Single-Cell RNA-seq Core Analysis (Seurat)
Complete workflow for single-cell RNA-seq analysis using Seurat v5. Process raw data through quality control, normalization, clustering, and cell type annotation with publication-ready visualizations.
## When to Use This Skill
Use this skill when you need to:
- ✅ **Analyze 10X Chromium data** (CellRanger output, H5 files, raw/filtered matrices)
- ✅ **Process Drop-seq, Smart-seq2, or inDrop** single-cell RNA-seq data
- ✅ **Perform complete QC workflow** with adaptive thresholds and doublet detection
- ✅ **Integrate multi-batch data** using Harmony or Seurat CCA/RPCA
- ✅ **Discover cell populations** via graph-based clustering with validation
- ✅ **Annotate cell types** manually or with automated reference-based methods
- ✅ **Compare conditions** using pseudobulk differential expression (multi-sample data)
**Don't use this skill for:**
- ❌ Bulk RNA-seq data → Use bulk-rnaseq-counts-to-de-deseq2
- ❌ Python-based scRNA-seq analysis → Use scrnaseq-scanpy-core-analysis
- ❌ Spatial transcriptomics → Use spatial-transcriptomics-seurat (coming soon)
**Key Concept:** Single-cell RNA-seq captures individual cell transcriptomes, revealing cell type heterogeneity, rare populations, and cell states invisible to bulk methods. This workflow implements Seurat v5 best practices for robust, reproducible analysis.
## Installation
### Required Software
| Package | Version | License | Commercial Use | Installation |
|---------|---------|---------|----------------|--------------|
| Seurat | ≥5.0 | MIT | ✅ Permitted | `install.packages("Seurat")` |
| ggplot2 | ≥3.4 | MIT | ✅ Permitted | `install.packages("ggplot2")` |
| ggprism | ≥1.0.4 | GPL-3 | ✅ Permitted | `install.packages("ggprism")` |
| dplyr | ≥1.0 | MIT | ✅ Permitted | `install.packages("dplyr")` |
| patchwork | ≥1.1 | MIT | ✅ Permitted | `install.packages("patchwork")` |
| DoubletFinder | ≥2.0.3 | CC0 | ✅ Permitted | `install.packages("DoubletFinder")` |
| harmony | ≥0.1.0 | GPL-3 | ✅ Permitted | `install.packages("harmony")` |
| SoupX | ≥1.5 | GPL-2 | ✅ Permitted | `install.packages("SoupX")` |
| DESeq2 | ≥1.36 | LGPL | ✅ Permitted | `BiocManager::install("DESeq2")` |
| muscat | ≥1.10 | GPL-3 | ✅ Permitted | `BiocManager::install("muscat")` |
| SingleR | ≥2.0 | GPL-3 | ✅ Permitted | `BiocManager::install("SingleR")` |
| celldex | ≥1.8 | GPL-3 | ✅ Permitted | `BiocManager::install("celldex")` |
**License Compliance:** All packages use permissive licenses (MIT, GPL, LGPL, CC0) that permit commercial use in AI agent applications. GPL allows commercial use and distribution.
**Minimum versions:** R ≥4.1, Seurat ≥5.0
## Inputs
**Required:**
- **Raw or filtered count matrix** from:
- CellRanger output (`filtered_feature_bc_matrix/` or `raw_feature_bc_matrix/`)
- H5 files (`.h5` from 10X)
- Seurat objects (`.rds`)
- Count matrices (genes × cells, CSV/TSV)
- SeuratData packages (`pbmc3k`, `ifnb`)
**Optional but recommended:**
- **Sample metadata** (CSV/TSV): Sample IDs, conditions, batches, donor IDs
**Data requirements:**
- Minimum 500 cells per sample (1000+ recommended)
- Human (GRCh38) or Mouse (GRCm39)
- UMI-based (10X, Drop-seq) or read counts (Smart-seq2)
**Tissue types:** PBMC, brain, tumor, lung, liver, kidney, muscle, custom. See [references/qc_guidelines.md](references/qc_guidelines.md) for tissue-specific QC thresholds.
## Outputs
**Processed data:**
- `seurat_processed.rds` - Annotated Seurat object for downstream use
- Load with: `seurat_obj <- readRDS('seurat_processed.rds')`
- **Note:** The default assay data slot contains log-normalized (not scaled) data. Scaled data is used internally for PCA but stored separately. This is correct for downstream analysis (DE, visualization).
- Required for: trajectory analysis, cell-cell communication, advanced visualizations
- `normalized_counts.csv` - Normalized expression matrix
- `normalized_counts.rds` - Normalized counts (sparse format, faster loading)
- `cell_metadata.csv` - Cell annotations, clusters, QC metrics
- `umap_coordinates.csv` - UMAP embeddings
- `pca_coordinates.csv` - PCA embeddings
**Visualizations (PNG + SVG at 300 DPI):**
- QC plots (violin, scatter, per-batch)
- UMAP plots (clusters, batches, cell types, QC metrics)
- Heatmaps of cluster markers
- Dot plots for cell type markers
- Volcano/MA plots for pseudobulk DE
**Differential expression:**
- `cluster_markers_all.csv` - Marker genes per cluster (exploratory)
- `{celltype}_deseq2_results.csv` - Pseudobulk DE per cell type (inferential)
**Integration diagnostics (multi-batch):**
- LISI/ASW scores, before/after UMAPs
- `analysis_report.pdf` — Comprehensive PDF report with Introduction, Methods, Results, Conclusions, and embedded figures
**⚠️ PDF style rules:**
- **US Letter page size (8.5 × 11 in)** — always set page dimensions explicitly; do not rely on library defaults
- **No Unicode superscripts** — use `3.36e-06` or `3.36 × 10^(-6)`, not Unicode superscript chars (they render as ■ in PDF fonts)
- **No half-empty pages** — group headings with their content; only page-break before major sections (Results, Conclusions)
- **Figures ≥80% page width** — multi-panel figures must be large enough to read; never embed below 50% width
## Clarification Questions
**Default settings (use unless user specifies otherwise):**
- Format: Filtered 10X CellRanger output
- Species: Human
- Tissue: PBMC
- Normalization: SCTransform
- Clustering: Test resolutions 0.4, 0.6, 0.8, 1.0
- Annotation: Manual
**Questions to ask only if ambiguous:**
### 1. **Input Files** (ASK THIS FIRST):
- Do you have specific single-cell data file(s) to analyze?
- If uploaded: Is this the scRNA-seq data you'd like to process?
- Expected formats: 10X CellRanger output (`filtered_feature_bc_matrix/`), H5 files (`.h5`), Seurat objects (`.rds`), count matrices (CSV/TSV)
- **Or use example data?** (pbmc3k from SeuratData package - see Quick Start below)
### 2. **What format is your data?**
- Filtered 10X matrix (default, `filtered_feature_bc_matrix/`)
- Raw 10X matrix (needs ambient RNA correction)
- H5 file (.h5)
- Seurat object (.rds)
- SeuratData (dataset name)
### 3. **Species and tissue type?**
- **Human** (default) or **Mouse**
- **Tissue:** PBMC (default), brain, tumor, lung, liver, kidney, other
### 4. **Multiple samples or batches?**
- Single sample (no integration)
- Multiple batches (requires integration: Harmony recommended)
### 5. **Which analyses?**
- Ambient RNA correction (raw data or high-soup tissues)
- Doublet detection (recommended)
- Batch integration (multi-batch: Harmony, CCA, or RPCA)
- Cell type annotation (manual, SingleR, or both)
- Pseudobulk DE (condition comparisons)
### 6. **Clustering granularity?**
- Coarse (major types): 0.3-0.5
- Standard (default): 0.6-0.8
- Fine (subtypes): 1.0-1.5
- Test multiple: 0.4, 0.6, 0.8, 1.0 (recommended)
## Quick Start
**Test the workflow with example data in ~15 minutes:**
```r
# Load example data
source("scripts/load_example_data.R")
seurat_obj <- load_seurat_data("pbmc3k")
# Load required core scripts
source("scripts/setup_and_import.R")
source("scripts/qc_metrics.R")
source("scripts/filter_cells.R")
source("scripts/normalize_data.R")
source("scripts/scale_and_pca.R")
source("scripts/cluster_cells.R")
source("scripts/run_umap.R")
source("scripts/find_markers.R")
source("scripts/plot_dimreduction.R")
source("scripts/annotate_celltypes.R")
source("scripts/export_results.R")
setup_seurat_libraries()
# QC and filter
seurat_obj <- calculate_qc_metrics(seurat_obj, species = "human") |>
filter_cells_by_qc(min_features = 200, max_features = 2500, max_mt_percent = 5)
# Normalize and reduce dimensions
seurat_obj <- run_sctransform(seurat_obj, vars_to_regress = "percent.mt") |>
run_pca_analysis(n_pcs = 30) |>
run_umap_reduction(dims = 1:30)
# Cluster and find markers
seurat_obj <- cluster_multiple_resolutions(seurat_obj, dims = 1:30, resolutions = c(0.6, 0.8))
all_markers <- find_all_cluster_markers(seurat_obj, resolution = 0.8)
# Visualize
plot_umap_clusters(seurat_obj, output_dir = "results/umap")
plot_top_markers_heatmap(seurat_obj, all_markers, n_top = 10, output_dir = "results/markers")
# Export all results
export_all(seurat_obj, output_dir = "results")
```
**Expected results:** ~2,700 PBMC cells in 8-9 major cell types (T cells, B cells, monocytes, NK cells, dendritic cells)
**For complete analysis with all QC steps:** See [assets/eval/complete_example_analysis.R](assets/eval/complete_example_analysis.R)
## 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/scrnaseq-seurat-core-analysis'))
> ```
Complete scRNA-seq analysis in 10 steps using modular scripts. **CRITICAL: Use relative paths (knowledge_base/scripts/scrnaseq-seurat-core-analysis/, references/). DO NOT construct absolute paths like /mnt/knowhow/**
**Detailed code examples and explanations:** [references/workflow-details.md](references/workflow-details.md)
### Phase 1: QC and Filtering (Steps 1-3)
**Step 1: Ambient RNA Correction** (Optional - Raw Data Only)
🚨 **Execute these function calls directly - do not reimplement:**
[scripts/remove_ambient_rna.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/remove_ambient_rna.R)
```r
source("scripts/remove_ambient_rna.R")
seurat_obj <- run_soupx_correction(raw_matrix_dir, filtered_matrix_dir)
```
**✅ VERIFICATION:** You should see: `"✓ SoupX correction completed successfully!"`
**When to use:** Raw matrices or high-soup tissues (brain, lung, tumor). See [references/ambient_rna_correction.md](references/ambient_rna_correction.md)
⚠️ **DO NOT** write inline SoupX correction code → causes parameter mismatches and inconsistent results
**Step 2: Load Data and Calculate QC**
🚨 **Execute these function calls directly - do not reimplement:**
[scripts/setup_and_import.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/setup_and_import.R), [scripts/qc_metrics.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/qc_metrics.R)
```r
source("scripts/setup_and_import.R")
source("scripts/qc_metrics.R")
seurat_obj <- import_10x_data("filtered_feature_bc_matrix/")
seurat_obj <- calculate_qc_metrics(seurat_obj, species = "human")
seurat_obj <- batch_mad_outlier_detection(seurat_obj, batch_col = "batch", nmads = 5)
```
**✅ VERIFICATION:** You should see: `"✓ QC metrics calculated successfully"` and `"✓ MAD outlier detection completed"`
**QC Metrics calculated:** `nFeature_RNA` (genes/cell), `nCount_RNA` (UMIs/cell), `percent.mt` (mitochondrial %)
**Decision:** MAD (adapts to batches) or fixed tissue thresholds. See [references/qc_guidelines.md](references/qc_guidelines.md)
⚠️ **DO NOT** write inline QC calculation code → missing mitochondrial gene patterns, incorrect species handling
**Step 3: Doublet Detection and Filtering**
🚨 **Execute these function calls directly - do not reimplement:**
[scripts/filter_cells.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/filter_cells.R)
```r
source("scripts/filter_cells.R")
seurat_obj <- run_doubletfinder(seurat_obj, batch_col = "batch")
seurat_obj <- filter_by_mad_outliers(seurat_obj, remove_doublets = TRUE)
```
**✅ VERIFICATION:** You should see: `"✓ DoubletFinder completed successfully"` and `"✓ Cell filtering completed successfully"`
**QC checkpoint:** Aim for >70% cell retention
⚠️ **DO NOT** write inline doublet detection code → DoubletFinder has complex parameterization that requires batch-aware setup
### Phase 2: Normalization and Dimensionality Reduction (Steps 4-5)
**Step 4: Normalize and Select Features**
🚨 **Execute these function calls directly - choose ONE normalization method:**
[scripts/normalize_data.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/normalize_data.R)
```r
source("scripts/normalize_data.R")
# SCTransform (recommended for UMI data)
seurat_obj <- run_sctransform(seurat_obj, vars_to_regress = "percent.mt")
# Alternative: LogNormalize (faster, classic workflow)
seurat_obj <- run_lognormalize(seurat_obj)
```
**✅ VERIFICATION:** You should see: `"✓ SCTransform normalization completed"` or `"✓ LogNormalize completed"`
**Decision:** SCTransform (UMI, batch effects) or LogNormalize (speed, non-UMI). See [references/seurat_best_practices.md](references/seurat_best_practices.md)
⚠️ **DO NOT** write inline normalization code → SCTransform has complex variance stabilization; LogNormalize requires proper scaling
**Step 5: PCA and Determine Dimensionality**
🚨 **Execute these function calls directly:**
[scripts/scale_and_pca.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/scale_and_pca.R)
```r
source("scripts/scale_and_pca.R")
seurat_obj <- run_pca_analysis(seurat_obj, n_pcs = 50)
plot_elbow(seurat_obj, output_dir = "results/pca")
```
**✅ VERIFICATION:**
- `"PCA loadings verified: N variable features used"` — if you see a WARNING about feature count mismatch, check feature selection
- Cumulative variance printed for PC1-10, PC1-20, PC1-30
- After PCA, call `suggest_n_pcs(seurat_obj)` to get recommended PC count for Step 7
**Decision:** Look for "elbow" in scree plot. **Standard: 20-30 PCs. NEVER use <15 PCs.** Use `suggest_n_pcs()` for data-driven recommendation.
⚠️ **DO NOT** write inline PCA code → missing proper feature selection and scaling steps
### Phase 3: Integration (Step 6 - Multi-Batch Only)
**Step 6: Batch Integration**
🚨 **Execute these function calls directly - skip if single-batch data:**
[scripts/integrate_batches.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/integrate_batches.R), [scripts/integration_diagnostics.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/integration_diagnostics.R)
```r
source("scripts/integrate_batches.R")
source("scripts/integration_diagnostics.R")
# Harmony (fast, recommended)
seurat_obj <- run_harmony_integration(seurat_obj, batch_var = "batch", dims_use = 1:30)
# Validate integration
lisi_scores <- compute_lisi_scores(seurat_obj, batch_var = "batch", reduction = "harmony")
```
**✅ VERIFICATION:** You should see: `"✓ Harmony integration completed successfully"` and LISI score summary
**Success criteria:** Batch LISI ≈1 (good mixing), cell type LISI preserved. See [references/integration_methods.md](references/integration_methods.md)
⚠️ **DO NOT** write inline Harmony/CCA integration code → complex parameter tuning and batch handling required
### Phase 4: Clustering and Visualization (Steps 7-8)
**Step 7: Clustering and UMAP**
🚨 **Execute these function calls directly:**
[scripts/cluster_cells.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/cluster_cells.R), [scripts/run_umap.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/run_umap.R)
```r
source("scripts/cluster_cells.R")
source("scripts/run_umap.R")
reduction <- if ("harmony" %in% names(seurat_obj@reductions)) "harmony" else "pca"
# Default dims=1:30 is standard. NEVER use <15 PCs.
seurat_obj <- cluster_multiple_resolutions(seurat_obj, dims = 1:30, reduction = reduction, resolutions = c(0.4, 0.6, 0.8, 1.0))
seurat_obj <- run_umap_reduction(seurat_obj, dims = 1:30, reduction = reduction)
```
**⚠️ dims for clustering:** Default is `1:30` (standard). Using <15 PCs risks collapsing distinct populations. If you used `suggest_n_pcs()` in Step 5, pass `1:suggested_pcs` here.
**✅ VERIFICATION:** You should see: `"✓ Clustering completed at X resolutions"` and `"✓ UMAP completed successfully"`
⚠️ **DO NOT** write inline clustering code → graph construction and Louvain algorithm have many hyperparameters
**Step 8: Find Markers and Visualize**
🚨 **Execute these function calls directly:**
[scripts/find_markers.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/find_markers.R), [scripts/plot_dimreduction.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/plot_dimreduction.R)
```r
source("scripts/find_markers.R")
source("scripts/plot_dimreduction.R")
all_markers <- find_all_cluster_markers(seurat_obj, resolution = 0.8)
plot_umap_clusters(seurat_obj, output_dir = "results/umap")
plot_top_markers_heatmap(seurat_obj, all_markers, n_top = 10)
```
**✅ VERIFICATION:**
- `"✓ Found markers for X clusters"` and plots saved in results/umap/
- After `find_all_cluster_markers()`: verify the returned DataFrame and print `head(all_markers)` to confirm values are sensible before saving to CSV.
**Important:** Exploratory DE for characterizing clusters. For condition comparisons, use pseudobulk (Step 10).
⚠️ **DO NOT** write inline marker finding or plotting code (ggsave, ggplot, DimPlot, FeaturePlot, etc.) → publication-quality plots require ggprism/ggrepel; marker tests need proper multiple testing correction. Scripts handle PNG + SVG export with graceful fallback.
### Phase 5: Annotation and Differential Expression (Steps 9-10)
**Step 9: Annotate Cell Types**
[scripts/annotate_celltypes.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/annotate_celltypes.R)
**For manual annotation (recommended):**
```r
source("scripts/annotate_celltypes.R")
# Define annotations based on marker genes
annotations <- c("0" = "CD4 T cells", "1" = "CD14+ Monocytes", ...)
seurat_obj <- annotate_clusters_manual(seurat_obj, annotations, resolution = 0.8)
```
**For automated annotation:**
```r
seurat_obj <- annotate_with_singler(seurat_obj, reference = "HPCA")
```
**✅ VERIFICATION:** You should see: `"✓ Cell type annotation completed"` and updated metadata
**Decision:** Manual (accurate) vs Automated (fast). See [references/marker_gene_database.md](references/marker_gene_database.md)
**Step 10: Pseudobulk DE** (Multi-Sample Only)
🚨 **Execute these function calls directly:**
[scripts/pseudobulk_de.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/pseudobulk_de.R)
```r
source("scripts/pseudobulk_de.R")
pseudobulk_data <- aggregate_to_pseudobulk(seurat_obj, sample_col = "sample_id", celltype_col = "cell_type")
de_results <- run_pseudobulk_deseq2(pseudobulk_data, formula = "~ batch + condition", contrast = c("condition", "treated", "control"))
```
**✅ VERIFICATION:** You should see: `"✓ Pseudobulk aggregation completed"` and `"✓ DESeq2 analysis completed"`
**Critical:** Exploratory (Step 8, Wilcoxon on cells) vs Inferential (Step 10, DESeq2 on pseudobulk). See [references/pseudobulk_de_guide.md](references/pseudobulk_de_guide.md)
⚠️ **DO NOT** write inline pseudobulk aggregation or DESeq2 code → requires proper sample-level aggregation and statistical modeling
### Phase 6: Export Results (Step 11)
**Step 11: Export All Results**
🚨 **MANDATORY: USE export_all() - DO NOT WRITE CUSTOM EXPORT CODE** 🚨
[scripts/export_results.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/export_results.R)
```r
source("scripts/export_results.R")
export_all(seurat_obj, output_dir = "results", all_markers = all_markers)
```
**DO NOT write custom export code. Use export_all().**
**✅ VERIFICATION:** You MUST see: `"=== Export Complete ==="`
**What gets exported:**
- Seurat object (RDS) for downstream analysis
- Normalized counts (CSV + RDS)
- Cell metadata with clusters and annotations
- UMAP/PCA coordinates
- Marker gene tables (if all_markers provided)
- Summary statistics
⚠️ **DO NOT** write inline export code → missing RDS objects breaks downstream skills
---
**That's it! The scripts handle all complex operations automatically.**
**What the scripts provide:**
- [scripts/setup_and_import.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/setup_and_import.R) - Data import functions for 10X, H5, and matrix formats
- [scripts/qc_metrics.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/qc_metrics.R) - Comprehensive QC with species-aware mitochondrial detection
- [scripts/filter_cells.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/filter_cells.R) - DoubletFinder integration and MAD-based filtering
- [scripts/normalize_data.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/normalize_data.R) - SCTransform and LogNormalize workflows
- [scripts/integrate_batches.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/integrate_batches.R) - Harmony, CCA, RPCA integration methods
- [scripts/plot_dimreduction.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/plot_dimreduction.R) - Publication-quality plots **with automatic SVG fallback handling**
- [scripts/pseudobulk_de.R](knowledge_base/scripts/scrnaseq-seurat-core-analysis/pseudobulk_de.R) - Proper pseudobulk aggregation and DESeq2 analysis
---
⚠️ **CRITICAL ENFORCEMENT RULES:**
**DO NOT:**
- ❌ **Write inline plotting code (ggsave, DimPlot, FeaturePlot, etc.)** → Use plotting scripts
- ❌ **Write inline analysis code** → Use provided workflow scripts
- ❌ **Try to install svglite** → scripts handle SVG fallback automatically
**⚠️ 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.**
---
## Decision Guide
Make six critical decisions during analysis:
| Decision | Options | Quick Guide | Detailed Reference |
|----------|---------|-------------|-------------------|
| **Ambient RNA** | Skip / SoupX | Skip for filtered/PBMC. Use for raw/high-soup tissues (brain, lung, tumor) | [ambient_rna_correction.md](references/ambient_rna_correction.md) |
| **QC Strategy** | MAD / Fixed | MAD (multi-batch, adapts). Fixed (single batch, tissue-specific) | [qc_guidelines.md](references/qc_guidelines.md) |
| **Normalization** | SCTransform / LogNormalize | SCTransform (UMI, batch effects). LogNormalize (speed, non-UMI) | [seurat_best_practices.md](references/seurat_best_practices.md) |
| **Integration** | Harmony / CCA / RPCA | Harmony (fast, simple). CCA (complex batches). RPCA (>100k cells) | [integration_methods.md](references/integration_methods.md) |
| **Resolution** | 0.4-1.5 | Test multiple (0.4, 0.6, 0.8, 1.0). Choose by biology and stability | [seurat_best_practices.md#clustering](references/seurat_best_practices.md#clustering) |
| **Annotation** | Manual / SingleR / Both | Manual (accurate, needs expertise). SingleR (fast, may misclassify). Both (validate) | [marker_gene_database.md](references/marker_gene_database.md) |
**Comprehensive decision guidance:** [references/decision-guide.md](references/decision-guide.md)
## Common Issues
| Issue | Cause | Solution |
|-------|-------|----------|
| "Cannot find package 'Seurat'" | Package not installed | `install.packages("Seurat")` or check R version ≥4.1 |
| Low cell retention (<50%) | Too strict QC thresholds | Use MAD-based filtering instead of fixed thresholds. Review tissue-specific QC guidelines: [references/qc_guidelines.md](references/qc_guidelines.md) |
| "No harmony reduction found" | Trying to cluster on harmony before integration | Skip integration step for single-batch data, or run `run_harmony_integration()` before clustering |
| Clusters don't separate on UMAP | Wrong reduction used or insufficient PCs | Verify using correct reduction (`harmony` for integrated, `pca` for single-batch). Increase dims to 30-40 PCs |
| Memory error during SCTransform | Dataset too large (>50k cells) | Use `run_lognormalize()` instead, or process in batches |
| All cells marked as doublets | DoubletFinder parameters incorrect | Check expected doublet rate (typically 0.075 per 1000 cells). Use batch-aware processing |
| "Cannot find mitochondrial genes" | Wrong species or gene format | Specify correct species in `calculate_qc_metrics()`. Check if genes use gene symbols (MT-) or Ensembl IDs |
**Detailed troubleshooting:** [references/troubleshooting_guide.md](references/troubleshooting_guide.md)
## Common Patterns
### Pattern 1: Standard 10X PBMC Analysis
```r
# QC and filter
seurat_obj <- import_10x_data("filtered_feature_bc_matrix/") |>
calculate_qc_metrics(species = "human") |>
run_doubletfinder() |>
filter_by_mad_outliers(remove_doublets = TRUE)
# Normalize and cluster
seurat_obj <- seurat_obj |>
run_sctransform(vars_to_regress = "percent.mt") |>
run_pca_analysis(n_pcs = 50) |>
cluster_multiple_resolutions(dims = 1:30, resolutions = c(0.4, 0.6, 0.8)) |>
run_umap_reduction(dims = 1:30)
# Annotate
all_markers <- find_all_cluster_markers(seurat_obj, resolution = 0.8)
seurat_obj <- annotate_clusters_manual(seurat_obj, annotations)
```
### Pattern 2: Multi-Batch Integration
```r
# After QC/filtering and normalization
seurat_obj <- seurat_obj |>
run_pca_analysis(n_pcs = 50) |>
run_harmony_integration(batch_var = "batch", dims_use = 1:30)
lisi_scores <- compute_lisi_scores(seurat_obj, batch_var = "batch", reduction = "harmony")
# Cluster on integrated space
seurat_obj <- seurat_obj |>
cluster_multiple_resolutions(dims = 1:30, reduction = "harmony") |>
run_umap_reduction(dims = 1:30, reduction = "harmony")
```
### Pattern 3: Condition Comparison with Pseudobulk
```r
# After clustering and annotation
pseudobulk_data <- aggregate_to_pseudobulk(seurat_obj, sample_col = "sample_id", celltype_col = "cell_type")
de_results <- run_pseudobulk_deseq2(pseudobulk_data, formula = "~ donor + condition", contrast = c("condition", "disease", "healthy"))
```
**Additional patterns and complete code examples:** [references/common-patterns.md](references/common-patterns.md)
## Suggested Next Steps
After completing core scRNA-seq analysis:
1. **Functional Enrichment** - Use functional-enrichment-from-degs to test pseudobulk DE results for enriched pathways and interpret biological differences
2. **Trajectory Analysis** - Monocle3, Slingshot, or RNA velocity for developmental/differentiation datasets
3. **Cell-Cell Communication** - CellChat, CellPhoneDB, or NicheNet for ligand-receptor interactions
4. **Advanced Visualization** - Alluvial diagrams, proportional bar plots, gene regulatory networks
## Related Skills
**Alternative single-cell:** scrnaseq-scanpy-core-analysis (Python-based)
**Downstream:** functional-enrichment-from-degs, de-results-to-plots, de-results-to-gene-lists
**Complementary:** bulk-omics-clustering (non-scRNA-seq), experimental-design-statistics (plan experiments)
## References
### Primary Citations
1. **Seurat v5:** Hao Y, et al. (2024) Dictionary learning for integrative, multimodal and scalable single-cell analysis. *Nat Biotechnol*. 42:293-304.
2. **SCTransform:** Hafemeister C, Satija R. (2019) Normalization and variance stabilization of single-cell RNA-seq data. *Genome Biol*. 20:296.
3. **Pseudobulk DE:** Squair JW, et al. (2021) Confronting false discoveries in single-cell differential expression. *Nat Commun*. 12:5692.
4. **Harmony:** Korsunsky I, et al. (2019) Fast, sensitive and accurate integration of single-cell data. *Nat Methods*. 16:1289-1296.
### Detailed Documentation
**Reference guides:**
- [references/decision-guide.md](references/decision-guide.md) - Comprehensive decision guidance for all workflow choices
- [references/workflow-details.md](references/workflow-details.md) - Detailed code examples for all workflow steps
- [references/common-patterns.md](references/common-patterns.md) - Complete code patterns and use cases
- [references/seurat_best_practices.md](references/seurat_best_practices.md) - Comprehensive best practices
- [references/qc_guidelines.md](references/qc_guidelines.md) - Tissue-specific QC thresholds
- [references/integration_methods.md](references/integration_methods.md) - Batch integration comparison
- [references/pseudobulk_de_guide.md](references/pseudobulk_de_guide.md) - Pseudobulk methodology
- [references/ambient_rna_correction.md](references/ambient_rna_correction.md) - SoupX guidance
- [references/marker_gene_database.md](references/marker_gene_database.md) - Cell type markers
- [references/troubleshooting_guide.md](references/troubleshooting_guide.md) - Common issues
**Scripts:** See [scripts/](knowledge_base/scripts/scrnaseq-seurat-core-analysis/) for all modular R functions
**Evaluation:** [assets/eval/complete_example_analysis.R](assets/eval/complete_example_analysis.R) - Full PBMC 3k example
**Online resources:**
- Official Seurat tutorials: https://satijalab.org/seurat/articles/
- Seurat GitHub: https://github.com/satijalab/seurat
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!