# Spatial Deconvolution Analysis Estimate cell type compositions in spatial transcriptomics spots using deep learning methods from scvi-tools and cell2location. ## Platform Applicability **This is the correct workflow for cell type identification on spot-based platforms** (Visium, Slide-seq, ST). Each spot contains multiple cells, so deconvolution estimates cell type **proportions** rather than assigning a single label. If a user asks to "annotate cell types" on Visium or other spot-based data, this is the appropriate skill. For single-cell resolution platforms (MERFISH, Xenium, CosMx, SeqFISH), use the `annotation` skill instead. --- ## Prerequisites **Required**: - Single-cell RNA-seq reference (h5ad) with cell type annotations - Spatial transcriptomics data (h5ad) - Visium, Slide-seq, or similar - Common genes between datasets (>100 recommended) - GPU recommended for faster training **Optional**: - Batch information for multi-sample integration - Raw counts (preferred over normalized data) --- ## Available Methods | Method | Use Case | Speed | Outputs | |--------|----------|-------|---------| | **DestVI** | Multi-resolution analysis with cell state variation | Medium | Proportions + gamma latent space | | **Cell2location** | Bayesian mapping with uncertainty quantification | Slow | Abundance with confidence intervals | | **Stereoscope** | Simple cell type proportions | Fast | Proportions | | **gimVI** | Gene imputation for limited panels | Medium | Imputed gene expression | --- ## Workflow Overview 1. **Explore datasets** (check cell type annotations, gene overlap) 2. Choose deconvolution method based on use case 3. Run deconvolution 4. Visualize and interpret results --- ## Step 1: Explore Datasets Use `execute_python` to check data compatibility: ```python import scanpy as sc # Load data sc_adata = sc.read_h5ad("path/to/reference.h5ad") st_adata = sc.read_h5ad("path/to/spatial.h5ad") # Check cell type annotations print(f"scRNA-seq: {sc_adata.shape}") print(f"Cell types: {sc_adata.obs['cell_type'].nunique()}") print(sc_adata.obs['cell_type'].value_counts()) # Check gene overlap common = set(sc_adata.var_names) & set(st_adata.var_names) print(f"\nSpatial: {st_adata.shape}") print(f"Common genes: {len(common)}") ``` --- ## Step 2: Choose Method ### Option A: DestVI (Recommended for detailed analysis) Best for: Understanding cell state variation within cell types **Tool**: `destvi_deconvolution` - `sc_adata_path`: Path to scRNA-seq reference - `st_adata_path`: Path to spatial data - `cell_type_key`: Cell type column name - `sc_max_epochs`: 300 (single-cell model) - `st_max_epochs`: 2500 (spatial model) **Outputs**: - `destvi_proportions.csv`: Cell type proportions per spot - `destvi_spatial.h5ad`: Spatial data with proportions in obsm - Trained models for further analysis (gamma space) ### Option B: Cell2location (Best uncertainty quantification) Best for: Bayesian inference with tissue-specific priors **Tool**: `cell2location_mapping` - `sc_adata_path`: Path to scRNA-seq reference - `st_adata_path`: Path to spatial data - `cell_type_key`: Cell type column name - `batch_key`: Optional batch column for multi-sample reference - `n_cells_per_location`: Expected cells per spot (tissue-dependent) - ~30 for lymph node - ~8 for brain - ~20 for most tissues (default) - `detection_alpha`: 200 (default), use 20 for high batch variation **Outputs**: - `cell2location_abundance.csv`: 5% quantile of cell abundance (confident estimates) - `cell2location_spatial.h5ad`: Full posterior results - Trained models for visualization ### Option C: Stereoscope (Fast and simple) Best for: Quick deconvolution with straightforward proportions **Tool**: `stereoscope_deconvolution` - `sc_adata_path`: Path to scRNA-seq reference - `st_adata_path`: Path to spatial data - `cell_type_key`: Cell type column name - `sc_max_epochs`: 100 - `st_max_epochs`: 2000 **Outputs**: - `stereoscope_proportions.csv`: Cell type proportions per spot - `stereoscope_spatial.h5ad`: Spatial data with proportions ### Option D: gimVI (Gene imputation) Best for: Imputing missing genes in limited spatial panels (FISH-based) **Tool**: `gimvi_imputation` - `sc_adata_path`: Path to scRNA-seq reference - `st_adata_path`: Path to spatial data - `genes_to_impute`: Comma-separated list (empty for all missing) - `max_epochs`: 200 **Outputs**: - `gimvi_imputed.csv`: Imputed expression matrix - `gimvi_spatial.h5ad`: Spatial data with imputed values in obsm --- ## Step 3: Visualize Results ```python import scanpy as sc import pandas as pd import matplotlib.pyplot as plt # Load results st_adata = sc.read_h5ad("experiments/destvi_spatial.h5ad") proportions = pd.read_csv("experiments/destvi_proportions.csv", index_col=0) # Plot cell type distribution fig, axes = plt.subplots(2, 3, figsize=(15, 10)) for i, ct in enumerate(proportions.columns[:6]): ax = axes.flat[i] st_adata.obs[ct] = proportions[ct] sc.pl.spatial(st_adata, color=ct, ax=ax, show=False, title=ct) plt.tight_layout() plt.savefig("celltype_distribution.png", dpi=150) ``` --- ## Tips 1. **Data preparation**: Use raw counts when possible. Normalized data may affect model training. 2. **Gene filtering**: Filter to common genes before running. Low-quality genes (few cells expressing) may add noise. 3. **Training time**: DestVI and Cell2location require longer training. Use GPU for faster convergence. 4. **Cell type balance**: Ensure reference has sufficient cells for each cell type (>50 recommended). 5. **Tissue-specific parameters**: Adjust `n_cells_per_location` based on expected tissue density. 6. **Quality assessment**: - Check reconstruction loss converges - Verify proportions sum to ~1 per spot - Compare known marker genes with deconvolution results --- ## Method Comparison | Aspect | DestVI | Cell2location | Stereoscope | gimVI | |--------|--------|---------------|-------------|-------| | Speed | Medium | Slow | Fast | Medium | | Memory | High | High | Medium | Medium | | Cell states | Yes (gamma) | No | No | N/A | | Uncertainty | No | Yes (posterior) | No | No | | Batch effects | Limited | Yes | No | No | | GPU required | Recommended | Recommended | Optional | Optional |