Here, we demonstrate how BANKSY can be used with Harmony for integrating multiple spatial omics datasets in the presence of strong batch effects. We use 10x Visium data of the human dorsolateral prefrontal cortex from Maynard et al (2018). The data comprise 12 samples obtained from 3 subjects, with manual annotation of the layers in each sample.

Loading the data

We fetch the data for all 12 DLPFC samples with the spatialLIBD package. This might take awhile.

library(spatialLIBD)
library(ExperimentHub)

ehub <- ExperimentHub::ExperimentHub()
spe <- spatialLIBD::fetch_data(type = "spe", eh = ehub)

After the download is completed, we trim the SpatialExperiment object, retaining only the counts and some metadata such as the sample identifier and pathology annotations. This saves some memory.

#' Remove NA spots
na_id <- which(is.na(spe$layer_guess_reordered_short))
spe <- spe[, -na_id]

#' Trim
imgData(spe) <- NULL
assay(spe, "logcounts") <- NULL
reducedDims(spe) <- NULL
rowData(spe) <- NULL
colData(spe) <- DataFrame(
    sample_id = spe$sample_id,
    subject_id = factor(spe$sample_id, labels = rep(paste0("Subject", 1:3), each = 4)),
    clust_annotation = factor(as.numeric(spe$layer_guess_reordered_short)),
    in_tissue = spe$in_tissue,
    row.names = colnames(spe)
)
colnames(spe) <- paste0(colnames(spe), "_", spe$sample_id)
invisible(gc())

We analyse the first sample of each subject due to vignette runtime constraints.

spe <- spe[, spe$sample_id %in% c("151507", "151669", "151673")]
sample_names <- unique(spe$sample_id)

Next, stagger the spatial coordinates across the samples so that spots from different samples do not overlap.

#' Stagger spatial coordinates
locs <- spatialCoords(spe)
locs <- cbind(locs, sample_id = factor(spe$sample_id))
locs_dt <- data.table(locs)
colnames(locs_dt) <- c("sdimx", "sdimy", "group")
locs_dt[, sdimx := sdimx - min(sdimx), by = group]
global_max <- max(locs_dt$sdimx) * 1.5
locs_dt[, sdimx := sdimx + group * global_max]
locs <- as.matrix(locs_dt[, 1:2])
rownames(locs) <- colnames(spe)
spatialCoords(spe) <- locs

Data preprocessing

Find highly variable features and normalize counts. Here we use Seurat, but other methods may also be used (e.g. scran::getTopHVGs).

#' Get HVGs
seu <- as.Seurat(spe, data = NULL)
seu <- FindVariableFeatures(seu, nfeatures = 2000)

#' Normalize data
scale_factor <- median(colSums(assay(spe, "counts")))
seu <- NormalizeData(seu, scale.factor = scale_factor, normalization.method = "RC")

#' Add data to SpatialExperiment and subset to HVGs
aname <- "normcounts"
assay(spe, aname) <- GetAssayData(seu)
spe <- spe[VariableFeatures(seu),]

Running BANKSY

We run BANKSY PCA in lazy mode (the default), which computes the neighborhood feature matrix and PCA directly without materializing the full BANKSY matrix. We use k_geom=18 corresponding to first and second-order neighbors in 10x Visium.

lambda <- 0.2
k_geom <- 18
npcs <- 20
spe <- runBanksyPCA(spe, assay_name = aname, lambda = lambda, k_geom = k_geom, npcs = npcs, seed = SEED)

Run Harmony on BANKSY’s embedding

We run Harmony on the PCs of the BANKSY matrix:

set.seed(SEED)
harmony_embedding <- harmony::RunHarmony(
    data_mat = reducedDim(spe, "PCA_M0_lam0.2"),
    meta_data = colData(spe),
    vars_use = c("sample_id", "subject_id"),
    max_iter = 20,
    verbose = FALSE
)
reducedDim(spe, "Harmony_BANKSY") <- harmony_embedding

Next, run UMAP on the ‘raw’ and Harmony corrected PCA embeddings:

spe <- runBanksyUMAP(spe, lambda = lambda, npcs = npcs)
spe <- runBanksyUMAP(spe, dimred = "Harmony_BANKSY")

Visualize the UMAPs annotated by subject ID:

plot_grid(
    plotReducedDim(spe, "UMAP_M0_lam0.2",
                   point_size = 0.1,
                   point_alpha = 0.5,
                   color_by = "subject_id") +
        theme(legend.position = "none"),
    plotReducedDim(spe, "UMAP_Harmony_BANKSY", 
                   point_size = 0.1,
                   point_alpha = 0.5,
                   color_by = "subject_id") +
        theme(legend.title = element_blank()) +
        guides(colour = guide_legend(override.aes = list(size = 5, alpha = 1))),
    nrow = 1,
    rel_widths = c(1, 1.2)
)

Cluster the Harmony corrected PCA embedding:

spe <- clusterBanksy(spe, dimred = "Harmony_BANKSY", resolution = 0.55, seed = SEED)
spe <- connectClusters(spe, map_to = "clust_annotation")

Generate spatial plots:

cnm <- clusterNames(spe)[2]
spatial_plots <- lapply(sample_names, function(snm) {
    x <- spe[, spe$sample_id == snm]
    ari <- aricode::ARI(x$clust_annotation, colData(x)[, cnm])
    
    df <- cbind.data.frame(clust=colData(x)[[cnm]], spatialCoords(x))
    ggplot(df, aes(x=sdimy, y=sdimx, col=clust)) +
        geom_point(size = 0.5) + 
        scale_color_manual(values = pals::kelly()[-1]) +
        theme_classic() + 
        theme(
            legend.position = "none",
            axis.text.x=element_blank(),
            axis.text.y=element_blank(),
            axis.ticks=element_blank(),
            axis.title.x=element_blank(),
            axis.title.y=element_blank()) +
        labs(title = sprintf("Sample %s - ARI: %s", snm, round(ari, 3))) +
        coord_equal()
})

plot_grid(plotlist = spatial_plots, ncol = 3, byrow = FALSE)

Session information

Vignette runtime:

#> Time difference of 1.182019 mins
options(width = 120)
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.5.1 (2025-06-13)
#>  os       Rocky Linux 9.8 (Blue Onyx)
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language en
#>  collate  C.UTF-8
#>  ctype    C.UTF-8
#>  tz       America/Los_Angeles
#>  date     2026-09-29
#>  pandoc   3.11 @ /gpfs/scrubbed/jxlee/conda/envs/banksy-bench-2/bin/ (via rmarkdown)
#>  quarto   NA
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  package              * version   date (UTC) lib source
#>  abind                  1.4-8     2024-09-12 [1] CRAN (R 4.5.1)
#>  AnnotationDbi          1.72.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  AnnotationHub        * 4.0.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  aricode                1.1.0     2026-05-13 [1] CRAN (R 4.5.3)
#>  attempt                0.3.1     2020-05-03 [1] CRAN (R 4.5.1)
#>  Banksy               * 1.9.4     2026-09-29 [1] local (/gpfs/projects/h2lab/jxlee/genome-institute/Banksy)
#>  beachmat               2.26.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  beeswarm               0.4.0     2021-06-01 [1] CRAN (R 4.5.1)
#>  benchmarkme            1.0.8     2022-06-12 [1] CRAN (R 4.5.1)
#>  benchmarkmeData        2.0.0     2026-01-19 [1] CRAN (R 4.5.2)
#>  Biobase              * 2.70.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocFileCache        * 3.0.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocGenerics         * 0.56.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocIO                 1.20.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocManager            1.30.27   2025-11-14 [1] CRAN (R 4.5.2)
#>  BiocNeighbors          2.4.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocParallel           1.44.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocSingular           1.26.1    2025-11-17 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocStyle            * 2.38.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  BiocVersion            3.22.0    2025-10-07 [1] Bioconductor 3.22 (R 4.5.2)
#>  Biostrings             2.78.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  bit                    4.6.0     2025-03-06 [1] CRAN (R 4.5.1)
#>  bit64                  4.8.6     2026-09-01 [1] CRAN (R 4.5.3)
#>  bitops                 1.1-0     2026-07-30 [1] CRAN (R 4.5.3)
#>  blob                   1.3.0     2026-01-14 [1] CRAN (R 4.5.2)
#>  bluster                1.20.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  bookdown               0.47      2026-06-16 [1] CRAN (R 4.5.3)
#>  bslib                  0.12.0    2026-08-04 [1] CRAN (R 4.5.3)
#>  cachem                 1.1.0     2024-05-16 [1] CRAN (R 4.5.1)
#>  cigarillo              1.0.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  circlize               0.4.18    2026-04-04 [1] CRAN (R 4.5.3)
#>  cli                    3.6.6     2026-04-09 [1] CRAN (R 4.5.3)
#>  clue                   0.3-68    2026-03-26 [1] CRAN (R 4.5.3)
#>  cluster                2.1.8.3   2026-07-30 [1] CRAN (R 4.5.3)
#>  codetools              0.2-20    2024-03-31 [1] CRAN (R 4.5.1)
#>  colorspace             2.1-3     2026-07-12 [1] CRAN (R 4.5.3)
#>  ComplexHeatmap         2.26.1    2026-02-03 [1] Bioconductor 3.22 (R 4.5.2)
#>  config                 0.3.2     2023-08-30 [1] CRAN (R 4.5.1)
#>  cowplot              * 1.2.0     2025-07-07 [1] CRAN (R 4.5.1)
#>  crayon                 1.5.3     2024-06-20 [1] CRAN (R 4.5.1)
#>  curl                   8.0.0     2026-08-25 [1] CRAN (R 4.5.3)
#>  data.table           * 1.18.6.1  2026-08-24 [1] CRAN (R 4.5.3)
#>  DBI                    1.3.0     2026-02-25 [1] CRAN (R 4.5.2)
#>  dbplyr               * 2.6.0     2026-06-17 [1] CRAN (R 4.5.3)
#>  dbscan                 1.2.6     2026-08-25 [1] CRAN (R 4.5.3)
#>  DelayedArray           0.36.1    2026-03-31 [1] Bioconductor 3.22 (R 4.5.3)
#>  deldir                 2.0-4     2024-02-28 [1] CRAN (R 4.5.1)
#>  desc                   1.4.3     2023-12-10 [1] CRAN (R 4.5.1)
#>  dichromat              2.0-1     2026-07-22 [1] CRAN (R 4.5.3)
#>  digest                 0.6.39    2025-11-19 [1] CRAN (R 4.5.2)
#>  doParallel             1.0.17    2022-02-07 [1] CRAN (R 4.5.1)
#>  dotCall64              1.2       2024-10-04 [1] CRAN (R 4.5.1)
#>  dplyr                  1.2.1     2026-04-03 [1] CRAN (R 4.5.3)
#>  dqrng                  0.3.2     2023-11-29 [1] CRAN (R 4.5.1)
#>  DT                     0.34.0    2025-09-02 [1] CRAN (R 4.5.1)
#>  edgeR                  4.8.2     2025-12-25 [1] Bioconductor 3.22 (R 4.5.3)
#>  evaluate               1.0.5     2025-08-27 [1] CRAN (R 4.5.1)
#>  ExperimentHub        * 3.0.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  farver                 2.1.2     2024-05-13 [1] CRAN (R 4.5.1)
#>  fastDummies            1.7.6     2026-04-22 [1] CRAN (R 4.5.3)
#>  fastmap                1.2.0     2024-05-15 [1] CRAN (R 4.5.1)
#>  filelock               1.0.3     2023-12-11 [1] CRAN (R 4.5.1)
#>  fitdistrplus           1.2-6     2026-01-24 [1] CRAN (R 4.5.2)
#>  foreach                1.5.2     2022-02-02 [1] CRAN (R 4.5.1)
#>  fs                     2.1.0     2026-04-18 [1] CRAN (R 4.5.3)
#>  future                 1.76.0    2026-09-24 [1] CRAN (R 4.5.3)
#>  future.apply           1.20.2    2026-02-20 [1] CRAN (R 4.5.2)
#>  generics             * 0.1.4     2025-05-09 [1] CRAN (R 4.5.1)
#>  GenomicAlignments      1.46.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  GenomicRanges        * 1.62.1    2025-12-08 [1] Bioconductor 3.22 (R 4.5.2)
#>  GetoptLong             1.1.1     2026-04-08 [1] CRAN (R 4.5.3)
#>  ggbeeswarm             0.7.3     2025-11-29 [1] CRAN (R 4.5.2)
#>  ggplot2              * 4.0.3     2026-04-22 [1] CRAN (R 4.5.3)
#>  ggrepel                0.9.8     2026-03-17 [1] CRAN (R 4.5.3)
#>  ggridges               0.5.7     2025-08-27 [1] CRAN (R 4.5.1)
#>  GlobalOptions          0.1.4     2026-04-08 [1] CRAN (R 4.5.3)
#>  globals                0.19.1    2026-03-13 [1] CRAN (R 4.5.3)
#>  glue                   1.8.1     2026-04-17 [1] CRAN (R 4.5.3)
#>  goftest                1.2-3     2021-10-07 [1] CRAN (R 4.5.1)
#>  golem                  1.0.1     2026-07-07 [1] CRAN (R 4.5.3)
#>  gridExtra              2.3.1     2026-06-25 [1] CRAN (R 4.5.3)
#>  gtable                 0.3.6     2024-10-25 [1] CRAN (R 4.5.1)
#>  harmony              * 2.0.5     2026-06-12 [1] CRAN (R 4.5.3)
#>  htmltools              0.5.9     2025-12-04 [1] CRAN (R 4.5.2)
#>  htmlwidgets            1.6.4     2023-12-06 [1] CRAN (R 4.5.1)
#>  httpuv                 1.6.17    2026-03-18 [1] CRAN (R 4.5.3)
#>  httr                   1.4.9     2026-09-01 [1] CRAN (R 4.5.3)
#>  httr2                  1.3.0     2026-07-13 [1] CRAN (R 4.5.3)
#>  ica                    1.0-3     2022-07-08 [1] CRAN (R 4.5.1)
#>  igraph                 2.3.3     2026-06-26 [1] CRAN (R 4.5.3)
#>  IRanges              * 2.44.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  irlba                  2.3.7     2026-01-30 [1] CRAN (R 4.5.2)
#>  iterators              1.0.14    2022-02-05 [1] CRAN (R 4.5.1)
#>  jquerylib              0.1.4     2021-04-26 [1] CRAN (R 4.5.1)
#>  jsonlite               2.0.0     2025-03-27 [1] CRAN (R 4.5.1)
#>  KEGGREST               1.50.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  KernSmooth             2.23-27   2026-08-12 [1] CRAN (R 4.5.3)
#>  knitr                  1.52      2026-09-06 [1] CRAN (R 4.5.3)
#>  labeling               0.4.3     2023-08-29 [1] CRAN (R 4.5.1)
#>  later                  1.4.8     2026-03-05 [1] CRAN (R 4.5.2)
#>  lattice                0.23-1    2026-08-12 [1] CRAN (R 4.5.3)
#>  leidenAlg              1.1.8     2026-05-31 [1] CRAN (R 4.5.3)
#>  lifecycle              1.0.5     2026-01-08 [1] CRAN (R 4.5.2)
#>  limma                  3.66.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  listenv                1.0.0     2026-06-22 [1] CRAN (R 4.5.3)
#>  lmtest                 0.9-40    2022-03-21 [1] CRAN (R 4.5.1)
#>  locfit                 1.5-9.12  2025-03-05 [1] CRAN (R 4.5.1)
#>  magick                 2.9.1     2026-02-28 [1] CRAN (R 4.5.2)
#>  magrittr               2.0.5     2026-04-04 [1] CRAN (R 4.5.3)
#>  mapproj                1.2.12    2025-05-19 [1] CRAN (R 4.5.1)
#>  maps                   3.4.3     2025-05-26 [1] CRAN (R 4.5.1)
#>  MASS                   7.3-66    2026-07-15 [1] CRAN (R 4.5.3)
#>  Matrix                 1.7-6     2026-07-25 [1] CRAN (R 4.5.3)
#>  MatrixGenerics       * 1.22.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  matrixStats          * 1.5.0     2025-01-07 [1] CRAN (R 4.5.1)
#>  mclust                 6.1.3     2026-07-05 [1] CRAN (R 4.5.3)
#>  memoise                2.0.1     2021-11-26 [1] CRAN (R 4.5.1)
#>  metapod                1.18.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  mime                   0.13      2025-03-17 [1] CRAN (R 4.5.1)
#>  miniUI                 0.1.2     2025-04-17 [1] CRAN (R 4.5.1)
#>  nlme                   3.1-170   2026-07-15 [1] CRAN (R 4.5.3)
#>  otel                   0.2.0     2025-08-29 [1] CRAN (R 4.5.1)
#>  paletteer              1.7.0     2026-01-08 [1] CRAN (R 4.5.2)
#>  pals                   1.10      2025-03-07 [1] CRAN (R 4.5.3)
#>  parallelly             1.48.0    2026-06-29 [1] CRAN (R 4.5.3)
#>  patchwork              1.3.2     2025-08-25 [1] CRAN (R 4.5.1)
#>  pbapply                1.7-4     2025-07-20 [1] CRAN (R 4.5.1)
#>  pillar                 1.11.1    2025-09-17 [1] CRAN (R 4.5.1)
#>  pkgconfig              2.0.3     2019-09-22 [1] CRAN (R 4.5.1)
#>  pkgdown                2.1.3     2025-05-25 [1] CRAN (R 4.5.1)
#>  plotly                 4.12.1    2026-07-22 [1] CRAN (R 4.5.3)
#>  plyr                   1.8.9     2023-10-02 [1] CRAN (R 4.5.1)
#>  png                    0.1-9     2026-03-15 [1] CRAN (R 4.5.3)
#>  polyclip               1.10-7    2024-07-23 [1] CRAN (R 4.5.1)
#>  progressr              1.0.0     2026-07-04 [1] CRAN (R 4.5.3)
#>  promises               1.5.0     2025-11-01 [1] CRAN (R 4.5.2)
#>  purrr                  1.2.2     2026-04-10 [1] CRAN (R 4.5.3)
#>  R6                     2.6.1     2025-02-15 [1] CRAN (R 4.5.1)
#>  ragg                   1.5.2     2026-03-23 [1] CRAN (R 4.5.3)
#>  RANN                   2.6.2     2024-08-25 [1] CRAN (R 4.5.1)
#>  rappdirs               0.3.4     2026-01-17 [1] CRAN (R 4.5.2)
#>  RColorBrewer           1.1-3     2022-04-03 [1] CRAN (R 4.5.1)
#>  Rcpp                 * 1.1.2     2026-07-05 [1] CRAN (R 4.5.3)
#>  RcppAnnoy              0.0.23    2026-01-12 [1] CRAN (R 4.5.2)
#>  RcppHNSW               0.7.0     2026-05-26 [1] CRAN (R 4.5.3)
#>  RcppHungarian          0.3       2023-09-05 [1] CRAN (R 4.5.3)
#>  RCurl                  1.98-1.19 2026-06-03 [1] CRAN (R 4.5.3)
#>  rematch2               2.1.2     2020-05-01 [1] CRAN (R 4.5.1)
#>  reshape2               1.4.5     2025-11-12 [1] CRAN (R 4.5.2)
#>  restfulr               0.0.17    2026-06-11 [1] CRAN (R 4.5.3)
#>  reticulate             1.47.0    2026-09-03 [1] CRAN (R 4.5.3)
#>  RhpcBLASctl            0.23-42   2023-02-11 [1] CRAN (R 4.5.1)
#>  rjson                  0.2.23    2024-09-16 [1] CRAN (R 4.5.1)
#>  rlang                  1.3.0     2026-07-05 [1] CRAN (R 4.5.3)
#>  rmarkdown              2.32      2026-09-01 [1] CRAN (R 4.5.3)
#>  ROCR                   1.0-12    2026-01-23 [1] CRAN (R 4.5.2)
#>  Rsamtools              2.26.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  RSpectra               0.16-2    2024-07-18 [1] CRAN (R 4.5.1)
#>  RSQLite                3.53.3    2026-06-30 [1] CRAN (R 4.5.3)
#>  rsvd                   1.0.5     2021-04-16 [1] CRAN (R 4.5.1)
#>  rtracklayer            1.70.1    2025-12-22 [1] Bioconductor 3.22 (R 4.5.2)
#>  Rtsne                  0.17      2023-12-07 [1] CRAN (R 4.5.1)
#>  S4Arrays               1.10.1    2025-12-01 [1] Bioconductor 3.22 (R 4.5.2)
#>  S4Vectors            * 0.48.1    2026-04-05 [1] Bioconductor 3.22 (R 4.5.3)
#>  S7                     0.2.2     2026-04-22 [1] CRAN (R 4.5.3)
#>  sass                   0.4.10    2025-04-11 [1] CRAN (R 4.5.1)
#>  ScaledMatrix           1.18.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  scales                 1.4.0     2025-04-24 [1] CRAN (R 4.5.1)
#>  scater               * 1.38.1    2026-03-20 [1] Bioconductor 3.22 (R 4.5.3)
#>  scattermore            1.2       2023-06-12 [1] CRAN (R 4.5.1)
#>  sccore                 1.0.7     2026-04-06 [1] CRAN (R 4.5.3)
#>  scran                * 1.38.1    2026-02-25 [1] Bioconductor 3.22 (R 4.5.3)
#>  sctransform            0.4.3     2026-01-10 [1] CRAN (R 4.5.2)
#>  scuttle              * 1.20.0    2025-10-30 [1] Bioconductor 3.22 (R 4.5.2)
#>  Seqinfo              * 1.0.0     2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  sessioninfo            1.2.4     2026-06-04 [1] CRAN (R 4.5.3)
#>  Seurat               * 5.4.0     2025-12-14 [1] CRAN (R 4.5.2)
#>  SeuratObject         * 5.4.0     2026-04-11 [1] CRAN (R 4.5.3)
#>  shape                  1.4.6.1   2024-02-23 [1] CRAN (R 4.5.1)
#>  shiny                  1.14.0    2026-06-21 [1] CRAN (R 4.5.3)
#>  shinyWidgets           0.9.1     2026-03-09 [1] CRAN (R 4.5.2)
#>  SingleCellExperiment * 1.32.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  sp                   * 2.2-3     2026-07-19 [1] CRAN (R 4.5.3)
#>  spam                   2.11-4    2026-05-29 [1] CRAN (R 4.5.3)
#>  SparseArray            1.10.10   2026-03-30 [1] Bioconductor 3.22 (R 4.5.3)
#>  SpatialExperiment    * 1.20.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  spatialLIBD          * 1.22.0    2025-11-04 [1] Bioconductor 3.22 (R 4.5.1)
#>  spatstat.data          3.1-9     2025-10-18 [1] CRAN (R 4.5.1)
#>  spatstat.explore       3.8-2     2026-07-27 [1] CRAN (R 4.5.3)
#>  spatstat.geom          3.8-2     2026-07-24 [1] CRAN (R 4.5.3)
#>  spatstat.random        3.5-1     2026-07-27 [1] CRAN (R 4.5.3)
#>  spatstat.sparse        3.2-0     2026-05-21 [1] CRAN (R 4.5.3)
#>  spatstat.univar        3.2-0     2026-05-18 [1] CRAN (R 4.5.3)
#>  spatstat.utils         3.2-5     2026-09-11 [1] CRAN (R 4.5.3)
#>  statmod                1.5.2     2026-05-17 [1] CRAN (R 4.5.3)
#>  stringi                1.8.7     2025-03-27 [1] CRAN (R 4.5.1)
#>  stringr                1.6.0     2025-11-04 [1] CRAN (R 4.5.2)
#>  SummarizedExperiment * 1.40.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  survival               3.8-12    2026-09-09 [1] CRAN (R 4.5.3)
#>  systemfonts            1.3.2     2026-03-05 [1] CRAN (R 4.5.2)
#>  tensor                 1.5.1     2025-06-17 [1] CRAN (R 4.5.1)
#>  textshaping            1.0.4     2025-10-10 [1] CRAN (R 4.5.1)
#>  tibble                 3.3.1     2026-01-11 [1] CRAN (R 4.5.2)
#>  tidyr                  1.3.2     2025-12-19 [1] CRAN (R 4.5.2)
#>  tidyselect             1.2.1     2024-03-11 [1] CRAN (R 4.5.1)
#>  uwot                   0.2.5     2026-08-29 [1] CRAN (R 4.5.3)
#>  vctrs                  0.7.3     2026-04-11 [1] CRAN (R 4.5.3)
#>  vipor                  0.4.7     2023-12-18 [1] CRAN (R 4.5.1)
#>  viridis                0.6.5     2024-01-29 [1] CRAN (R 4.5.1)
#>  viridisLite            0.4.3     2026-02-04 [1] CRAN (R 4.5.2)
#>  withr                  3.0.3     2026-06-19 [1] CRAN (R 4.5.3)
#>  xfun                   0.60      2026-07-09 [1] CRAN (R 4.5.3)
#>  XML                    3.99-0.22 2026-02-10 [1] CRAN (R 4.5.2)
#>  xtable                 1.8-8     2026-02-22 [1] CRAN (R 4.5.2)
#>  XVector                0.50.0    2025-10-29 [1] Bioconductor 3.22 (R 4.5.2)
#>  yaml                   2.3.12    2025-12-10 [1] CRAN (R 4.5.2)
#>  zoo                    1.9-0     2026-07-31 [1] CRAN (R 4.5.3)
#> 
#>  [1] /gpfs/scrubbed/jxlee/conda/envs/banksy-bench-2/lib/R/library
#>  * ── Packages attached to the search path.
#> 
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────