Skip to contents

A unified R package for detecting spatially variable genes (SVGs) in spatial transcriptomics data, integrating multiple state-of-the-art methods with optimized performance.

📚 Documentation: https://zaoqu-liu.github.io/SVG/

Overview

SVG detection is a fundamental step in spatial transcriptomics analysis, identifying genes whose expression patterns exhibit significant spatial structure. This package provides:

  • Four SVG detection methods with a unified interface
  • Optimized implementations with C++ acceleration
  • Comprehensive documentation with scientific details
  • Flexible parameters for method customization

Installation

# Install from R-Universe
install.packages("SVG", repos = "https://zaoqu-liu.r-universe.dev")

From GitHub

# Install from GitHub
devtools::install_github("Zaoqu-Liu/SVG")

# Or install with dependencies
devtools::install_github("Zaoqu-Liu/SVG", dependencies = TRUE)

From Bioconductor (Coming Soon)

# Install from Bioconductor (after acceptance)
BiocManager::install("SVG")

Dependencies

Core dependencies (automatically installed): - Matrix, Rcpp, RcppArmadillo

Optional dependencies for specific methods:

# For Delaunay triangulation
install.packages("geometry")

# For KNN network
install.packages("RANN")

# For nnSVG method (required)
install.packages("BRISC")

# For accurate p-values
install.packages("CompQuadForm")

Quick Start

library(SVG)

# Load your data
# expr_matrix: genes x spots (rows x columns)
# spatial_coords: spots x coordinates (x, y)

# Unified interface
results <- CalSVG(expr_matrix, spatial_coords, method = "meringue")

# Or use method-specific functions
results_meringue <- CalSVG_MERINGUE(expr_matrix, spatial_coords)
results_binspect <- CalSVG_binSpect(expr_matrix, spatial_coords)
results_sparkx <- CalSVG_SPARKX(expr_matrix, spatial_coords)
results_nnsvg <- CalSVG_nnSVG(expr_matrix, spatial_coords)

# Get significant SVGs
sig_genes <- results$gene[results$p.adj < 0.05]

Methods

1. MERINGUE (Moran’s I with Network)

Spatial autocorrelation using Moran’s I with binary adjacency network.

results <- CalSVG_MERINGUE(
    expr_matrix,
    spatial_coords,
    network_method = "delaunay",  # or "knn"
    k = 10,                       # neighbors for KNN
    alternative = "greater",      # test for clustering
    adjust_method = "BH"
)

Best for: General SVG detection with explicit spatial network

2. Seurat (Moran’s I with Distance Weights)

Moran’s I using inverse distance squared weights (Seurat default).

results <- CalSVG_Seurat(
    expr_matrix,
    spatial_coords,
    weight_scheme = "inverse_squared",  # 1/d^2 (default)
    adjust_method = "BH"
)

Best for: Compatible with Seurat workflow, continuous distance weighting

3. binSpect (Giotto)

Binary spatial enrichment test using Fisher’s exact test.

results <- CalSVG_binSpect(
    expr_matrix,
    spatial_coords,
    bin_method = "kmeans",   # or "rank"
    rank_percent = 30,       # for rank method
    do_fisher_test = TRUE
)

Best for: Fast computation, robust to outliers

4. SPARK-X

Non-parametric kernel-based test using multiple spatial kernels.

results <- CalSVG_SPARKX(
    expr_matrix,
    spatial_coords,
    kernel_option = "mixture",  # or "single"
    n_threads = 4
)

Best for: Large datasets, diverse pattern types

5. nnSVG

Nearest-neighbor Gaussian processes for spatial modeling.

results <- CalSVG_nnSVG(
    expr_matrix,
    spatial_coords,
    n_neighbors = 10,
    cov_model = "exponential",
    n_threads = 4
)

Best for: Statistical rigor, effect size estimation

6. Mark Variogram

Spatial pattern detection using mark variogram from spatstat.

results <- CalSVG_MarkVario(
    expr_matrix,
    spatial_coords,
    r_metric = 5,       # distance to evaluate variogram
    normalize = TRUE
)

Best for: Different perspective on spatial patterns

Method Comparison

Method Principle Speed Scalability Effect Size
MERINGUE Moran’s I (network) Fast Medium Moderate
Seurat Moran’s I (1/d²) Fast Medium Moderate
binSpect Fisher test Very Fast High Odds ratio
SPARK-X Kernel test Fast Very High No
nnSVG Gaussian process Slow Medium Yes (prop_sv)
MarkVario Variogram Moderate Medium Variogram value

Output Columns

All methods return a data.frame with unified column names:

Column Description
gene Gene identifier
p.value Raw p-value
p.adj Adjusted p-value (BH/FDR)

Method-specific columns:

Method Additional Columns
MERINGUE observed, expected, sd, z_score
Seurat observed, expected, sd, rank
binSpect estimate (odds ratio), score
SPARK-X stat_*, pval_* (per kernel)
nnSVG sigma.sq, tau.sq, phi, prop_sv, LR_stat
MarkVario r.metric.value, rank (no p-values)

Tutorials

Tutorial Description
Introduction Complete guide with all methods, benchmarks, and visualizations

Examples

Basic Workflow

library(SVG)

# Simulate data
set.seed(42)
n_spots <- 500
n_genes <- 100

# Expression matrix (genes x spots)
expr <- matrix(rpois(n_genes * n_spots, lambda = 10), 
               nrow = n_genes)
rownames(expr) <- paste0("gene_", 1:n_genes)
colnames(expr) <- paste0("spot_", 1:n_spots)

# Add spatial pattern to first 10 genes
coords <- cbind(x = runif(n_spots, 0, 100),
                y = runif(n_spots, 0, 100))
rownames(coords) <- colnames(expr)

# Create spatial gradient for first genes
for (i in 1:10) {
    expr[i, ] <- expr[i, ] + round(coords[, 1] / 10)
}

# Run SVG detection
results <- CalSVG(expr, coords, method = "meringue")

# Top SVGs
head(results)

# Significant genes
sig_genes <- results$gene[results$p.adj < 0.05]
print(sig_genes)

Integration with SpatialExperiment

library(SpatialExperiment)
library(SVG)

# From SpatialExperiment object
spe <- readRDS("your_spe.rds")

expr_matrix <- as.matrix(logcounts(spe))
spatial_coords <- spatialCoords(spe)

results <- CalSVG(expr_matrix, spatial_coords, method = "meringue")

Parallel Processing

# Use multiple cores for faster computation
results <- CalSVG(
    expr_matrix, spatial_coords,
    method = "sparkx",
    n_threads = parallel::detectCores() - 1
)

Citation

If you use this package, please cite:

Liu Z. (2024). SVG: Spatially Variable Genes Detection Methods.
R package version 1.0.0. https://github.com/Zaoqu-Liu/SVG

And cite the original method papers: - MERINGUE: Miller et al. (2021) Genome Research - binSpect: Dries et al. (2021) Genome Biology
- SPARK-X: Zhu et al. (2021) Genome Biology - nnSVG: Weber et al. (2023) Nature Communications

License

MIT License

Author

Zaoqu Liu
Chinese Academy of Medical Sciences and Peking Union Medical College
Email:
ORCID: 0000-0002-0452-742X

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

See Also

  • Giotto - Spatial transcriptomics analysis suite
  • MERINGUE - Original MERINGUE package
  • SPARK - Original SPARK/SPARK-X package
  • nnSVG - Original nnSVG package