Gene Correlation Analysis for PBMC Brown run 40

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/Brown_PBMC_Datasets/capillary_blood_samples_pbmcs-Run_40-Cleaned.RDS"
name <- str_split(dataFile,pattern = "/",simplify = T)[3]
name <- str_remove(name,pattern = "-Cleaned.RDS")
name <- str_remove(name,pattern = "capillary_blood_samples_")

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        10.281423 4.6753458 79.580831          CD4 T cells   2.38465433
CD3D         10.138257 5.1870513 79.568575          CD4 T cells   2.88961161
CD3G          9.947640 5.1005711 76.443192          CD4 T cells   2.80427181
CD3E         10.028351 5.1840570 79.740164          CD4 T cells   2.88665672
IL7R         10.819269 5.0363720 75.903910          CD4 T cells   2.74091943
LTB          11.066033 4.7167109 86.138007          CD4 T cells   2.42547392
LEF1          9.575518 4.5923187 55.742125          CD4 T cells   2.30272214
PAX5          6.594448 3.5008847  3.909793              B cells   1.22568178
MS4A1         7.982075 3.6449369  7.022919              B cells   1.36783428
CD19          5.271515 2.7354892  1.703640              B cells   0.47038014
CD74         10.236047 3.9041546 50.667974              B cells   1.62363341
CD79A         8.405070 3.5013672  9.094252              B cells   1.22615792
IGHD          7.579516 3.5736365  4.694203              B cells   1.29747416
HLA-DRA       9.889789 4.9280298 22.147322              B cells   2.63400602
ARF5          8.182166 2.9943936 34.526290                   hk   0.72587022
M6PR          8.465049 2.4504986 42.578747                   hk   0.18914797
RALA          7.982402 2.0919776 28.741267                   hk  -0.16464490
DVL2          5.942692 1.3727948  4.252972                   hk  -0.87434332
TSR3          7.545354 1.7245626 20.321118                   hk  -0.52721453
NDUFAB1       8.375120 2.3293029 40.973158                   hk   0.06955059
RPS20        11.476512 2.0116638 99.497487                   hk  -0.24389958
RANBP9        7.930775 2.8666734 26.302243                   hk   0.59983437
SS18L2        8.243229 1.9083038 36.524084                   hk  -0.34589648
PPP5C         6.508700 1.8772139  7.353842                   hk  -0.37657639
VDAC3         8.144980 1.6578412 33.410957                   hk  -0.59305603
RTF2          8.117900 2.6697077 33.374188                   hk   0.40546618
B4GALT7       6.120160 1.9704804  5.270254                   hk  -0.28453982
GABARAPL2     8.674787 1.9170136 50.667974                   hk  -0.33730155
MRPS10        7.511741 1.4972229 19.107734                   hk  -0.75155618
VAMP3         6.885916 3.4147202 11.288148                   hk   1.14065363
RCN1          6.014452 2.3955685  4.951587                   hk   0.13494228
FAM168A       7.348677 3.9478265 14.156147                   hk   1.66672944
CDC27         7.735180 3.0692921 22.784655                   hk   0.79978093
RPL18        12.097345 0.8765238 99.975487                   hk  -1.36406958
FOXP3         4.997158 1.7170950  1.299179 general PBMC markers  -0.53458364
TBX21         6.922577 3.3540603  7.451894 general PBMC markers   1.08079369
GATA3         7.804577 2.8024667 21.559015 general PBMC markers   0.53647440
RUNX1         8.887512 3.9358183 47.898027 general PBMC markers   1.65487958
BCL6          6.501857 4.4578044  7.059689 general PBMC markers   2.16998179
EOMES         6.364606 2.7428021  5.061895 general PBMC markers   0.47759662
EOMES.1       6.364606 2.7428021  5.061895 general PBMC markers   0.47759662
TBX21.1       6.922577 3.3540603  7.451894 general PBMC markers   1.08079369
BATF3         4.644769 3.8548176  1.397230 general PBMC markers   1.57494705
IRF2          8.418316 2.2969735 40.850594 general PBMC markers   0.03764747
TCF4          6.725206 3.9874305  5.282510 general PBMC markers   1.70581113
STAT5A        6.907744 2.4855603 11.459738 general PBMC markers   0.22374732
RUNX3         8.126983 2.7185042 27.442088 general PBMC markers   0.45361918
STAT6         7.391468 3.7597434 17.526658 general PBMC markers   1.48112672
BATF          7.519322 2.2810830 17.428606 general PBMC markers   0.02196662
STAT3         8.284076 3.1100404 36.033828 general PBMC markers   0.83999188
TBX21.2       6.922577 3.3540603  7.451894 general PBMC markers   1.08079369
TBX21.3       6.922577 3.3540603  7.451894 general PBMC markers   1.08079369
IRF8          6.837432 4.5620196  6.949381 general PBMC markers   2.27282265
IRF4          5.242881 3.1579831  2.157127 general PBMC markers   0.88730232
AHR           7.442754 4.6313180 13.334968 general PBMC markers   2.34120721
STAT1         8.519977 2.8188197 33.839931 general PBMC markers   0.55261173
IRF4.1        5.242881 3.1579831  2.157127 general PBMC markers   0.88730232
RELB          6.831197 3.7263740 10.172815 general PBMC markers   1.44819742
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,file_code),".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  10572443  564.7   17840978  952.9   17840978   952.9
Vcells 360781135 2752.6  731877821 5583.8 1478343794 11278.9
draw(htmp, heatmap_legend_side="right")

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

sratbase <- srat

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  10900656  582.2   17840978  952.9   17840978   952.9
Vcells 432266058 3298.0 1054080062 8042.0 1478343794 11278.9
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",
                            file_code,".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  11086775  592.1   17840978  952.9   17840978   952.9
Vcells 434993007 3318.8 1054080062 8042.0 1478343794 11278.9
draw(htmp, heatmap_legend_side="right")

Cs-Core

devtools::load_all("../CS-CORE/")
Exports from /mnt/d/CS-CORE/src/CSCORE_IRLS_cpp.cpp:
   Rcpp::List CSCORE_IRLS_cpp_impl(const arma::mat& X, const arma::vec& seq_depth_sq, const arma::mat& D_mu, const arma::mat& D_sigma2, const arma::mat& D_sigma, const bool post_process = true, const int n_iter = 10, const double eps = 0.05, const bool verbose = false, const std::string& conv = "q95", const bool return_all = false)

Exports from /mnt/d/CS-CORE/src/WLS_cov.cpp:
   Rcpp::List WLS_cov(arma::mat D, arma::mat X, arma::mat W)

Exports from /mnt/d/CS-CORE/src/WLS_mean.cpp:
   arma::mat WLS_mean(arma::mat D, arma::mat X, arma::mat W)

/mnt/d/CS-CORE/src/RcppExports.cpp updated.
/mnt/d/CS-CORE/R/RcppExports.R updated.
── R CMD INSTALL ───────────────────────────────────────────────────────────────
* installing *source* package ‘CSCORE’ ...
** this is package ‘CSCORE’ version ‘1.0.2’
** using staged installation
** libs
using C++ compiler: ‘g++ (Ubuntu 11.4.0-1ubuntu1~22.04.2) 11.4.0’
g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -I"/home/seriph/R/x86_64-pc-linux-gnu-library/4.5/RcppArmadillo/include" -I'/home/seriph/R/x86_64-pc-linux-gnu-library/4.5/Rcpp/include' -I'/home/seriph/R/x86_64-pc-linux-gnu-library/4.5/RcppArmadillo/include'     -fpic  -g -O2 -ffile-prefix-map=/build/r-base-xupQTd/r-base-4.5.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2  -UNDEBUG -Wall -pedantic -g -O0  -c RcppExports.cpp -o RcppExports.o
Error: object 'LdFlags' not found
Execution halted
Error: object 'LdFlags' not found
Execution halted
g++ -std=gnu++17 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -flto=auto -ffat-lto-objects -flto=auto -Wl,-z,relro -o CSCORE.so CSCORE_IRLS_cpp.o RcppExports.o WLS_cov.o WLS_mean.o -llapack -lblas -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
installing to /tmp/RtmpwbZI17/devtools_install_720875f0aef0/00LOCK-CS-CORE/00new/CSCORE/libs
** checking absolute paths in shared objects and dynamic libraries
* DONE (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(sratbase, genes = genesFromListExpressed)
[INFO] IRLS converged after 3 iterations.
[INFO] Starting WLS for covariance at Thu Jan 22 12:35:45 2026
[INFO] 5 among 58 genes have invalid variance estimates. Their co-expressions with other genes were set to 0.
[INFO] 0.7864% co-expression estimates were greater than 1 and were set to 1.
[INFO] 0.0605% co-expression estimates were smaller than -1 and were set to -1.
[INFO] Finished WLS. Elapsed time: 0.8568 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  11246116  600.7   17840978  952.9   17840978   952.9
Vcells 435302679 3321.1 1054080062 8042.0 1478343794 11278.9
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  11246174  600.7   17840978  952.9   17840978   952.9
Vcells 435303705 3321.2 1054080062 8042.0 1478343794 11278.9
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-22 12:35: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                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] torch_0.16.3              rstudioapi_0.18.0        
 [35] shape_1.4.6.1             ica_1.0-3                
 [37] spatstat.random_3.4-3     distributional_0.6.0     
 [39] dendextend_1.19.0         Matrix_1.7-4             
 [41] abind_1.4-8               lifecycle_1.0.4          
 [43] yaml_2.3.10               SparseArray_1.10.8       
 [45] Rtsne_0.17                glmGamPoi_1.20.0         
 [47] promises_1.5.0            crayon_1.5.3             
 [49] miniUI_0.1.2              lattice_0.22-7           
 [51] beachmat_2.26.0           cowplot_1.2.0            
 [53] magick_2.9.0              zeallot_0.2.0            
 [55] pillar_1.11.1             knitr_1.50               
 [57] rjson_0.2.23              boot_1.3-32              
 [59] future.apply_1.20.0       codetools_0.2-20         
 [61] glue_1.8.0                RcppArmadillo_15.2.3-1   
 [63] spatstat.univar_3.1-6     remotes_2.5.0            
 [65] data.table_1.18.0         Rdpack_2.6.4             
 [67] vctrs_0.7.0               png_0.1-8                
 [69] spam_2.11-1               gtable_0.3.6             
 [71] assertthat_0.2.1          cachem_1.1.0             
 [73] xfun_0.52                 rbibutils_2.3            
 [75] S4Arrays_1.10.1           mime_0.13                
 [77] reformulas_0.4.1          survival_3.8-3           
 [79] ncdf4_1.24                ellipsis_0.3.2           
 [81] fitdistrplus_1.2-2        ROCR_1.0-11              
 [83] nlme_3.1-168              usethis_3.2.1            
 [85] bit64_4.6.0-1             RcppAnnoy_0.0.22         
 [87] rprojroot_2.1.1           GenomeInfoDb_1.44.0      
 [89] irlba_2.3.5.1             KernSmooth_2.23-26       
 [91] otel_0.2.0                rpart_4.1.24             
 [93] colorspace_2.1-1          nnet_7.3-20              
 [95] tidyselect_1.2.1          processx_3.8.6           
 [97] bit_4.6.0                 compiler_4.5.2           
 [99] htmlTable_2.4.3           desc_1.4.3               
[101] DelayedArray_0.36.0       plotly_4.11.0            
[103] checkmate_2.3.2           scales_1.4.0             
[105] lmtest_0.9-40             callr_3.7.6              
[107] digest_0.6.37             goftest_1.2-3            
[109] spatstat.utils_3.2-1      minqa_1.2.8              
[111] rmarkdown_2.29            XVector_0.50.0           
[113] htmltools_0.5.8.1         pkgconfig_2.0.3          
[115] base64enc_0.1-3           coro_1.1.0               
[117] lme4_1.1-37               sparseMatrixStats_1.20.0 
[119] fastmap_1.2.0             rlang_1.1.7              
[121] GlobalOptions_0.1.2       htmlwidgets_1.6.4        
[123] ggthemes_5.2.0            UCSC.utils_1.4.0         
[125] shiny_1.12.1              DelayedMatrixStats_1.30.0
[127] farver_2.1.2              zoo_1.8-14               
[129] jsonlite_2.0.0            BiocParallel_1.44.0      
[131] BiocSingular_1.26.1       magrittr_2.0.4           
[133] Formula_1.2-5             GenomeInfoDbData_1.2.14  
[135] dotCall64_1.2             viridis_0.6.5            
[137] reticulate_1.44.1         stringi_1.8.7            
[139] brio_1.1.5                MASS_7.3-65              
[141] pkgbuild_1.4.7            plyr_1.8.9               
[143] listenv_0.10.0            ggrepel_0.9.6            
[145] deldir_2.0-4              splines_4.5.2            
[147] tensor_1.5                ps_1.9.1                 
[149] igraph_2.2.1              spatstat.geom_3.6-1      
[151] RcppHNSW_0.6.0            pkgload_1.4.0            
[153] reshape2_1.4.4            ScaledMatrix_1.16.0      
[155] evaluate_1.0.5            nloptr_2.2.1             
[157] httpuv_1.6.16             RANN_2.6.2               
[159] tidyr_1.3.1               purrr_1.2.0              
[161] polyclip_1.10-7           future_1.69.0            
[163] clue_0.3-66               scattermore_1.2          
[165] ggplot2_4.0.1             rsvd_1.0.5               
[167] xtable_1.8-4              RSpectra_0.16-2          
[169] later_1.4.2               viridisLite_0.4.2        
[171] tibble_3.3.0              memoise_2.0.1            
[173] cluster_2.1.8.1           globals_0.18.0