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_Cortex1_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
Vim          7.890070 1.625653  3.767123     NPGs  -0.33619863
Sox2         6.590674 1.766255  4.280822     NPGs  -0.06493584
Sox1         6.083312 1.696697  2.910959     NPGs  -0.19913350
Notch1       9.345472 2.133278 23.458904     NPGs   0.64316069
Hes1         4.927426 1.469844  3.938356     NPGs  -0.63680030
Hes5         8.578643 2.060956 11.815068     NPGs   0.50363059
Pax6         7.425015 2.104135 11.643836     NPGs   0.58693541
Map2        10.730561 2.980101 82.363014     PNGs   2.27693654
Tubb3        9.419311 2.105468 23.630137     PNGs   0.58950798
Neurod1      7.049147 2.199835  7.876712     PNGs   0.77157000
Nefm         8.621195 2.124514 19.178082     PNGs   0.62625281
Nefl         9.670551 2.210353 28.595890     PNGs   0.79186166
Dcx          9.376658 3.074885 38.869863     PNGs   2.45980169
Tbr1         7.132476 2.216403 15.924658     PNGs   0.80353391
Calm1       11.296740 2.434057 86.986301       hk   1.22345340
Cox6b1       8.160202 2.219343 28.767123       hk   0.80920702
Ppia        10.156895 2.233641 70.719178       hk   0.83679140
Rpl18        8.525764 1.827148 27.739726       hk   0.05254523
Cox7c        7.992561 2.530316 41.267123       hk   1.40916598
Erh          7.100157 1.984456 20.205479       hk   0.35603985
H3f3a        9.381236 1.937299 42.979452       hk   0.26505967
Taf1         8.381669 2.147013 32.876712       hk   0.66966004
Taf2         8.496855 2.576585 32.705479       hk   1.49843329
Gapdh       10.273843 2.176315 90.068493       hk   0.72619191
Actb        10.196751 2.062685 80.821918       hk   0.50696724
Golph3       6.391812 1.993831  7.363014       hk   0.37412567
Zfr          9.515166 3.032437 60.102740       hk   2.37790687
Sub1         8.679920 2.340442 28.253425       hk   1.04284337
Amacr        5.616698 1.476679  3.424658       hk  -0.62361486
Reln         8.131467 2.095359 10.273973   layers   0.57000338
Cux1         9.804884 2.224251 47.602740   layers   0.81867566
Satb2        7.594507 2.594115 19.006849   layers   1.53225259
Tle1         7.800202 1.768612 12.842466   layers  -0.06038865
Mef2c       10.140138 3.097017 52.568493   layers   2.50250104
Rorb         9.317468 1.782738 30.821918   layers  -0.03313555
Sox5         9.142230 2.593335 32.876712   layers   1.53074859
Bcl11b       7.979344 2.129510 16.438356   layers   0.63589190
Fezf2        6.873248 1.986067  7.876712   layers   0.35914737
Foxp2        8.875860 1.878083 51.541096   layers   0.15081322
Rasgrf2      9.292449 2.848769 29.794521   layers   2.02355640
Cux2         8.807314 2.515149 34.075342   layers   1.37990397
Slc17a6      7.017118 1.695888  4.109589   layers  -0.20069412
Sema3c       5.858115 1.567670  2.397260   layers  -0.44806591
Thsd7a       9.055786 2.120933 18.493151   layers   0.61934515
Sulf2        8.804734 2.191503 21.746575   layers   0.75549461
Kcnk2        7.490116 1.916544 14.897260   layers   0.22501616
Grik3        9.184345 2.468392 28.082192   layers   1.28969617
Etv1         8.933770 2.070099 24.143836   layers   0.52126963
Tle4         8.442240 1.875716 20.547945   layers   0.14624784
Tmem200a     7.514092 2.075800 48.630137   layers   0.53226893
Glra2        6.278253 1.983556  3.767123   layers   0.35430302
Etv1.1       8.933770 2.070099 24.143836   layers   0.52126963
Htr1f        6.384685 2.376796 12.671233   layers   1.11298113
Sulf1        8.411087 1.782984 10.102740   layers  -0.03265990
Rxfp1        8.412606 2.435672  9.931507   layers   1.22657050
Syt6         8.357712 1.854448  9.931507   layers   0.10521508
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  10214940  545.6   18206440   972.4   18206440   972.4
Vcells 433639942 3308.5 1430493239 10913.8 2772850033 21155.2
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  10543443  563.1   18206440   972.4   18206440   972.4
Vcells 443662398 3384.9 1430493239 10913.8 2772850033 21155.2
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  10729696  573.1   18206440   972.4   18206440   972.4
Vcells 446871873 3409.4 1430493239 10913.8 2772850033 21155.2
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 2 iterations.
[INFO] Starting WLS for covariance at Wed Jan 21 11:38:52 2026
[INFO] 0.0649% 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.0180 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  10739044  573.6   18206440   972.4   18206440   972.4
Vcells 449664836 3430.7 1430493239 10913.8 2772850033 21155.2
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  10739171  573.6   18206440   972.4   18206440   972.4
Vcells 449665095 3430.7 1430493239 10913.8 2772850033 21155.2
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:38:55 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