Gene Correlation Analysis for Mouse Cortex Open Problem

Prologue

library(COTAN)
library(ComplexHeatmap)
library(circlize)
library(dplyr)
library(Hmisc)
library(Seurat)
library(patchwork)
library(Rfast)
library(parallel)
library(doParallel)
library(HiClimR)
library(stringr)
library(fst)

options(parallelly.fork.enable = TRUE)
dataFile <- "Data/NewDataRevision/Ding_GSE132044_H_PBMC_M_Brain_CleanedDatasets/SplitLoomsAsCOTANObjects/mouse-brain-SS2_Cortex2_specimen1_cell1-Cleaned.RDS"

name <- str_split(dataFile,pattern = "/",simplify = T)[5]
name <- str_remove(name,pattern = "-Cleaned.RDS")

project = name

setLoggingLevel(1)
outDir <- "CoexData/"
setLoggingFile(paste0(outDir, "Logs/",name,".log"))

obj <- readRDS(dataFile)
file_code = name
source("src/Functions.R")

To compare the ability of COTAN to asses the real correlation between genes we define some pools of genes:

  1. Constitutive genes
  2. Neural progenitor genes
  3. Pan neuronal genes
  4. Some layer marker genes
genesList <- list(
  "NPGs"= 
    c("Nes", "Vim", "Sox2", "Sox1", "Notch1", "Hes1", "Hes5", "Pax6"),
  "PNGs"= 
    c("Map2", "Tubb3", "Neurod1", "Nefm", "Nefl", "Dcx", "Tbr1"),
  "hk"= 
    c("Calm1", "Cox6b1", "Ppia", "Rpl18", "Cox7c", "Erh", "H3f3a",
      "Taf1", "Taf2", "Gapdh", "Actb", "Golph3", "Zfr", "Sub1",
      "Tars", "Amacr"),
  "layers" = 
    c("Reln","Lhx5","Cux1","Satb2","Tle1","Mef2c","Rorb","Sox5","Bcl11b","Fezf2","Foxp2","Ntf3","Rasgrf2","Pvrl3", "Cux2","Slc17a6", "Sema3c","Thsd7a", "Sulf2", "Kcnk2","Grik3", "Etv1", "Tle4", "Tmem200a", "Glra2", "Etv1","Htr1f", "Sulf1","Rxfp1", "Syt6") 
  # From https://www.science.org/doi/10.1126/science.aam8999
)

COTAN

genesFromListExpressed <- unlist(genesList)[unlist(genesList) %in% getGenes(obj)]
int.genes <-getGenes(obj)
coexMat.big <- getGenesCoex(obj)[genesFromListExpressed,genesFromListExpressed]

coexMat <- coexMat.big[rownames(coexMat.big) %in% c(genesList$NPGs,genesList$hk,genesList$PNGs),
                       colnames(coexMat.big) %in% c(genesList$NPGs,genesList$hk,genesList$PNGs)]

f1 = colorRamp2(seq(-0.5,0.5, length = 3), c("#DC0000B2", "white","#3C5488B2" ))

split.genes <- base::factor(c(rep("NPGs",sum(genesList[["NPGs"]] %in% getGenes(obj))),
                         rep("HK",sum(genesList[["hk"]] %in% getGenes(obj))),
                         rep("PNGs",sum(genesList[["PNGs"]] %in% getGenes(obj)))
                        ),
                         levels = c("NPGs","HK","PNGs"))

lgd = Legend(col_fun = f1, title = "COTAN coex")

htmp <- Heatmap(as.matrix(coexMat),
        #width = ncol(coexMat)*unit(2.5, "mm"), 
        height = nrow(coexMat)*unit(3, "mm"),
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        col = f1,
        row_names_side = "left",
        row_names_gp = gpar(fontsize = 11),
        column_names_gp  = gpar(fontsize = 11),
        column_split = split.genes,
        row_split = split.genes,
        cluster_row_slices = FALSE, 
    cluster_column_slices = FALSE,
    heatmap_legend_param = list(
        title = "COTAN coex", at = c(-0.5, 0, 0.5),
        direction = "horizontal",
        labels = c("-0.5", "0", "0.5")
    )
   )
draw(htmp, heatmap_legend_side="right")

GDI_DF <- calculateGDI(obj)
GDI_DF$geneType <- NA
for (cat in names(genesList)) {
  GDI_DF[rownames(GDI_DF) %in% genesList[[cat]],]$geneType <- cat
}

GDI_DF$GDI_centered <- scale(GDI_DF$GDI,center = T,scale = T)

GDI_DF[genesFromListExpressed,]
         sum.raw.norm      GDI  exp.cells geneType GDI_centered
Nes          5.803825 1.316536  0.8823529     NPGs  -0.90121691
Vim          7.611451 1.522843  1.7647059     NPGs  -0.49158103
Sox2         7.637211 1.798383  5.7352941     NPGs   0.05552256
Sox1         3.400883 1.171177  0.5882353     NPGs  -1.18983603
Notch1       9.699372 2.097589 21.0294118     NPGs   0.64961482
Hes1         3.300551 1.251126  1.0294118     NPGs  -1.03109205
Hes5         8.371051 2.142109  9.1176471     NPGs   0.73801217
Pax6         7.679793 1.977058 11.7647059     NPGs   0.41029262
Map2        10.817739 2.971057 77.2058824     PNGs   2.38394001
Tubb3        9.458506 2.145226 23.8235294     PNGs   0.74420015
Neurod1      7.152190 2.386407  8.9705882     PNGs   1.22308070
Nefm         9.078370 2.093575 13.6764706     PNGs   0.64164342
Nefl        10.015920 1.905688 21.7647059     PNGs   0.26858178
Dcx          9.719396 2.852352 32.5000000     PNGs   2.14824428
Tbr1         7.890403 2.387530 11.9117647     PNGs   1.22531055
Calm1       11.467388 2.649605 84.1176471       hk   1.74567654
Cox6b1       8.542026 2.331921 29.4117647       hk   1.11489629
Ppia        10.443822 1.930293 68.9705882       hk   0.31743790
Rpl18        8.518629 1.740225 21.0294118       hk  -0.05995394
Cox7c        8.177110 2.254929 38.8235294       hk   0.96202379
Erh          7.127341 2.002801 15.1470588       hk   0.46140761
H3f3a        9.618723 1.713127 40.2941176       hk  -0.11376022
Taf1         8.338708 1.893017 18.5294118       hk   0.24342312
Taf2         8.701699 2.384490 24.2647059       hk   1.21927452
Gapdh       10.343131 2.015174 82.9411765       hk   0.48597458
Actb         9.894812 1.592025 75.0000000       hk  -0.35421420
Golph3       7.564967 1.828102  5.1470588       hk   0.11453009
Zfr          9.399088 2.546172 48.2352941       hk   1.54030422
Sub1         9.109399 2.198710 26.1764706       hk   0.85039642
Amacr        5.816401 1.861000  4.1176471       hk   0.17985254
Reln         8.232227 2.266711 12.0588235   layers   0.98541636
Lhx5         2.970843 1.141682  0.4411765   layers  -1.24840058
Cux1        10.105905 2.266684 46.3235294   layers   0.98536391
Satb2        8.163813 2.478747 15.1470588   layers   1.40642743
Tle1         8.594410 1.881315 12.7941176   layers   0.22018844
Mef2c       10.235376 2.835495 48.3823529   layers   2.11477299
Rorb         9.532816 1.932589 25.5882353   layers   0.32199666
Sox5         8.798329 2.145619 21.7647059   layers   0.74498191
Bcl11b       7.917100 2.030273 10.7352941   layers   0.51595426
Fezf2        6.034144 2.109962  3.9705882   layers   0.67418177
Foxp2        9.584423 1.832945 50.7352941   layers   0.12414747
Rasgrf2      9.491568 2.531744 25.7352941   layers   1.51165701
Cux2         9.054088 2.332208 35.4411765   layers   1.11546635
Slc17a6      7.351583 1.813621  3.0882353   layers   0.08577721
Sema3c       7.345244 1.644451  3.8235294   layers  -0.25012004
Thsd7a       8.705885 1.877323 11.1764706   layers   0.21226282
Sulf2        8.885156 2.323742 20.1470588   layers   1.09865547
Kcnk2        7.611828 1.650671  7.3529412   layers  -0.23777074
Grik3        9.381553 2.400204 21.9117647   layers   1.25047665
Etv1         8.884707 1.746162 16.6176471   layers  -0.04816653
Tle4         8.439249 1.987824 15.5882353   layers   0.43166902
Tmem200a     7.522124 1.844785 52.7941176   layers   0.14765649
Glra2        6.894834 1.732694  2.9411765   layers  -0.07490858
Etv1.1       8.884707 1.746162 16.6176471   layers  -0.04816653
Htr1f        6.746563 2.329512  9.2647059   layers   1.11011150
Sulf1        7.915943 2.028545  9.2647059   layers   0.51252290
Rxfp1        7.926563 2.126356  7.2058824   layers   0.70673330
Syt6         8.341163 1.821396  7.3529412   layers   0.10121650
GDIPlot(obj,GDIIn = GDI_DF, genes = genesList,GDIThreshold = 1.4)

Seurat correlation

srat<- CreateSeuratObject(counts = getRawData(obj), 
                          project = project, 
                          min.cells = 3, 
                          min.features = 200)
srat[["percent.mt"]] <- PercentageFeatureSet(srat, pattern = "^mt-")
srat <- NormalizeData(srat)
srat <- FindVariableFeatures(srat, selection.method = "vst", nfeatures = 2000)

# plot variable features with and without labels
plot1 <- VariableFeaturePlot(srat)

plot1$data$centered_variance <- scale(plot1$data$variance.standardized,
                                      center = T,scale = F)

write.csv(plot1$data,paste0("CoexData/",
                            "Variance_Seurat_genes",
                            getMetadataElement(obj, 
                                               datasetTags()[["cond"]]),".csv"))

LabelPoints(plot = plot1, points = c(genesList$NPGs,genesList$PNGs,genesList$layers), repel = TRUE)

LabelPoints(plot = plot1, points = c(genesList$hk), repel = TRUE)

all.genes <- rownames(srat)
srat <- ScaleData(srat, features = all.genes)
seurat.data = GetAssayData(srat[["RNA"]],layer = "data")
corr.pval.list <- correlation_pvalues(data = seurat.data,
                                      genesFromListExpressed,
                                      n.cells = getNumCells(obj))

seurat.data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))

htmp <- correlation_plot(seurat.data.cor.big, 
                         genesList, title="Seurat corr")


p_values.fromSeurat <- corr.pval.list$p_values
seurat.data.cor.big <- corr.pval.list$data.cor

rm(corr.pval.list)
gc()
            used   (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells  10213430  545.5   18206440   972.4   18206440   972.4
Vcells 420360576 3207.1 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")

rm(seurat.data.cor.big)
rm(p_values.fromSeurat)

Seurat SC Transform

srat <-  SCTransform(srat, 
                     method = "glmGamPoi", 
                     vars.to.regress = "percent.mt", 
                     verbose = FALSE)

seurat.data <- GetAssayData(srat[["SCT"]],layer = "data")

#Remove genes with all zeros
seurat.data <-seurat.data[rowSums(seurat.data) > 0,]


corr.pval.list <- correlation_pvalues(seurat.data,
                                      genesFromListExpressed,
                                      n.cells = getNumCells(obj))



seurat.data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))

htmp <- correlation_plot(seurat.data.cor.big, 
                         genesList, title="Seurat corr SCT")



p_values.fromSeurat <- corr.pval.list$p_values
seurat.data.cor.big <- corr.pval.list$data.cor

rm(corr.pval.list)
gc()
            used   (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells  10541910  563.0   18206440   972.4   18206440   972.4
Vcells 430760994 3286.5 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")

plot1 <- VariableFeaturePlot(srat)

plot1$data$centered_variance <- scale(plot1$data$residual_variance,
                                      center = T,scale = F)
write.csv(plot1$data,paste0("CoexData/",
                            "Variance_SeuratSCT_genes",
                            getMetadataElement(obj, 
                                               datasetTags()[["cond"]]),".csv"))

write_fst(as.data.frame(seurat.data.cor.big),path = paste0("CoexData/SeuratCorrSCT_",file_code,".fst"), compress = 100)

write_fst(as.data.frame(p_values.fromSeurat),path =  paste0("CoexData/SeuratPValuesSCT_", file_code,".fst"))
write.csv(as.data.frame(p_values.fromSeurat),paste0("CoexData/SeuratPValuesSCT_", file_code,".csv"))
rm(seurat.data.cor.big)
rm(p_values.fromSeurat)

Monocle

library(monocle3)
cds <- new_cell_data_set(getRawData(obj),
                         cell_metadata = getMetadataCells(obj),
                         gene_metadata = getMetadataGenes(obj)
                         )
cds <- preprocess_cds(cds, num_dim = 100)

normalized_counts <- normalized_counts(cds)
#Remove genes with all zeros
normalized_counts <- normalized_counts[rowSums(normalized_counts) > 0,]


corr.pval.list <- correlation_pvalues(normalized_counts,
                                      genesFromListExpressed,
                                      n.cells = getNumCells(obj))

rm(normalized_counts)

monocle.data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))

htmp <- correlation_plot(data.cor.big = monocle.data.cor.big,
                         genesList,
                         title = "Monocle corr")


p_values.from.monocle <- corr.pval.list$p_values
monocle.data.cor.big <- corr.pval.list$data.cor

rm(corr.pval.list)
gc()
            used   (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells  10728162  573.0   18206440   972.4   18206440   972.4
Vcells 433922589 3310.6 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")

Cs-Core

library(CSCORE)

Convert to Seurat obj

sceObj <- convertToSingleCellExperiment(obj)

# Correct: assay=NULL (or omit), data=NULL (since no logcounts)
seuratObj <- as.Seurat(
  x       = sceObj,
  counts  = "counts",
  data    = NULL,
  assay   = NULL,      # IMPORTANT: do NOT set to "RNA" here
  project = "COTAN"
)

# as.Seurat(SCE) creates assay "originalexp" by default; rename it to RNA
seuratObj <- RenameAssays(seuratObj, originalexp = "RNA", verbose = FALSE)
DefaultAssay(seuratObj) <- "RNA"

# Optional: keep COTAN payload
seuratObj@misc$COTAN <- S4Vectors::metadata(sceObj)

Extract CS_CORE corr matrix

seuratObj@assays$RNA@counts <- ceiling(seuratObj@assays$RNA@counts)
csCoreRes <- CSCORE(seuratObj, genes = genesFromListExpressed)
[INFO] IRLS converged after 3 iterations.
[INFO] Starting WLS for covariance at Wed Jan 21 11:51:23 2026
[INFO] 0.0605% co-expression estimates were greater than 1 and were set to 1.
[INFO] 0.0000% co-expression estimates were smaller than -1 and were set to -1.
[INFO] Finished WLS. Elapsed time: 0.0234 seconds.
mat <- as.matrix(csCoreRes$est)
diag(mat) <- 0

split.genes <- base::factor(c(rep("NPGs",sum(genesList[["NPGs"]] %in% genesFromListExpressed)),
                         rep("HK",sum(genesList[["hk"]] %in% genesFromListExpressed)),
                         rep("PNGs",sum(genesList[["PNGs"]] %in% genesFromListExpressed))
                        ),
                         levels = c("NPGs","HK","PNGs"))

f1 = colorRamp2(seq(-0.5,0.5, length = 3), c("#DC0000B2", "white","#3C5488B2" ))

htmp <- Heatmap(mat[c(genesList$NPGs[genesList$NPGs %in% genesFromListExpressed],genesList$hk[genesList$hk %in% genesFromListExpressed],genesList$PNGs[genesList$PNGs %in% genesFromListExpressed]),
c(genesList$NPGs[genesList$NPGs %in% genesFromListExpressed],genesList$hk[genesList$hk %in% genesFromListExpressed],genesList$PNGs[genesList$PNGs %in% genesFromListExpressed])],
        #width = ncol(coexMat)*unit(2.5, "mm"), 
        height = nrow(mat)*unit(3, "mm"),
        cluster_rows = FALSE,
        cluster_columns = FALSE,
        col = f1,
        row_names_side = "left",
        row_names_gp = gpar(fontsize = 11),
        column_names_gp  = gpar(fontsize = 11),
        column_split = split.genes,
        row_split = split.genes,
        cluster_row_slices = FALSE, 
    cluster_column_slices = FALSE,
    heatmap_legend_param = list(
         title = "CS-CORE", at = c(-0.5, 0, 0.5),
         direction = "horizontal",
         labels = c("-0.5", "0", "0.5")
     )
   )

draw(htmp, heatmap_legend_side="right")

Save CS_CORE matrix

write_fst(as.data.frame(csCoreRes$est), path = paste0("CoexData/CS_CORECorr_", file_code,".fst"),compress = 100)
write_fst(as.data.frame(csCoreRes$p_value), path = paste0("CoexData/CS_COREPValues_", file_code,".fst"),compress = 100)
write.csv(as.data.frame(csCoreRes$p_value), paste0("CoexData/CS_COREPValues_", file_code,".csv"))

Baseline: Spearman on UMI counts

corr.pval.list <- correlation_pvaluesSpearman(data = getRawData(obj),
                                      genesFromListExpressed,
                                      n.cells = getNumCells(obj))

data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))

htmp <- correlation_plot(data.cor.big, 
                         genesList, title="UMI baseline S. corr")


p_values.fromSp.C <- corr.pval.list$p_values
data.cor.bigSp.C <- corr.pval.list$data.cor

rm(corr.pval.list)
gc()
            used   (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells  10737510  573.5   18206440   972.4   18206440   972.4
Vcells 436750720 3332.2 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")

write.csv(as.data.frame(p_values.fromSp.C), paste0("CoexData/BaselineUMISpCorrPValues_", file_code,".csv"))

Baseline: Pearson on binarized counts

corr.pval.list <- correlation_pvalues(data = getZeroOneProj(obj),
                                      genesFromListExpressed,
                                      n.cells = getNumCells(obj))

data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))

htmp <- correlation_plot(data.cor.big, 
                         genesList, title="Zero-one P. corr")


p_values.fromSp.C <- corr.pval.list$p_values
data.cor.bigSp.C <- corr.pval.list$data.cor

rm(corr.pval.list)
gc()
            used   (Mb) gc trigger    (Mb)   max used    (Mb)
Ncells  10737637  573.5   18206440   972.4   18206440   972.4
Vcells 436750979 3332.2 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")

write.csv(as.data.frame(p_values.fromSp.C), paste0("CoexData/ZeroOnePCorrPValues_", file_code,".csv"))

Sys.time()
[1] "2026-01-21 11:51:27 CET"
sessionInfo()
R version 4.5.2 (2025-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 22.04.5 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0 
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0  LAPACK version 3.10.0

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
 [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
[10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

time zone: Europe/Rome
tzcode source: system (glibc)

attached base packages:
 [1] stats4    parallel  grid      stats     graphics  grDevices utils    
 [8] datasets  methods   base     

other attached packages:
 [1] CSCORE_1.0.2                monocle3_1.3.7             
 [3] SingleCellExperiment_1.32.0 SummarizedExperiment_1.38.1
 [5] GenomicRanges_1.62.1        Seqinfo_1.0.0              
 [7] IRanges_2.44.0              S4Vectors_0.48.0           
 [9] MatrixGenerics_1.22.0       matrixStats_1.5.0          
[11] Biobase_2.70.0              BiocGenerics_0.56.0        
[13] generics_0.1.3              fstcore_0.10.0             
[15] fst_0.9.8                   stringr_1.6.0              
[17] HiClimR_2.2.1               doParallel_1.0.17          
[19] iterators_1.0.14            foreach_1.5.2              
[21] Rfast_2.1.5.1               RcppParallel_5.1.10        
[23] zigg_0.0.2                  Rcpp_1.1.0                 
[25] patchwork_1.3.2             Seurat_5.4.0               
[27] SeuratObject_5.3.0          sp_2.2-0                   
[29] Hmisc_5.2-3                 dplyr_1.1.4                
[31] circlize_0.4.16             ComplexHeatmap_2.26.0      
[33] COTAN_2.11.1               

loaded via a namespace (and not attached):
  [1] RcppAnnoy_0.0.22          splines_4.5.2            
  [3] later_1.4.2               tibble_3.3.0             
  [5] polyclip_1.10-7           rpart_4.1.24             
  [7] fastDummies_1.7.5         lifecycle_1.0.4          
  [9] Rdpack_2.6.4              globals_0.18.0           
 [11] lattice_0.22-7            MASS_7.3-65              
 [13] backports_1.5.0           ggdist_3.3.3             
 [15] dendextend_1.19.0         magrittr_2.0.4           
 [17] plotly_4.11.0             rmarkdown_2.29           
 [19] yaml_2.3.10               httpuv_1.6.16            
 [21] otel_0.2.0                glmGamPoi_1.20.0         
 [23] sctransform_0.4.2         spam_2.11-1              
 [25] spatstat.sparse_3.1-0     reticulate_1.44.1        
 [27] minqa_1.2.8               cowplot_1.2.0            
 [29] pbapply_1.7-2             RColorBrewer_1.1-3       
 [31] abind_1.4-8               Rtsne_0.17               
 [33] purrr_1.2.0               nnet_7.3-20              
 [35] GenomeInfoDbData_1.2.14   ggrepel_0.9.6            
 [37] irlba_2.3.5.1             listenv_0.10.0           
 [39] spatstat.utils_3.2-1      goftest_1.2-3            
 [41] RSpectra_0.16-2           spatstat.random_3.4-3    
 [43] fitdistrplus_1.2-2        parallelly_1.46.0        
 [45] DelayedMatrixStats_1.30.0 ncdf4_1.24               
 [47] codetools_0.2-20          DelayedArray_0.36.0      
 [49] tidyselect_1.2.1          shape_1.4.6.1            
 [51] UCSC.utils_1.4.0          farver_2.1.2             
 [53] lme4_1.1-37               ScaledMatrix_1.16.0      
 [55] viridis_0.6.5             base64enc_0.1-3          
 [57] spatstat.explore_3.6-0    jsonlite_2.0.0           
 [59] GetoptLong_1.1.0          Formula_1.2-5            
 [61] progressr_0.18.0          ggridges_0.5.6           
 [63] survival_3.8-3            tools_4.5.2              
 [65] ica_1.0-3                 glue_1.8.0               
 [67] gridExtra_2.3             SparseArray_1.10.8       
 [69] xfun_0.52                 distributional_0.6.0     
 [71] ggthemes_5.2.0            GenomeInfoDb_1.44.0      
 [73] withr_3.0.2               fastmap_1.2.0            
 [75] boot_1.3-32               digest_0.6.37            
 [77] rsvd_1.0.5                parallelDist_0.2.6       
 [79] R6_2.6.1                  mime_0.13                
 [81] colorspace_2.1-1          Cairo_1.7-0              
 [83] scattermore_1.2           tensor_1.5               
 [85] spatstat.data_3.1-9       tidyr_1.3.1              
 [87] data.table_1.18.0         httr_1.4.7               
 [89] htmlwidgets_1.6.4         S4Arrays_1.10.1          
 [91] uwot_0.2.3                pkgconfig_2.0.3          
 [93] gtable_0.3.6              lmtest_0.9-40            
 [95] S7_0.2.1                  XVector_0.50.0           
 [97] htmltools_0.5.8.1         dotCall64_1.2            
 [99] clue_0.3-66               scales_1.4.0             
[101] png_0.1-8                 reformulas_0.4.1         
[103] spatstat.univar_3.1-6     rstudioapi_0.18.0        
[105] knitr_1.50                reshape2_1.4.4           
[107] rjson_0.2.23              nloptr_2.2.1             
[109] checkmate_2.3.2           nlme_3.1-168             
[111] proxy_0.4-29              zoo_1.8-14               
[113] GlobalOptions_0.1.2       KernSmooth_2.23-26       
[115] miniUI_0.1.2              foreign_0.8-90           
[117] pillar_1.11.1             vctrs_0.7.0              
[119] RANN_2.6.2                promises_1.5.0           
[121] BiocSingular_1.26.1       beachmat_2.26.0          
[123] xtable_1.8-4              cluster_2.1.8.1          
[125] htmlTable_2.4.3           evaluate_1.0.5           
[127] magick_2.9.0              zeallot_0.2.0            
[129] cli_3.6.5                 compiler_4.5.2           
[131] rlang_1.1.7               crayon_1.5.3             
[133] future.apply_1.20.0       labeling_0.4.3           
[135] plyr_1.8.9                stringi_1.8.7            
[137] viridisLite_0.4.2         deldir_2.0-4             
[139] BiocParallel_1.44.0       assertthat_0.2.1         
[141] lazyeval_0.2.2            spatstat.geom_3.6-1      
[143] Matrix_1.7-4              RcppHNSW_0.6.0           
[145] sparseMatrixStats_1.20.0  future_1.69.0            
[147] ggplot2_4.0.1             shiny_1.12.1             
[149] rbibutils_2.3             ROCR_1.0-11              
[151] igraph_2.2.1