vignettes/batch-correction.Rmd
batch-correction.RmdHere, 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.
library(Banksy)
library(SummarizedExperiment)
library(SpatialExperiment)
library(Seurat)
library(scran)
library(data.table)
library(harmony)
library(scater)
library(cowplot)
library(ggplot2)
SEED <- 1000We 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) <- locsFind 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),]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)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_embeddingNext, 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)
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.
#>
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────