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)Gene Correlation Analysis for Mouse Cortex Open Problem
Prologue
dataFile <- "Data/NewDataRevision/Ding_GSE132044_H_PBMC_M_Brain_CleanedDatasets/SplitLoomsAsCOTANObjects/mouse-brain-SS2_Cortex2_specimen1_cell1-Cleaned.RDS"
name <- str_split(dataFile,pattern = "/",simplify = T)[5]
name <- str_remove(name,pattern = "-Cleaned.RDS")
project = name
setLoggingLevel(1)
outDir <- "CoexData/"
setLoggingFile(paste0(outDir, "Logs/",name,".log"))
obj <- readRDS(dataFile)
file_code = namesource("src/Functions.R")To compare the ability of COTAN to asses the real correlation between genes we define some pools of genes:
- Constitutive genes
- Neural progenitor genes
- Pan neuronal genes
- Some layer marker genes
genesList <- list(
"NPGs"=
c("Nes", "Vim", "Sox2", "Sox1", "Notch1", "Hes1", "Hes5", "Pax6"),
"PNGs"=
c("Map2", "Tubb3", "Neurod1", "Nefm", "Nefl", "Dcx", "Tbr1"),
"hk"=
c("Calm1", "Cox6b1", "Ppia", "Rpl18", "Cox7c", "Erh", "H3f3a",
"Taf1", "Taf2", "Gapdh", "Actb", "Golph3", "Zfr", "Sub1",
"Tars", "Amacr"),
"layers" =
c("Reln","Lhx5","Cux1","Satb2","Tle1","Mef2c","Rorb","Sox5","Bcl11b","Fezf2","Foxp2","Ntf3","Rasgrf2","Pvrl3", "Cux2","Slc17a6", "Sema3c","Thsd7a", "Sulf2", "Kcnk2","Grik3", "Etv1", "Tle4", "Tmem200a", "Glra2", "Etv1","Htr1f", "Sulf1","Rxfp1", "Syt6")
# From https://www.science.org/doi/10.1126/science.aam8999
)COTAN
genesFromListExpressed <- unlist(genesList)[unlist(genesList) %in% getGenes(obj)]
int.genes <-getGenes(obj)coexMat.big <- getGenesCoex(obj)[genesFromListExpressed,genesFromListExpressed]
coexMat <- coexMat.big[rownames(coexMat.big) %in% c(genesList$NPGs,genesList$hk,genesList$PNGs),
colnames(coexMat.big) %in% c(genesList$NPGs,genesList$hk,genesList$PNGs)]
f1 = colorRamp2(seq(-0.5,0.5, length = 3), c("#DC0000B2", "white","#3C5488B2" ))
split.genes <- base::factor(c(rep("NPGs",sum(genesList[["NPGs"]] %in% getGenes(obj))),
rep("HK",sum(genesList[["hk"]] %in% getGenes(obj))),
rep("PNGs",sum(genesList[["PNGs"]] %in% getGenes(obj)))
),
levels = c("NPGs","HK","PNGs"))
lgd = Legend(col_fun = f1, title = "COTAN coex")
htmp <- Heatmap(as.matrix(coexMat),
#width = ncol(coexMat)*unit(2.5, "mm"),
height = nrow(coexMat)*unit(3, "mm"),
cluster_rows = FALSE,
cluster_columns = FALSE,
col = f1,
row_names_side = "left",
row_names_gp = gpar(fontsize = 11),
column_names_gp = gpar(fontsize = 11),
column_split = split.genes,
row_split = split.genes,
cluster_row_slices = FALSE,
cluster_column_slices = FALSE,
heatmap_legend_param = list(
title = "COTAN coex", at = c(-0.5, 0, 0.5),
direction = "horizontal",
labels = c("-0.5", "0", "0.5")
)
)
draw(htmp, heatmap_legend_side="right")
GDI_DF <- calculateGDI(obj)
GDI_DF$geneType <- NA
for (cat in names(genesList)) {
GDI_DF[rownames(GDI_DF) %in% genesList[[cat]],]$geneType <- cat
}
GDI_DF$GDI_centered <- scale(GDI_DF$GDI,center = T,scale = T)
GDI_DF[genesFromListExpressed,] sum.raw.norm GDI exp.cells geneType GDI_centered
Nes 5.803825 1.316536 0.8823529 NPGs -0.90121691
Vim 7.611451 1.522843 1.7647059 NPGs -0.49158103
Sox2 7.637211 1.798383 5.7352941 NPGs 0.05552256
Sox1 3.400883 1.171177 0.5882353 NPGs -1.18983603
Notch1 9.699372 2.097589 21.0294118 NPGs 0.64961482
Hes1 3.300551 1.251126 1.0294118 NPGs -1.03109205
Hes5 8.371051 2.142109 9.1176471 NPGs 0.73801217
Pax6 7.679793 1.977058 11.7647059 NPGs 0.41029262
Map2 10.817739 2.971057 77.2058824 PNGs 2.38394001
Tubb3 9.458506 2.145226 23.8235294 PNGs 0.74420015
Neurod1 7.152190 2.386407 8.9705882 PNGs 1.22308070
Nefm 9.078370 2.093575 13.6764706 PNGs 0.64164342
Nefl 10.015920 1.905688 21.7647059 PNGs 0.26858178
Dcx 9.719396 2.852352 32.5000000 PNGs 2.14824428
Tbr1 7.890403 2.387530 11.9117647 PNGs 1.22531055
Calm1 11.467388 2.649605 84.1176471 hk 1.74567654
Cox6b1 8.542026 2.331921 29.4117647 hk 1.11489629
Ppia 10.443822 1.930293 68.9705882 hk 0.31743790
Rpl18 8.518629 1.740225 21.0294118 hk -0.05995394
Cox7c 8.177110 2.254929 38.8235294 hk 0.96202379
Erh 7.127341 2.002801 15.1470588 hk 0.46140761
H3f3a 9.618723 1.713127 40.2941176 hk -0.11376022
Taf1 8.338708 1.893017 18.5294118 hk 0.24342312
Taf2 8.701699 2.384490 24.2647059 hk 1.21927452
Gapdh 10.343131 2.015174 82.9411765 hk 0.48597458
Actb 9.894812 1.592025 75.0000000 hk -0.35421420
Golph3 7.564967 1.828102 5.1470588 hk 0.11453009
Zfr 9.399088 2.546172 48.2352941 hk 1.54030422
Sub1 9.109399 2.198710 26.1764706 hk 0.85039642
Amacr 5.816401 1.861000 4.1176471 hk 0.17985254
Reln 8.232227 2.266711 12.0588235 layers 0.98541636
Lhx5 2.970843 1.141682 0.4411765 layers -1.24840058
Cux1 10.105905 2.266684 46.3235294 layers 0.98536391
Satb2 8.163813 2.478747 15.1470588 layers 1.40642743
Tle1 8.594410 1.881315 12.7941176 layers 0.22018844
Mef2c 10.235376 2.835495 48.3823529 layers 2.11477299
Rorb 9.532816 1.932589 25.5882353 layers 0.32199666
Sox5 8.798329 2.145619 21.7647059 layers 0.74498191
Bcl11b 7.917100 2.030273 10.7352941 layers 0.51595426
Fezf2 6.034144 2.109962 3.9705882 layers 0.67418177
Foxp2 9.584423 1.832945 50.7352941 layers 0.12414747
Rasgrf2 9.491568 2.531744 25.7352941 layers 1.51165701
Cux2 9.054088 2.332208 35.4411765 layers 1.11546635
Slc17a6 7.351583 1.813621 3.0882353 layers 0.08577721
Sema3c 7.345244 1.644451 3.8235294 layers -0.25012004
Thsd7a 8.705885 1.877323 11.1764706 layers 0.21226282
Sulf2 8.885156 2.323742 20.1470588 layers 1.09865547
Kcnk2 7.611828 1.650671 7.3529412 layers -0.23777074
Grik3 9.381553 2.400204 21.9117647 layers 1.25047665
Etv1 8.884707 1.746162 16.6176471 layers -0.04816653
Tle4 8.439249 1.987824 15.5882353 layers 0.43166902
Tmem200a 7.522124 1.844785 52.7941176 layers 0.14765649
Glra2 6.894834 1.732694 2.9411765 layers -0.07490858
Etv1.1 8.884707 1.746162 16.6176471 layers -0.04816653
Htr1f 6.746563 2.329512 9.2647059 layers 1.11011150
Sulf1 7.915943 2.028545 9.2647059 layers 0.51252290
Rxfp1 7.926563 2.126356 7.2058824 layers 0.70673330
Syt6 8.341163 1.821396 7.3529412 layers 0.10121650
GDIPlot(obj,GDIIn = GDI_DF, genes = genesList,GDIThreshold = 1.4)
Seurat correlation
srat<- CreateSeuratObject(counts = getRawData(obj),
project = project,
min.cells = 3,
min.features = 200)
srat[["percent.mt"]] <- PercentageFeatureSet(srat, pattern = "^mt-")
srat <- NormalizeData(srat)
srat <- FindVariableFeatures(srat, selection.method = "vst", nfeatures = 2000)
# plot variable features with and without labels
plot1 <- VariableFeaturePlot(srat)
plot1$data$centered_variance <- scale(plot1$data$variance.standardized,
center = T,scale = F)
write.csv(plot1$data,paste0("CoexData/",
"Variance_Seurat_genes",
getMetadataElement(obj,
datasetTags()[["cond"]]),".csv"))
LabelPoints(plot = plot1, points = c(genesList$NPGs,genesList$PNGs,genesList$layers), repel = TRUE)
LabelPoints(plot = plot1, points = c(genesList$hk), repel = TRUE)
all.genes <- rownames(srat)
srat <- ScaleData(srat, features = all.genes)
seurat.data = GetAssayData(srat[["RNA"]],layer = "data")corr.pval.list <- correlation_pvalues(data = seurat.data,
genesFromListExpressed,
n.cells = getNumCells(obj))
seurat.data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))
htmp <- correlation_plot(seurat.data.cor.big,
genesList, title="Seurat corr")
p_values.fromSeurat <- corr.pval.list$p_values
seurat.data.cor.big <- corr.pval.list$data.cor
rm(corr.pval.list)
gc() used (Mb) gc trigger (Mb) max used (Mb)
Ncells 10213430 545.5 18206440 972.4 18206440 972.4
Vcells 420360576 3207.1 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")
rm(seurat.data.cor.big)
rm(p_values.fromSeurat)Seurat SC Transform
srat <- SCTransform(srat,
method = "glmGamPoi",
vars.to.regress = "percent.mt",
verbose = FALSE)
seurat.data <- GetAssayData(srat[["SCT"]],layer = "data")
#Remove genes with all zeros
seurat.data <-seurat.data[rowSums(seurat.data) > 0,]
corr.pval.list <- correlation_pvalues(seurat.data,
genesFromListExpressed,
n.cells = getNumCells(obj))
seurat.data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))
htmp <- correlation_plot(seurat.data.cor.big,
genesList, title="Seurat corr SCT")
p_values.fromSeurat <- corr.pval.list$p_values
seurat.data.cor.big <- corr.pval.list$data.cor
rm(corr.pval.list)
gc() used (Mb) gc trigger (Mb) max used (Mb)
Ncells 10541910 563.0 18206440 972.4 18206440 972.4
Vcells 430760994 3286.5 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")
plot1 <- VariableFeaturePlot(srat)
plot1$data$centered_variance <- scale(plot1$data$residual_variance,
center = T,scale = F)write.csv(plot1$data,paste0("CoexData/",
"Variance_SeuratSCT_genes",
getMetadataElement(obj,
datasetTags()[["cond"]]),".csv"))
write_fst(as.data.frame(seurat.data.cor.big),path = paste0("CoexData/SeuratCorrSCT_",file_code,".fst"), compress = 100)
write_fst(as.data.frame(p_values.fromSeurat),path = paste0("CoexData/SeuratPValuesSCT_", file_code,".fst"))
write.csv(as.data.frame(p_values.fromSeurat),paste0("CoexData/SeuratPValuesSCT_", file_code,".csv"))
rm(seurat.data.cor.big)
rm(p_values.fromSeurat)Monocle
library(monocle3)cds <- new_cell_data_set(getRawData(obj),
cell_metadata = getMetadataCells(obj),
gene_metadata = getMetadataGenes(obj)
)
cds <- preprocess_cds(cds, num_dim = 100)
normalized_counts <- normalized_counts(cds)#Remove genes with all zeros
normalized_counts <- normalized_counts[rowSums(normalized_counts) > 0,]
corr.pval.list <- correlation_pvalues(normalized_counts,
genesFromListExpressed,
n.cells = getNumCells(obj))
rm(normalized_counts)
monocle.data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))
htmp <- correlation_plot(data.cor.big = monocle.data.cor.big,
genesList,
title = "Monocle corr")
p_values.from.monocle <- corr.pval.list$p_values
monocle.data.cor.big <- corr.pval.list$data.cor
rm(corr.pval.list)
gc() used (Mb) gc trigger (Mb) max used (Mb)
Ncells 10728162 573.0 18206440 972.4 18206440 972.4
Vcells 433922589 3310.6 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")
Cs-Core
library(CSCORE)Convert to Seurat obj
sceObj <- convertToSingleCellExperiment(obj)
# Correct: assay=NULL (or omit), data=NULL (since no logcounts)
seuratObj <- as.Seurat(
x = sceObj,
counts = "counts",
data = NULL,
assay = NULL, # IMPORTANT: do NOT set to "RNA" here
project = "COTAN"
)
# as.Seurat(SCE) creates assay "originalexp" by default; rename it to RNA
seuratObj <- RenameAssays(seuratObj, originalexp = "RNA", verbose = FALSE)
DefaultAssay(seuratObj) <- "RNA"
# Optional: keep COTAN payload
seuratObj@misc$COTAN <- S4Vectors::metadata(sceObj)Extract CS_CORE corr matrix
seuratObj@assays$RNA@counts <- ceiling(seuratObj@assays$RNA@counts)
csCoreRes <- CSCORE(seuratObj, genes = genesFromListExpressed)[INFO] IRLS converged after 3 iterations.
[INFO] Starting WLS for covariance at Wed Jan 21 11:51:23 2026
[INFO] 0.0605% co-expression estimates were greater than 1 and were set to 1.
[INFO] 0.0000% co-expression estimates were smaller than -1 and were set to -1.
[INFO] Finished WLS. Elapsed time: 0.0234 seconds.
mat <- as.matrix(csCoreRes$est)
diag(mat) <- 0
split.genes <- base::factor(c(rep("NPGs",sum(genesList[["NPGs"]] %in% genesFromListExpressed)),
rep("HK",sum(genesList[["hk"]] %in% genesFromListExpressed)),
rep("PNGs",sum(genesList[["PNGs"]] %in% genesFromListExpressed))
),
levels = c("NPGs","HK","PNGs"))
f1 = colorRamp2(seq(-0.5,0.5, length = 3), c("#DC0000B2", "white","#3C5488B2" ))
htmp <- Heatmap(mat[c(genesList$NPGs[genesList$NPGs %in% genesFromListExpressed],genesList$hk[genesList$hk %in% genesFromListExpressed],genesList$PNGs[genesList$PNGs %in% genesFromListExpressed]),
c(genesList$NPGs[genesList$NPGs %in% genesFromListExpressed],genesList$hk[genesList$hk %in% genesFromListExpressed],genesList$PNGs[genesList$PNGs %in% genesFromListExpressed])],
#width = ncol(coexMat)*unit(2.5, "mm"),
height = nrow(mat)*unit(3, "mm"),
cluster_rows = FALSE,
cluster_columns = FALSE,
col = f1,
row_names_side = "left",
row_names_gp = gpar(fontsize = 11),
column_names_gp = gpar(fontsize = 11),
column_split = split.genes,
row_split = split.genes,
cluster_row_slices = FALSE,
cluster_column_slices = FALSE,
heatmap_legend_param = list(
title = "CS-CORE", at = c(-0.5, 0, 0.5),
direction = "horizontal",
labels = c("-0.5", "0", "0.5")
)
)
draw(htmp, heatmap_legend_side="right")
Save CS_CORE matrix
write_fst(as.data.frame(csCoreRes$est), path = paste0("CoexData/CS_CORECorr_", file_code,".fst"),compress = 100)
write_fst(as.data.frame(csCoreRes$p_value), path = paste0("CoexData/CS_COREPValues_", file_code,".fst"),compress = 100)
write.csv(as.data.frame(csCoreRes$p_value), paste0("CoexData/CS_COREPValues_", file_code,".csv"))Baseline: Spearman on UMI counts
corr.pval.list <- correlation_pvaluesSpearman(data = getRawData(obj),
genesFromListExpressed,
n.cells = getNumCells(obj))
data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))
htmp <- correlation_plot(data.cor.big,
genesList, title="UMI baseline S. corr")
p_values.fromSp.C <- corr.pval.list$p_values
data.cor.bigSp.C <- corr.pval.list$data.cor
rm(corr.pval.list)
gc() used (Mb) gc trigger (Mb) max used (Mb)
Ncells 10737510 573.5 18206440 972.4 18206440 972.4
Vcells 436750720 3332.2 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")
write.csv(as.data.frame(p_values.fromSp.C), paste0("CoexData/BaselineUMISpCorrPValues_", file_code,".csv"))Baseline: Pearson on binarized counts
corr.pval.list <- correlation_pvalues(data = getZeroOneProj(obj),
genesFromListExpressed,
n.cells = getNumCells(obj))
data.cor.big <- as.matrix(Matrix::forceSymmetric(corr.pval.list$data.cor, uplo = "U"))
htmp <- correlation_plot(data.cor.big,
genesList, title="Zero-one P. corr")
p_values.fromSp.C <- corr.pval.list$p_values
data.cor.bigSp.C <- corr.pval.list$data.cor
rm(corr.pval.list)
gc() used (Mb) gc trigger (Mb) max used (Mb)
Ncells 10737637 573.5 18206440 972.4 18206440 972.4
Vcells 436750979 3332.2 1372732089 10473.2 2676408941 20419.4
draw(htmp, heatmap_legend_side="right")
write.csv(as.data.frame(p_values.fromSp.C), paste0("CoexData/ZeroOnePCorrPValues_", file_code,".csv"))Sys.time()[1] "2026-01-21 11:51:27 CET"
sessionInfo()R version 4.5.2 (2025-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 22.04.5 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0 LAPACK version 3.10.0
locale:
[1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
[4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
[7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
time zone: Europe/Rome
tzcode source: system (glibc)
attached base packages:
[1] stats4 parallel grid stats graphics grDevices utils
[8] datasets methods base
other attached packages:
[1] CSCORE_1.0.2 monocle3_1.3.7
[3] SingleCellExperiment_1.32.0 SummarizedExperiment_1.38.1
[5] GenomicRanges_1.62.1 Seqinfo_1.0.0
[7] IRanges_2.44.0 S4Vectors_0.48.0
[9] MatrixGenerics_1.22.0 matrixStats_1.5.0
[11] Biobase_2.70.0 BiocGenerics_0.56.0
[13] generics_0.1.3 fstcore_0.10.0
[15] fst_0.9.8 stringr_1.6.0
[17] HiClimR_2.2.1 doParallel_1.0.17
[19] iterators_1.0.14 foreach_1.5.2
[21] Rfast_2.1.5.1 RcppParallel_5.1.10
[23] zigg_0.0.2 Rcpp_1.1.0
[25] patchwork_1.3.2 Seurat_5.4.0
[27] SeuratObject_5.3.0 sp_2.2-0
[29] Hmisc_5.2-3 dplyr_1.1.4
[31] circlize_0.4.16 ComplexHeatmap_2.26.0
[33] COTAN_2.11.1
loaded via a namespace (and not attached):
[1] RcppAnnoy_0.0.22 splines_4.5.2
[3] later_1.4.2 tibble_3.3.0
[5] polyclip_1.10-7 rpart_4.1.24
[7] fastDummies_1.7.5 lifecycle_1.0.4
[9] Rdpack_2.6.4 globals_0.18.0
[11] lattice_0.22-7 MASS_7.3-65
[13] backports_1.5.0 ggdist_3.3.3
[15] dendextend_1.19.0 magrittr_2.0.4
[17] plotly_4.11.0 rmarkdown_2.29
[19] yaml_2.3.10 httpuv_1.6.16
[21] otel_0.2.0 glmGamPoi_1.20.0
[23] sctransform_0.4.2 spam_2.11-1
[25] spatstat.sparse_3.1-0 reticulate_1.44.1
[27] minqa_1.2.8 cowplot_1.2.0
[29] pbapply_1.7-2 RColorBrewer_1.1-3
[31] abind_1.4-8 Rtsne_0.17
[33] purrr_1.2.0 nnet_7.3-20
[35] GenomeInfoDbData_1.2.14 ggrepel_0.9.6
[37] irlba_2.3.5.1 listenv_0.10.0
[39] spatstat.utils_3.2-1 goftest_1.2-3
[41] RSpectra_0.16-2 spatstat.random_3.4-3
[43] fitdistrplus_1.2-2 parallelly_1.46.0
[45] DelayedMatrixStats_1.30.0 ncdf4_1.24
[47] codetools_0.2-20 DelayedArray_0.36.0
[49] tidyselect_1.2.1 shape_1.4.6.1
[51] UCSC.utils_1.4.0 farver_2.1.2
[53] lme4_1.1-37 ScaledMatrix_1.16.0
[55] viridis_0.6.5 base64enc_0.1-3
[57] spatstat.explore_3.6-0 jsonlite_2.0.0
[59] GetoptLong_1.1.0 Formula_1.2-5
[61] progressr_0.18.0 ggridges_0.5.6
[63] survival_3.8-3 tools_4.5.2
[65] ica_1.0-3 glue_1.8.0
[67] gridExtra_2.3 SparseArray_1.10.8
[69] xfun_0.52 distributional_0.6.0
[71] ggthemes_5.2.0 GenomeInfoDb_1.44.0
[73] withr_3.0.2 fastmap_1.2.0
[75] boot_1.3-32 digest_0.6.37
[77] rsvd_1.0.5 parallelDist_0.2.6
[79] R6_2.6.1 mime_0.13
[81] colorspace_2.1-1 Cairo_1.7-0
[83] scattermore_1.2 tensor_1.5
[85] spatstat.data_3.1-9 tidyr_1.3.1
[87] data.table_1.18.0 httr_1.4.7
[89] htmlwidgets_1.6.4 S4Arrays_1.10.1
[91] uwot_0.2.3 pkgconfig_2.0.3
[93] gtable_0.3.6 lmtest_0.9-40
[95] S7_0.2.1 XVector_0.50.0
[97] htmltools_0.5.8.1 dotCall64_1.2
[99] clue_0.3-66 scales_1.4.0
[101] png_0.1-8 reformulas_0.4.1
[103] spatstat.univar_3.1-6 rstudioapi_0.18.0
[105] knitr_1.50 reshape2_1.4.4
[107] rjson_0.2.23 nloptr_2.2.1
[109] checkmate_2.3.2 nlme_3.1-168
[111] proxy_0.4-29 zoo_1.8-14
[113] GlobalOptions_0.1.2 KernSmooth_2.23-26
[115] miniUI_0.1.2 foreign_0.8-90
[117] pillar_1.11.1 vctrs_0.7.0
[119] RANN_2.6.2 promises_1.5.0
[121] BiocSingular_1.26.1 beachmat_2.26.0
[123] xtable_1.8-4 cluster_2.1.8.1
[125] htmlTable_2.4.3 evaluate_1.0.5
[127] magick_2.9.0 zeallot_0.2.0
[129] cli_3.6.5 compiler_4.5.2
[131] rlang_1.1.7 crayon_1.5.3
[133] future.apply_1.20.0 labeling_0.4.3
[135] plyr_1.8.9 stringi_1.8.7
[137] viridisLite_0.4.2 deldir_2.0-4
[139] BiocParallel_1.44.0 assertthat_0.2.1
[141] lazyeval_0.2.2 spatstat.geom_3.6-1
[143] Matrix_1.7-4 RcppHNSW_0.6.0
[145] sparseMatrixStats_1.20.0 future_1.69.0
[147] ggplot2_4.0.1 shiny_1.12.1
[149] rbibutils_2.3 ROCR_1.0-11
[151] igraph_2.2.1