Gene Correlation Analysis for Mouse Brain Morabito GSE189033

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/MouseBrainMorabito/MouseBrain_Morabito_GSE189033_CotanCleaned.RDS"
name <- str_split(dataFile,pattern = "/",simplify = T)[4]
name <- str_remove(name,pattern = "CotanCleaned.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 <- getGenesCoex(obj)[c(genesList$NPGs,genesList$hk,genesList$PNGs),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",length(genesList[["NPGs"]])),
                         rep("HK",length(genesList[["hk"]])),
                         rep("PNGs",length(genesList[["PNGs"]]))
                        ),
                         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          7.806169 5.478041  2.2424845     NPGs          NaN
Vim          8.137923 5.560237  3.4367877     NPGs          NaN
Sox2         8.527893 5.163632  6.2423286     NPGs          NaN
Sox1         7.325566 3.532271  2.3652269     NPGs          NaN
Notch1       9.434706 6.540009 10.2636040     NPGs          NaN
Hes1         6.979030 3.227879  1.8762055     NPGs          NaN
Hes5         6.901275 4.208646  1.3813393     NPGs          NaN
Pax6         8.250718 5.069675  4.3933992     NPGs          NaN
Map2        12.443839 5.373626 88.1914002     PNGs          NaN
Tubb3        9.053336 3.898603 14.3024139     PNGs          NaN
Neurod1      7.397088 3.603543  3.1581819     PNGs          NaN
Nefm        10.218169 4.235200 26.2551873     PNGs          NaN
Nefl         9.889988 4.541443 22.4638105     PNGs          NaN
Dcx         10.221746 5.465343 30.0251330     PNGs          NaN
Tbr1         8.651506 4.573905  9.4336314     PNGs          NaN
Calm1       11.662131 4.692619 64.6462875       hk          NaN
Cox6b1       8.252913 2.354772  6.8462992       hk          NaN
Ppia         8.532714 2.743132  8.5510550       hk          NaN
Rpl18        7.668579 3.193186  3.5887545       hk          NaN
Cox7c        8.090773 2.196201  5.6870653       hk          NaN
Erh          7.732014 2.527985  4.3524850       hk          NaN
H3f3a        8.881898 2.372332 11.3897169       hk          NaN
Taf1        10.056592 2.958205 32.0123911       hk          NaN
Taf2         9.611177 3.691041 22.6820192       hk          NaN
Gapdh        9.833392 4.286121 24.2406531       hk          NaN
Actb        10.799727 4.439722 44.4015820       hk          NaN
Golph3       9.004261 2.088114 13.1431800       hk          NaN
Zfr         11.121145 4.085471 61.2172930       hk          NaN
Sub1         9.093222 3.327946 14.4056734       hk          NaN
Tars         7.979124 1.857273  5.1785610       hk          NaN
Amacr        6.595524 1.518655  1.2644417       hk          NaN
Reln        10.724511 4.376288 21.5344750   layers          NaN
Lhx5         5.811603 3.020672  0.6059189   layers          NaN
Cux1        11.414186 4.066436 61.3536735   layers          NaN
Satb2       10.508814 5.821415 28.5405342   layers          NaN
Tle1        10.237579 3.257836 31.9851150   layers          NaN
Mef2c       11.846416 5.568291 64.3832681   layers          NaN
Rorb        11.163294 5.293155 29.0626766   layers          NaN
Sox5        11.790543 4.802783 53.0091375   layers          NaN
Bcl11b      10.893682 5.432291 37.5591794   layers          NaN
Fezf2        7.435736 3.143919  2.8639897   layers          NaN
Foxp2       10.863263 4.528695 25.1037466   layers          NaN
Ntf3         7.697780 3.793891  2.9282834   layers          NaN
Rasgrf2     10.881787 5.452757 38.4924114   layers          NaN
Cux2        11.248246 4.700379 42.3363922   layers          NaN
Slc17a6      8.613709 4.209432  7.2281645   layers          NaN
Sema3c       9.481742 4.596898  7.8905839   layers          NaN
Thsd7a      11.309785 4.092990 42.5507043   layers          NaN
Sulf2       10.354962 4.312943 25.2732480   layers          NaN
Kcnk2       10.058750 4.278195 23.5412161   layers          NaN
Grik3       11.400137 5.291972 40.4387554   layers          NaN
Etv1         9.681396 3.251721 16.9248154   layers          NaN
Tle4        10.643795 3.982461 37.5007306   layers          NaN
Tmem200a     9.685830 4.953884 17.9652035   layers          NaN
Glra2        8.655348 4.228060  7.3703899   layers          NaN
Etv1.1       9.681396 3.251721 16.9248154   layers          NaN
Htr1f       10.547660 5.297501 27.5975607   layers          NaN
Sulf1        9.912606 3.649390 16.4202077   layers          NaN
Rxfp1        8.633149 4.018018  5.3636488   layers          NaN
Syt6        10.441294 5.207473 20.6421571   layers          NaN
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   10200161   544.8   17751490   948.1   17751490   948.1
Vcells 1781216174 13589.7 3422348843 26110.5 3361031749 25642.7
draw(htmp, heatmap_legend_side="right")

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

Seurat SC Transform

srat<- CreateSeuratObject(counts = getRawData(obj), 
                          project = project, 
                          min.cells = 3, 
                          min.features = 200)
srat[["percent.mt"]] <- PercentageFeatureSet(srat, pattern = "^mt-")

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

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   10529306  562.4   17751490   948.1   17751490   948.1
Vcells 1154714819 8809.8 3942686667 30080.4 4928310325 37600.1
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   10715504  572.3   17751490   948.1   17751490   948.1
Vcells 1161953574 8865.1 3154149334 24064.3 4928310325 37600.1
draw(htmp, heatmap_legend_side="right")

Cs-Core

devtools::load_all("../CS-CORE/")

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 2 iterations.
[INFO] Starting WLS for covariance at Wed Jan 21 11:17:28 2026
[INFO] 0.0565% 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: 4.2792 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(as.matrix(mat[c(genesList$NPGs,genesList$hk,genesList$PNGs),c(genesList$NPGs,genesList$hk,genesList$PNGs)]),
        #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   10851327  579.6   17751490   948.1   17751490   948.1
Vcells 1162483358 8869.1 3154149334 24064.3 4928310325 37600.1
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   10851454  579.6   17751490   948.1   17751490   948.1
Vcells 1162483617 8869.1 3154149334 24064.3 4928310325 37600.1
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:19:06 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                testthat_3.3.2             
 [3] monocle3_1.3.7              SingleCellExperiment_1.32.0
 [5] SummarizedExperiment_1.38.1 GenomicRanges_1.62.1       
 [7] Seqinfo_1.0.0               IRanges_2.44.0             
 [9] S4Vectors_0.48.0            MatrixGenerics_1.22.0      
[11] matrixStats_1.5.0           Biobase_2.70.0             
[13] BiocGenerics_0.56.0         generics_0.1.3             
[15] fstcore_0.10.0              fst_0.9.8                  
[17] stringr_1.6.0               HiClimR_2.2.1              
[19] doParallel_1.0.17           iterators_1.0.14           
[21] foreach_1.5.2               Rfast_2.1.5.1              
[23] RcppParallel_5.1.10         zigg_0.0.2                 
[25] Rcpp_1.1.0                  patchwork_1.3.2            
[27] Seurat_5.4.0                SeuratObject_5.3.0         
[29] sp_2.2-0                    Hmisc_5.2-3                
[31] dplyr_1.1.4                 circlize_0.4.16            
[33] ComplexHeatmap_2.26.0       COTAN_2.11.1               

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