Gene Correlation Analysis for PBMC 2

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/PBMC2/filtered/PBMC2.cotan.RDS"
name <- str_split(dataFile,pattern = "/",simplify = T)[4]
name <- str_remove(name,pattern = ".cotan.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
hkGenes  <- read.csv("Data/Housekeeping_TranscriptsHuman.csv", sep = ";")

genesList <- list(
  "CD4 T cells"= 
    c("TRBC2","CD3D","CD3G","CD3E","IL7R","LTB","LEF1"),
  "B cells"= 
    c("PAX5","MS4A1","CD19","CD74","CD79A","IGHD","HLA-DRA"),
  "hk"= hkGenes$Gene_symbol[1:20], # from https://housekeeping.unicamp.br/
  "general PBMC markers" = 
  c("FOXP3","TBX21","GATA3","RUNX1","BCL6","EOMES","EOMES","TBX21","BATF3","IRF2","TCF4","STAT5A","RUNX3","STAT6","BATF","STAT3","TBX21","TBX21","IRF8","IRF4","AHR","STAT1","IRF4","RELB") 
)

COTAN

genesFromListExpressed <- unlist(genesList)[unlist(genesList) %in% getGenes(obj)]
int.genes <-getGenes(obj)
#obj <- proceedToCoex(obj, calcCoex = TRUE, cores = 5L, saveObj = FALSE)
coexMat.big <- getGenesCoex(obj)[genesFromListExpressed,genesFromListExpressed]

coexMat <- getGenesCoex(obj)[c(genesList$`CD4 T cells`,genesList$hk,genesList$`B cells`),c(genesList$`CD4 T cells`,genesList$hk,genesList$`B cells`)]

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

split.genes <- base::factor(c(rep("CD4 T cells",length(genesList[["CD4 T cells"]])),
                         rep("HK",length(genesList[["hk"]])),
                         rep("B cells",length(genesList[["B cells"]]))
                        ),
                         levels = c("CD4 T cells","HK","B cells"))

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(-1, 0, 1),
        direction = "horizontal",
        labels = c("-1", "0", "1")
    )
   )

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
TRBC2         9.268317 4.235730 66.107327          CD4 T cells  3.254735265
CD3D          9.287078 4.682107 60.774215          CD4 T cells  3.875268462
CD3G          8.346540 3.960945 41.136401          CD4 T cells  2.872741434
CD3E         10.118213 5.013350 74.214986          CD4 T cells  4.335747296
IL7R          9.988188 4.549567 61.388935          CD4 T cells  3.691017877
LTB          10.512466 4.328119 79.066290          CD4 T cells  3.383170388
LEF1          8.530189 4.178575 39.026416          CD4 T cells  3.175280307
PAX5          5.663890 3.385440  3.621864              B cells  2.072700245
MS4A1         7.860168 3.764062  8.340256              B cells  2.599043574
CD19          6.118075 3.476141  4.585479              B cells  2.198787663
CD74         11.586538 2.965525 84.249875              B cells  1.488952647
CD79A         8.326966 3.638378 10.333943              B cells  2.424323052
IGHD          6.215234 3.460462  4.352883              B cells  2.176992102
HLA-DRA       9.940785 5.069079 25.020768              B cells  4.413219922
ARF5          8.563852 2.764955 53.214820                   hk  1.210128321
M6PR          8.109273 1.974448 40.521681                   hk  0.111201816
RALA          7.091094 1.485644 17.743811                   hk -0.568312957
DVL2          6.294122 1.629314  8.273800                   hk -0.368588242
TSR3          6.766440 1.660841 13.390929                   hk -0.324760837
NDUFAB1       7.836478 2.365630 34.108656                   hk  0.655004578
RPS20         9.808344 2.495299 85.878053                   hk  0.835265447
RANBP9        6.051715 1.479756  6.462868                   hk -0.576497224
SS18L2        7.424429 1.449109 24.173451                   hk -0.619102198
PPP5C         6.693324 1.669007 11.496926                   hk -0.313408563
VDAC3         7.620449 1.512049 27.629174                   hk -0.531605309
RTF2          7.706813 1.850551 30.586476                   hk -0.061034856
B4GALT7       5.962397 1.557339  6.113972                   hk -0.468645637
GABARAPL2     8.264321 1.829995 45.871407                   hk -0.089610300
MRPS10        6.725642 1.372117 12.543612                   hk -0.726132831
VAMP3         6.672157 3.415034 12.311015                   hk  2.113839573
RCN1          5.479894 1.900039  3.887689                   hk  0.007760737
FAM168A       5.181261 1.441315  2.857618                   hk -0.629936856
CDC27         6.518552 1.504954 10.533311                   hk -0.541467710
RPL18        11.765343 1.500865 99.568035                   hk -0.547152265
FOXP3         5.328925 1.717890  1.694634 general PBMC markers -0.245454100
TBX21         7.506181 3.363727 12.377471 general PBMC markers  2.042515240
GATA3         7.754832 3.175327 25.386277 general PBMC markers  1.780609377
RUNX1         6.830552 1.818871 13.922579 general PBMC markers -0.105074634
BCL6          5.573306 3.801613  3.804619 general PBMC markers  2.651244912
EOMES         6.740963 2.786757  7.941519 general PBMC markers  1.240436944
EOMES.1       6.740963 2.786757  7.941519 general PBMC markers  1.240436944
TBX21.1       7.506181 3.363727 12.377471 general PBMC markers  2.042515240
BATF3         4.928381 3.949598  2.525336 general PBMC markers  2.856966822
IRF2          7.405137 1.636393 22.030238 general PBMC markers -0.358747504
TCF4          6.485344 3.713117  6.396411 general PBMC markers  2.528221533
STAT5A        7.204020 1.693463 19.355375 general PBMC markers -0.279411377
RUNX3         7.518136 2.211928 21.299219 general PBMC markers  0.441335435
STAT6         7.748654 2.848655 30.254195 general PBMC markers  1.326485148
BATF          6.882812 1.671873 13.025420 general PBMC markers -0.309424467
STAT3         8.160649 1.638273 40.937033 general PBMC markers -0.356133606
TBX21.2       7.506181 3.363727 12.377471 general PBMC markers  2.042515240
TBX21.3       7.506181 3.363727 12.377471 general PBMC markers  2.042515240
IRF8          7.315179 4.073089 11.895664 general PBMC markers  3.028639312
IRF4          5.033643 2.640743  2.641635 general PBMC markers  1.037454696
AHR           6.302230 3.262612  8.290414 general PBMC markers  1.901949759
STAT1         7.896645 1.689712 26.964612 general PBMC markers -0.284625773
IRF4.1        5.033643 2.640743  2.641635 general PBMC markers  1.037454696
RELB          7.201781 3.294886 18.009636 general PBMC markers  1.946815081
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$`CD4 T cells`,genesList$`B cells`,genesList$hk), 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_plotPBMC(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  10153227  542.3   17840920  952.9  17840920  952.9
Vcells 251444104 1918.4  579083856 4418.1 723346931 5518.7
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_plotPBMC(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  10481752  559.8   17840920  952.9  17840920  952.9
Vcells 297059143 2266.4  694980627 5302.3 723346931 5518.7
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_plotPBMC(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  10668005  569.8   17840920  952.9  17840920  952.9
Vcells 299389405 2284.2  694980627 5302.3 723346931 5518.7
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 3 iterations.
[INFO] Starting WLS for covariance at Wed Jan 21 12:10:24 2026
[INFO] 10 among 58 genes have invalid variance estimates. Their co-expressions with other genes were set to 0.
[INFO] 1.3309% co-expression estimates were greater than 1 and were set to 1.
[INFO] 0.4840% co-expression estimates were smaller than -1 and were set to -1.
[INFO] Finished WLS. Elapsed time: 0.6535 seconds.
mat <- as.matrix(csCoreRes$est)
diag(mat) <- 0

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

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

htmp <- Heatmap(as.matrix(mat[c(genesList$`CD4 T cells`,genesList$hk,genesList$`B cells`),c(genesList$`CD4 T cells`,genesList$hk,genesList$`B cells`)]),
        #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(-1, 0, 1),
         direction = "horizontal",
         labels = c("-1", "0", "1")
     )
   )

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  10795403  576.6   17840920  952.9  17840920  952.9
Vcells 299710423 2286.7  694980627 5302.3 723346931 5518.7
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_plotPBMC(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  10795467  576.6   17840920  952.9  17840920  952.9
Vcells 299711453 2286.7  694980627 5302.3 723346931 5518.7
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 12:10:32 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