Visium Analysis

Author

Ahmed-Amine Anzali, Institut Gustave Roussy, INSERM U1015, Ecole Polytechnique

#Importing libraries
suppressPackageStartupMessages(require(Matrix))
suppressPackageStartupMessages(require(dplyr))
suppressPackageStartupMessages(require(Seurat))
suppressPackageStartupMessages(require(ggplot2))
suppressPackageStartupMessages(require(patchwork))
suppressPackageStartupMessages(require(dplyr))
suppressPackageStartupMessages(require(dittoSeq))
suppressPackageStartupMessages(require(scCustomize))
suppressPackageStartupMessages(require(clusterProfiler))
suppressPackageStartupMessages(require(org.Hs.eg.db))
Warning: package 'S4Vectors' was built under R version 4.2.2
suppressPackageStartupMessages(require(DOSE))
suppressPackageStartupMessages(require(enrichplot))
suppressPackageStartupMessages(require(ReactomePA))
suppressPackageStartupMessages(require(speckle))
suppressPackageStartupMessages(require(ggpubr))
suppressPackageStartupMessages(require(BayesSpace))
Warning: package 'GenomicRanges' was built under R version 4.2.2
Warning: package 'GenomeInfoDb' was built under R version 4.2.2

1 Merging Visium Slides

9 different patients selected by a pathologist were selected for spatial analysis with the Visium kit, one of the patient had 3 different H&E slides analyzed.

3 of the patients were classified as \(MGC_{low}\), the remaining 6 were all \(MGC_{high}\)

#Function for reading the different visium slides
read_file <- function(Data){
  Data <- Seurat::Load10X_Spatial(Data)
}

file_names <- list.files(path = "Raw_Visium/",full.names = F)

for(file in file_names){
  assign(file, read_file(paste0("Raw_Visium/",file)))
}
#Reading the spot IDs for manual annotation of MGC spots on the different slides
file_names_2 <- list.files(path = "MGC_IDs/",full.names = F)

for(file in file_names_2){
  assign(file, read.csv(paste0("MGC_IDs/",file)))
}

1.1 Metadata for Slides

####Add Metadata to integrated seurat slides####
#Batch ID Metadata
Slide_A1$Batch <- 'B1'
Slide_B1$Batch <- 'B2'
Slide_D1$Batch <- 'B3'
Slide_C1$Batch <- 'B4'
Slide_E1$Batch <- 'B5'
Slide_F1$Batch <- 'B6'
Slide_G1$Batch <- 'B7'
Slide_H1$Batch <- 'B8'
Slide_I1$Batch <- 'B9'
Slide_I2$Batch <- 'B10'
Slide_I3$Batch <- 'B11'
#Patient ID Metadata
Slide_A1$PatientID <- 'P1'
Slide_B1$PatientID <- 'P2'
Slide_D1$PatientID <- 'P3'
Slide_C1$PatientID <- 'P4'
Slide_E1$PatientID <- 'P5'
Slide_F1$PatientID <- 'P6'
Slide_G1$PatientID <- 'P7'
Slide_H1$PatientID <- 'P8'
Slide_I1$PatientID <- 'P9'
Slide_I2$PatientID <- 'P9'
Slide_I3$PatientID <- 'P9'
#MGC Metadata
Slide_A1$MGC <- 'MGC Low'
Slide_B1$MGC <- 'MGC Low'
Slide_D1$MGC <- 'MGC Low'
Slide_C1$MGC <- 'MGC High'
Slide_E1$MGC <- 'MGC High'
Slide_F1$MGC <- 'MGC High'
Slide_G1$MGC <- 'MGC High'
Slide_H1$MGC <- 'MGC High'
Slide_I1$MGC <- 'MGC High'
Slide_I2$MGC <- 'MGC High'
Slide_I3$MGC <- 'MGC High'
#MGC Spot Annotations - Pathologist
Slide_A1$MGC_Spot_Only <- NA
Slide_B1$MGC_Spot_Only <- NA
Slide_D1$MGC_Spot_Only <- NA
Slide_C1$MGC_Spot_Only <- MGC_C1.csv$MGC
Slide_E1$MGC_Spot_Only <- MGC_050H04724.csv$MGC
Slide_F1$MGC_Spot_Only <- `MGC_C1_10H02587-08.csv`$MGC
Slide_G1$MGC_Spot_Only <- `MGC_D1_16H02168-56-z01.csv`$MGC
Slide_H1$MGC_Spot_Only <- `MGC_B1_13H02127-09..csv`$MGC
Slide_I1$MGC_Spot_Only <- NA
Slide_I2$MGC_Spot_Only <- `MGC_C1_16H02168-56-z02.csv`$MGC
Slide_I3$MGC_Spot_Only <- `MGC_D1_16H02168-56-z01_V2.csv`$MGC
#Merging different slides
Visium <- merge(Slide_A1, y = c(Slide_B1,
                                Slide_C1,
                                Slide_D1,
                                Slide_E1,
                                Slide_F1,
                                Slide_G1,
                                Slide_H1,
                                Slide_I1,
                                Slide_I2,
                                Slide_I3))
Warning in CheckDuplicateCellNames(object.list = objects): Some cell names are
duplicated across objects provided. Renaming to enforce unique cell names.

1.2 Sequencing QC of Visium Slides

#Quality control of the data
Seurat::VlnPlot(Visium, features = c("nCount_Spatial", "nFeature_Spatial"), pt.size = 0.1, ncol = 2, log =T,group.by = 'Batch') + Seurat::NoLegend()

#Filtering out low quality reads
Visium <- Visium[, Visium$nFeature_Spatial > 500 & Visium$nCount_Spatial > 500]
Seurat::SpatialFeaturePlot(Visium, features = c("nCount_Spatial"),ncol = 6)

Seurat::SpatialFeaturePlot(Visium, features = c("nFeature_Spatial"), ncol = 6)

#Highly expressed genes
C = Visium@assays$Spatial@counts
C@x = C@x/rep.int(colSums(C), diff(C@p))
most_expressed <- order(Matrix::rowSums(C), decreasing = T)[20:1]
boxplot(as.matrix(t(C[most_expressed, ])), cex = 0.1, las = 1, xlab = "% total count per cell",
        col = (scales::hue_pal())(20)[20:1], horizontal = TRUE)

2 MGC spots - Identification of Signature

Idents(Visium) <- Visium$MGC_Spot_Only

MGC_Markers <- FindMarkers(Visium,
                           ident.1 = 'MGC only',
                           logfc.threshold = 0,
                           min.pct = 0.25,
                           only.pos = T,
                           test.use = 'wilcox',
                           densify = T)
Warning in asMethod(object): sparse->dense coercion: allocating vector of size
1.0 GiB
MGC_Markers$gene <- rownames(MGC_Markers)

2.1 Volcano Plot with MGC spots signature

EnhancedVolcano::EnhancedVolcano(MGC_Markers,
                lab = rownames(MGC_Markers),
                x = "avg_log2FC",
                y = "p_val_adj",
                title = "",
                selectLab = toupper(c("Marco",
                                      "Chit1",
                                      "Arg1",
                                      "Fbp1",
                                      "Spp1",
                                      "Chi3l1",
                                      'Fbp1',
                                      "Trem2",
                                      "Ctss",
                                      'Cd68',
                                      "Ctsb",
                                      'Ctsd',
                                      'Ctsz',
                                      'Tyrobp',
                                      'Chi3l1',
                                      'Apoe',
                                      'Dcstamp',
                                      'Mmp9')),
                xlab = bquote(~Log[2]~ "fold change"),
                ylab = bquote(~-Log[10]~adjusted~italic(P)),
                pCutoff = 0.05,
                FCcutoff = 0.25,
                colAlpha = 1,
                legendPosition = "",
                legendLabSize = 10,
                legendIconSize = 3.0,
                border = "full",
                borderColour = "black",
                gridlines.major = FALSE,
                gridlines.minor = FALSE,
                drawConnectors = TRUE,
                widthConnectors = 1,
                colConnectors = 'black',
                xlim = (0),
                ylim = c(0,400) ,
                boxedLabels = TRUE,
                labCol = 'black',
                labFace = 'bold')
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest
non-zero p-value...
Warning: Removed 1 rows containing missing values (`geom_vline()`).

#saving statistically significant genes into a csv and log2FC >= 0.25
MGC_Markers <- subset(MGC_Markers, rowSums(MGC_Markers[5] < 0.05) > 0)
MGC_Markers <- subset(MGC_Markers, MGC_Markers[2] > 0.25)

write.csv(MGC_Markers, file="Visium_MGC_Signature.csv")

2.2 Gene ontology analysis

#subset on genes with log2FC >= 1.5 for GO analysis
MGC_Markers <- subset(MGC_Markers, MGC_Markers[2] > 1.5)
#ClusterProfiler
signif_genes <- rownames(MGC_Markers)
all_genes <- rownames(Visium)
# Run GO enrichment analysis
ego <- enrichGO(gene = signif_genes,
                universe = all_genes,
                keyType = "SYMBOL",
                OrgDb = org.Hs.eg.db,
                ont = "BP",
                pAdjustMethod = "BH",
                qvalueCutoff = 0.05,
                readable = TRUE)
# Output results from GO analysis to a table
edox2 <- pairwise_termsim(ego)
p1 <- treeplot(edox2,showCategory = 75)
p1

cluster_summary <- data.frame(ego)
cluster_summary <- cluster_summary[cluster_summary$p.adjust < 0.005,]
cluster_summary <- cluster_summary[order(cluster_summary$p.adjust),]
gg1 <- ggplot(cluster_summary,
              aes(x = reorder(Description,p.adjust), y = -log10(p.adjust), size = -log10(p.adjust), fill = -log10(p.adjust))) +
  
  expand_limits(y = 1) +
  geom_point(shape = 21) +
  scale_size(range = c(2.5,12.5)) +
  scale_fill_continuous(low = 'royalblue', high = 'red4') +
  
  xlab('') + ylab('Enrichment score') +
  labs(
    title = 'GO Biological processes',
    subtitle = 'Enriched Terms',
    caption = 'Cut-off lines drawn at equivalents of p=0.05, p=0.01, p=0.001') +
  
  geom_hline(yintercept = c(-log10(0.05), -log10(0.01), -log10(0.001)),
             linetype = c("dotted", "longdash", "solid"),
             colour = c("black", "black", "black"),
             size = c(0.5, 1.5, 3)) +
  
  theme_bw(base_size = 24) +
  theme(
    legend.position = 'right',
    legend.background = element_rect(),
    plot.title = element_text(angle = 0, size = 16, face = 'bold', vjust = 1),
    plot.subtitle = element_text(angle = 0, size = 14, face = 'bold', vjust = 1),
    plot.caption = element_text(angle = 0, size = 12, face = 'bold', vjust = 1),
    
    axis.text.x = element_text(angle = 0, size = 12, face = 'bold', hjust = 1.10),
    axis.text.y = element_text(angle = 0, size = 12, face = 'bold', vjust = 0.5,color = cluster_summary$TopicNum),
    axis.title = element_text(size = 12, face = 'bold'),
    axis.title.x = element_text(size = 12, face = 'bold'),
    axis.title.y = element_text(size = 12, face = 'bold'),
    axis.line = element_line(colour = 'black'),
    
    #Legend
    legend.key = element_blank(), # removes the border
    legend.key.size = unit(1, "cm"), # Sets overall area/size of the legend
    legend.text = element_text(size = 14, face = "bold"), # Text size
    title = element_text(size = 14, face = "bold")) +
  
  coord_flip()
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
gg1

3 Integration with rpca of the different slides

#Checking for batch effects and correcting for them by integration
Visium <- SCTransform(Visium, assay = "Spatial", verbose = TRUE, method = "poisson")

Visium.list <- SplitObject(Visium, split.by = "Batch")
features <- SelectIntegrationFeatures(object.list = Visium.list, nfeatures = 3000)
Visium.list <- PrepSCTIntegration(object.list = Visium.list, anchor.features = features)
Visium.list <- lapply(X = Visium.list, FUN = RunPCA, features = features)

anchors <- FindIntegrationAnchors(object.list = Visium.list, normalization.method = "SCT",anchor.features = features, dims = 1:30, reduction = "rpca", k.anchor = 20)
Visium.combined.sct <- IntegrateData(anchorset = anchors, normalization.method = "SCT", dims = 1:30)

Visium.combined.sct <- RunPCA(Visium.combined.sct, verbose = FALSE)
Visium.combined.sct <- RunUMAP(Visium.combined.sct, reduction = "pca", dims = 1:30)
Visium.combined.sct <- FindNeighbors(Visium.combined.sct, reduction = "pca", dims = 1:30)
Visium.combined.sct <- FindClusters(Visium.combined.sct, resolution = 0.5)
# differential expression 
# find markers for every cluster compared to all remaining cells, report only the positive ones

Visium.combined.sct <- PrepSCTFindMarkers(Visium.combined.sct)

pbmc.markers <- FindAllMarkers(Visium.combined.sct, 
                               only.pos = TRUE, 
                               min.pct = 0.25, 
                               logfc.threshold = 1,
                               test.use = 'LR',
                               max.cells.per.ident = 2000)

pbmc.markers %>%
  group_by(cluster) %>%
  top_n(n = 4, wt = avg_log2FC) -> top4

DoHeatmap(Visium.combined.sct, features = top4$gene) + NoLegend()
new.cluster.ids <- c("Muscle cells","Immune cells","Muscle cells","Fibroblasts/Connective","Tumor cells","Immune cells","Tumor cells","Immune cells","Glands","Muscle cells","MGCs","Tumor cells","Tumor cells","Immune cells","Tumor cells","Muscle cells","Muscle cells","Tumor cells","Tumor cells","Tumor cells","Tumor cells","Unidentified")
names(new.cluster.ids) <- levels(Visium.combined.sct)
Visium.combined.sct <- RenameIdents(Visium.combined.sct, new.cluster.ids)
Visium.combined.sct$Clusters <- Idents(Visium.combined.sct)
Visium.combined.sct$MGC_Spot_Only <- Visium$MGC_Spot_Only
Visium.combined.sct$MGC_Spot_Only <- as.vector(Visium.combined.sct$MGC_Spot_Only)
Visium.combined.sct$MGC_Spot_Only[Visium.combined.sct$MGC_Spot_Only != 'MGC only'] <- 'NA'
Visium.combined.sct <- readRDS(file = 'Visium.combined.sct.rds')
colors <- c('Muscle cells' = "#DE9ED6",
            'Immune cells' = "#FD7446", 
            'Fibroblasts/Connective' = "#31A354",
            'Tumor cells' = "#709AE1", 
            'Glands' = "#DADAEB", 
            'MGCs'="yellow", 
            'Unidentified' = "#9EDAE5")
Idents(Visium.combined.sct) <- Visium.combined.sct$Clusters

DimPlot_scCustom(Visium.combined.sct, 
                 reduction = "umap", 
                 label = F, 
                 colors_use = colors,
                 figure_plot = T)
Warning: Removed 1 rows containing missing values (`geom_point()`).

Visium.combined.sct <- PrepSCTFindMarkers(Visium.combined.sct)
Minimum UMI unchanged. Skipping re-correction.
Visium.markers <- FindAllMarkers(Visium.combined.sct, 
                               only.pos = TRUE, 
                               min.pct = 0.25, 
                               logfc.threshold = 1,
                               test.use = 'LR')
Calculating cluster Muscle cells
Warning: The following arguments are not used: norm.method
Calculating cluster Immune cells
Warning: The following arguments are not used: norm.method
Calculating cluster Fibroblasts/Connective
Warning: The following arguments are not used: norm.method
Calculating cluster Tumor cells
Warning: The following arguments are not used: norm.method
Calculating cluster Glands
Warning: The following arguments are not used: norm.method
Calculating cluster MGCs
Warning: The following arguments are not used: norm.method
Calculating cluster Unidentified
Warning: The following arguments are not used: norm.method
write.csv(Visium.markers, 'Visium_Clusters_DEGs_LR_test_LFC_1.csv')

top5_markers <- Extract_Top_Markers(marker_dataframe = Visium.markers,
                                    num_genes = 5, 
                                    named_vector = FALSE,
                                    make_unique = TRUE)
Clustered_DotPlot(seurat_object = Visium.combined.sct, 
                  features = top5_markers)

[[1]]


[[2]]

Idents(Visium.combined.sct) <- Visium.combined.sct$MGC_Spot_Only

DimPlot_scCustom(Visium.combined.sct, 
                 reduction = "umap", 
                 label = F, 
                 figure_plot = T,
                 pt.size = 0.05,
                 colors_use = c('grey','red'))
Warning: Removed 1 rows containing missing values (`geom_point()`).

FeaturePlot_scCustom(Visium.combined.sct,'CHIT1',order = T)

NOTE: FeaturePlot_scCustom uses a specified `na_cutoff` when plotting to
color cells with no expression as background color separate from color scale.
Please ensure `na_cutoff` value is appropriate for feature being plotted.
Default setting is appropriate for use when plotting from 'RNA' assay.
When `na_cutoff` not appropriate (e.g., module scores) set to NULL to
plot all cells in gradient color palette.

-----This message will be shown once per session.-----

SpatialFeaturePlot(Visium.combined.sct, 
                   features = "CHIT1", 
                   pt.size.factor = 1.2, 
                   alpha = c(0.1, 1),
                   combine = T, 
                   ncol = 6)

SpatialDimPlot(Visium.combined.sct,images = 'slice1',pt.size.factor = 1.2, cols = colors) + NoLegend()

dittoBarPlot(Visium.combined.sct,var = 'PatientID',group.by = 'Clusters',scale = 'percent')

dittoBarPlot(Visium.combined.sct,var = 'Clusters',group.by = 'MGC_Spot_Only',scale = 'percent')

4 Focus on one slide - Enhancement with BayesSpace

BayesSpace clusters a low-dimensional representation of the gene expression matrix, incorporating a spatial prior to encourage neighboring spots to cluster together. The method can enhance the resolution of the low-dimensional representation into “sub-spots”, for which features such as gene expression or cell type composition can be imputed.

Slide_C1 <- readVisium("Slide_C1/")
set.seed(102)
Slide_C1 <- spatialPreprocess(Slide_C1, platform="Visium", 
                              n.PCs=10, n.HVGs=2000, log.normalize=T)

Slide_C1 <- qTune(Slide_C1, qs=seq(2, 30), platform="Visium", d=7)
qPlot(Slide_C1)
set.seed(149)
#q is set at the elbow of the previous plot
Slide_C1 <- spatialCluster(Slide_C1, q=9, platform="Visium", d=7,
                           init.method="mclust", model="t", gamma=2,
                           nrep=1000, burn.in=100,
                           save.chain=TRUE)

Slide_C1.enhanced <- spatialEnhance(Slide_C1, q=9, platform="Visium", d=7,
                                    model="t", gamma=2,
                                    jitter_prior=0.3, jitter_scale=3.5,
                                    nrep=500, burn.in=100,
                                    save.chain=TRUE)
saveRDS(Slide_C1,'Slide_C1.rds')
saveRDS(Slide_C1.enhanced,'Slide_C1_Enhanced.rds')
Slide_C1 <- readRDS('Slide_C1.rds')
Slide_C1.enhanced <- readRDS('Slide_C1_Enhanced.rds')
clusterPlot(Slide_C1.enhanced)

Multiple markers will be enhanced in resolution

markers <- c("CD68","CHIT1","KRT5","TREM2")
Slide_C1.enhanced <- enhanceFeatures(Slide_C1.enhanced, Slide_C1,
                                     feature_names=markers,
                                     nrounds=0)
purrr::map(markers, function(x) featurePlot(Slide_C1.enhanced, x))
[[1]]


[[2]]


[[3]]


[[4]]

5 Session Info

# Print session info
sessioninfo::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.2.1 (2022-06-23)
 os       macOS Big Sur ... 10.16
 system   x86_64, darwin17.0
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       Europe/Paris
 date     2024-01-22
 pandoc   3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package              * version    date (UTC) lib source
 abind                  1.4-5      2016-07-21 [1] CRAN (R 4.2.0)
 AnnotationDbi        * 1.58.0     2022-04-26 [1] Bioconductor
 ape                    5.7-1      2023-03-13 [1] CRAN (R 4.2.0)
 aplot                  0.1.10     2023-03-08 [1] CRAN (R 4.2.0)
 assertthat             0.2.1      2019-03-21 [1] CRAN (R 4.2.0)
 backports              1.4.1      2021-12-13 [1] CRAN (R 4.2.0)
 BayesSpace           * 1.6.0      2022-04-26 [1] Bioconductor
 beachmat               2.14.0     2022-11-01 [1] Bioconductor
 beeswarm               0.4.0      2021-06-01 [1] CRAN (R 4.2.0)
 Biobase              * 2.58.0     2022-11-01 [1] Bioconductor
 BiocFileCache          2.4.0      2022-04-26 [1] Bioconductor
 BiocGenerics         * 0.44.0     2022-11-01 [1] Bioconductor
 BiocNeighbors          1.16.0     2022-11-01 [1] Bioconductor
 BiocParallel           1.32.5     2022-12-23 [1] Bioconductor
 BiocSingular           1.14.0     2022-11-01 [1] Bioconductor
 Biostrings             2.64.1     2022-08-18 [1] Bioconductor
 bit                    4.0.5      2022-11-15 [1] CRAN (R 4.2.0)
 bit64                  4.0.5      2020-08-30 [1] CRAN (R 4.2.0)
 bitops                 1.0-7      2021-04-24 [1] CRAN (R 4.2.0)
 blob                   1.2.4      2023-03-17 [1] CRAN (R 4.2.0)
 bluster                1.6.0      2022-04-26 [1] Bioconductor
 broom                  1.0.5      2023-06-09 [1] CRAN (R 4.2.0)
 cachem                 1.0.8      2023-05-01 [1] CRAN (R 4.2.0)
 car                    3.1-2      2023-03-30 [1] CRAN (R 4.2.0)
 carData                3.0-5      2022-01-06 [1] CRAN (R 4.2.0)
 circlize               0.4.15     2022-05-10 [1] CRAN (R 4.2.0)
 cli                    3.6.1      2023-03-23 [1] CRAN (R 4.2.0)
 clue                   0.3-64     2023-01-31 [1] CRAN (R 4.2.0)
 cluster                2.1.4      2022-08-22 [1] CRAN (R 4.2.0)
 clusterProfiler      * 4.4.4      2022-06-21 [1] Bioconductor
 coda                   0.19-4     2020-09-30 [1] CRAN (R 4.2.0)
 codetools              0.2-19     2023-02-01 [1] CRAN (R 4.2.0)
 colorspace             2.1-0      2023-01-23 [1] CRAN (R 4.2.0)
 ComplexHeatmap         2.14.0     2022-11-01 [1] Bioconductor
 cowplot                1.1.1      2020-12-30 [1] CRAN (R 4.2.0)
 crayon                 1.5.2      2022-09-29 [1] CRAN (R 4.2.0)
 curl                   5.0.1      2023-06-07 [1] CRAN (R 4.2.0)
 data.table             1.14.8     2023-02-17 [1] CRAN (R 4.2.0)
 DBI                    1.1.3      2022-06-18 [1] CRAN (R 4.2.0)
 dbplyr                 2.3.2      2023-03-21 [1] CRAN (R 4.2.0)
 DelayedArray           0.24.0     2022-11-01 [1] Bioconductor
 DelayedMatrixStats     1.20.0     2022-11-01 [1] Bioconductor
 deldir                 1.0-9      2023-05-17 [1] CRAN (R 4.2.0)
 digest                 0.6.32     2023-06-26 [1] CRAN (R 4.2.0)
 DirichletReg           0.7-1      2021-05-18 [1] CRAN (R 4.2.0)
 dittoSeq             * 1.8.1      2022-06-02 [1] Bioconductor
 DO.db                  2.9        2022-10-07 [1] Bioconductor
 doParallel             1.0.17     2022-02-07 [1] CRAN (R 4.2.0)
 DOSE                 * 3.22.1     2022-08-30 [1] Bioconductor
 downloader             0.4        2015-07-09 [1] CRAN (R 4.2.0)
 dplyr                * 1.1.2      2023-04-20 [1] CRAN (R 4.2.0)
 dqrng                  0.3.0      2021-05-01 [1] CRAN (R 4.2.0)
 edgeR                  3.40.2     2023-01-19 [1] Bioconductor
 ellipsis               0.3.2      2021-04-29 [1] CRAN (R 4.2.0)
 EnhancedVolcano        1.14.0     2022-04-26 [1] Bioconductor
 enrichplot           * 1.16.2     2022-08-30 [1] Bioconductor
 evaluate               0.21       2023-05-05 [1] CRAN (R 4.2.0)
 fansi                  1.0.4      2023-01-22 [1] CRAN (R 4.2.1)
 farver                 2.1.1      2022-07-06 [1] CRAN (R 4.2.0)
 fastmap                1.1.1      2023-02-24 [1] CRAN (R 4.2.0)
 fastmatch              1.1-3      2021-07-23 [1] CRAN (R 4.2.0)
 fgsea                  1.22.0     2022-04-26 [1] Bioconductor
 filelock               1.0.2      2018-10-05 [1] CRAN (R 4.2.0)
 fitdistrplus           1.1-11     2023-04-25 [1] CRAN (R 4.2.0)
 forcats                1.0.0      2023-01-29 [1] CRAN (R 4.2.0)
 foreach                1.5.2      2022-02-02 [1] CRAN (R 4.2.0)
 Formula                1.2-5      2023-02-24 [1] CRAN (R 4.2.1)
 future                 1.33.0     2023-07-01 [1] CRAN (R 4.2.0)
 future.apply           1.11.0     2023-05-21 [1] CRAN (R 4.2.0)
 generics               0.1.3      2022-07-05 [1] CRAN (R 4.2.0)
 GenomeInfoDb         * 1.34.9     2023-02-02 [1] Bioconductor
 GenomeInfoDbData       1.2.9      2023-02-27 [1] Bioconductor
 GenomicRanges        * 1.50.2     2022-12-16 [1] Bioconductor
 GetoptLong             1.0.5      2020-12-15 [1] CRAN (R 4.2.0)
 ggbeeswarm             0.7.2      2023-04-29 [1] CRAN (R 4.2.0)
 ggforce                0.4.1      2022-10-04 [1] CRAN (R 4.2.0)
 ggfun                  0.1.1      2023-06-24 [1] CRAN (R 4.2.0)
 ggnewscale             0.4.9      2023-05-25 [1] CRAN (R 4.2.0)
 ggplot2              * 3.4.3      2023-08-14 [1] CRAN (R 4.2.1)
 ggplotify              0.1.1      2023-06-27 [1] CRAN (R 4.2.0)
 ggprism                1.0.4      2022-11-04 [1] CRAN (R 4.2.1)
 ggpubr               * 0.6.0      2023-02-10 [1] CRAN (R 4.2.0)
 ggraph                 2.1.0      2022-10-09 [1] CRAN (R 4.2.1)
 ggrastr                1.0.2      2023-06-01 [1] CRAN (R 4.2.0)
 ggrepel                0.9.3      2023-02-03 [1] CRAN (R 4.2.0)
 ggridges               0.5.4      2022-09-26 [1] CRAN (R 4.2.0)
 ggsignif               0.6.4      2022-10-13 [1] CRAN (R 4.2.1)
 ggtree                 3.4.4      2022-09-27 [1] Bioconductor
 GlobalOptions          0.1.2      2020-06-10 [1] CRAN (R 4.2.0)
 globals                0.16.2     2022-11-21 [1] CRAN (R 4.2.0)
 glue                   1.6.2      2022-02-24 [1] CRAN (R 4.2.0)
 GO.db                  3.15.0     2022-10-07 [1] Bioconductor
 goftest                1.2-3      2021-10-07 [1] CRAN (R 4.2.0)
 GOSemSim               2.22.0     2022-04-26 [1] Bioconductor
 graph                  1.76.0     2022-11-01 [1] Bioconductor
 graphite               1.42.0     2022-04-26 [1] Bioconductor
 graphlayouts           1.0.0      2023-05-01 [1] CRAN (R 4.2.0)
 gridExtra              2.3        2017-09-09 [1] CRAN (R 4.2.0)
 gridGraphics           0.5-1      2020-12-13 [1] CRAN (R 4.2.0)
 gtable                 0.3.4      2023-08-21 [1] CRAN (R 4.2.1)
 hdf5r                  1.3.8      2023-01-21 [1] CRAN (R 4.2.0)
 htmltools              0.5.5      2023-03-23 [1] CRAN (R 4.2.0)
 htmlwidgets            1.6.2      2023-03-17 [1] CRAN (R 4.2.0)
 httpuv                 1.6.11     2023-05-11 [1] CRAN (R 4.2.0)
 httr                   1.4.6      2023-05-08 [1] CRAN (R 4.2.0)
 ica                    1.0-3      2022-07-08 [1] CRAN (R 4.2.0)
 igraph                 1.5.0      2023-06-16 [1] CRAN (R 4.2.0)
 IRanges              * 2.32.0     2022-11-01 [1] Bioconductor
 irlba                  2.3.5.1    2022-10-03 [1] CRAN (R 4.2.0)
 iterators              1.0.14     2022-02-05 [1] CRAN (R 4.2.0)
 janitor                2.2.0      2023-02-02 [1] CRAN (R 4.2.0)
 jsonlite               1.8.7      2023-06-29 [1] CRAN (R 4.2.0)
 KEGGREST               1.36.3     2022-07-14 [1] Bioconductor
 KernSmooth             2.23-21    2023-05-03 [1] CRAN (R 4.2.0)
 knitr                  1.43       2023-05-25 [1] CRAN (R 4.2.0)
 labeling               0.4.3      2023-08-29 [1] CRAN (R 4.2.1)
 later                  1.3.1      2023-05-02 [1] CRAN (R 4.2.0)
 lattice                0.21-8     2023-04-05 [1] CRAN (R 4.2.0)
 lazyeval               0.2.2      2019-03-15 [1] CRAN (R 4.2.0)
 leiden                 0.4.3      2022-09-10 [1] CRAN (R 4.2.0)
 lifecycle              1.0.3      2022-10-07 [1] CRAN (R 4.2.1)
 limma                  3.54.2     2023-02-28 [1] Bioconductor
 listenv                0.9.0      2022-12-16 [1] CRAN (R 4.2.0)
 lmtest                 0.9-40     2022-03-21 [1] CRAN (R 4.2.0)
 locfit                 1.5-9.8    2023-06-11 [1] CRAN (R 4.2.0)
 lubridate              1.9.2      2023-02-10 [1] CRAN (R 4.2.0)
 magick                 2.7.4      2023-03-09 [1] CRAN (R 4.2.0)
 magrittr               2.0.3      2022-03-30 [1] CRAN (R 4.2.0)
 MASS                   7.3-60     2023-05-04 [1] CRAN (R 4.2.0)
 Matrix               * 1.5-4.1    2023-05-18 [1] CRAN (R 4.2.0)
 MatrixGenerics       * 1.10.0     2022-11-01 [1] Bioconductor
 matrixStats          * 1.0.0      2023-06-02 [1] CRAN (R 4.2.0)
 maxLik                 1.5-2      2021-07-26 [1] CRAN (R 4.2.0)
 mclust                 6.0.0      2022-10-31 [1] CRAN (R 4.2.0)
 memoise                2.0.1      2021-11-26 [1] CRAN (R 4.2.0)
 metapod                1.4.0      2022-04-26 [1] Bioconductor
 mime                   0.12       2021-09-28 [1] CRAN (R 4.2.0)
 miniUI                 0.1.1.1    2018-05-18 [1] CRAN (R 4.2.0)
 miscTools              0.6-28     2023-05-03 [1] CRAN (R 4.2.0)
 munsell                0.5.0      2018-06-12 [1] CRAN (R 4.2.0)
 nlme                   3.1-162    2023-01-31 [1] CRAN (R 4.2.0)
 org.Hs.eg.db         * 3.15.0     2022-10-07 [1] Bioconductor
 org.Mm.eg.db           3.15.0     2022-10-07 [1] Bioconductor
 paletteer              1.5.0      2022-10-19 [1] CRAN (R 4.2.0)
 parallelly             1.36.0     2023-05-26 [1] CRAN (R 4.2.0)
 patchwork            * 1.1.2      2022-08-19 [1] CRAN (R 4.2.0)
 pbapply                1.7-2      2023-06-27 [1] CRAN (R 4.2.0)
 pheatmap               1.0.12     2019-01-04 [1] CRAN (R 4.2.0)
 pillar                 1.9.0      2023-03-22 [1] CRAN (R 4.2.0)
 pkgconfig              2.0.3      2019-09-22 [1] CRAN (R 4.2.0)
 plotly                 4.10.2     2023-06-03 [1] CRAN (R 4.2.0)
 plyr                   1.8.8      2022-11-11 [1] CRAN (R 4.2.0)
 png                    0.1-8      2022-11-29 [1] CRAN (R 4.2.0)
 polyclip               1.10-4     2022-10-20 [1] CRAN (R 4.2.0)
 prismatic              1.1.1      2022-08-15 [1] CRAN (R 4.2.0)
 progressr              0.13.0     2023-01-10 [1] CRAN (R 4.2.1)
 promises               1.2.0.1    2021-02-11 [1] CRAN (R 4.2.0)
 purrr                  1.0.1      2023-01-10 [1] CRAN (R 4.2.0)
 qvalue                 2.30.0     2022-11-01 [1] Bioconductor
 R6                     2.5.1      2021-08-19 [1] CRAN (R 4.2.0)
 RANN                   2.6.1      2019-01-08 [1] CRAN (R 4.2.0)
 rappdirs               0.3.3      2021-01-31 [1] CRAN (R 4.2.0)
 RColorBrewer           1.1-3      2022-04-03 [1] CRAN (R 4.2.0)
 Rcpp                   1.0.11     2023-07-06 [1] CRAN (R 4.2.1)
 RcppAnnoy              0.0.21     2023-07-02 [1] CRAN (R 4.2.0)
 RCurl                  1.98-1.12  2023-03-27 [1] CRAN (R 4.2.0)
 reactome.db            1.81.0     2022-10-14 [1] Bioconductor
 ReactomePA           * 1.40.0     2022-04-26 [1] Bioconductor
 rematch2               2.1.2      2020-05-01 [1] CRAN (R 4.2.0)
 reshape2               1.4.4      2020-04-09 [1] CRAN (R 4.2.0)
 reticulate             1.32.0     2023-09-11 [1] CRAN (R 4.2.1)
 rhdf5                  2.40.0     2022-04-26 [1] Bioconductor
 rhdf5filters           1.8.0      2022-04-26 [1] Bioconductor
 Rhdf5lib               1.20.0     2022-11-01 [1] Bioconductor
 rjson                  0.2.21     2022-01-09 [1] CRAN (R 4.2.0)
 rlang                  1.1.1      2023-04-28 [1] CRAN (R 4.2.0)
 rmarkdown              2.23       2023-07-01 [1] CRAN (R 4.2.0)
 ROCR                   1.0-11     2020-05-02 [1] CRAN (R 4.2.0)
 RSQLite                2.3.1      2023-04-03 [1] CRAN (R 4.2.0)
 rstatix                0.7.2      2023-02-01 [1] CRAN (R 4.2.0)
 rstudioapi             0.14       2022-08-22 [1] CRAN (R 4.2.0)
 rsvd                   1.0.5      2021-04-16 [1] CRAN (R 4.2.0)
 Rtsne                  0.16       2022-04-17 [1] CRAN (R 4.2.0)
 S4Vectors            * 0.36.2     2023-02-26 [1] Bioconductor
 sandwich               3.0-2      2022-06-15 [1] CRAN (R 4.2.0)
 ScaledMatrix           1.6.0      2022-11-01 [1] Bioconductor
 scales                 1.2.1      2022-08-20 [1] CRAN (R 4.2.0)
 scater                 1.26.1     2022-11-13 [1] Bioconductor
 scattermore            1.2        2023-06-12 [1] CRAN (R 4.2.0)
 scatterpie             0.2.1      2023-06-07 [1] CRAN (R 4.2.0)
 scCustomize          * 1.1.1      2023-01-13 [1] CRAN (R 4.2.0)
 scran                  1.24.1     2022-09-11 [1] Bioconductor
 sctransform            0.3.5      2022-09-21 [1] CRAN (R 4.2.0)
 scuttle                1.8.4      2023-01-19 [1] Bioconductor
 sessioninfo            1.2.2      2021-12-06 [1] CRAN (R 4.2.0)
 Seurat               * 4.3.0.9001 2023-02-22 [1] Github (satijalab/seurat@54e2fe5)
 SeuratObject         * 4.1.3      2022-11-07 [1] CRAN (R 4.2.0)
 shadowtext             0.1.2      2022-04-22 [1] CRAN (R 4.2.0)
 shape                  1.4.6      2021-05-19 [1] CRAN (R 4.2.0)
 shiny                  1.7.4      2022-12-15 [1] CRAN (R 4.2.0)
 SingleCellExperiment * 1.20.0     2022-11-01 [1] Bioconductor
 snakecase              0.11.0     2019-05-25 [1] CRAN (R 4.2.0)
 sp                     2.0-0      2023-06-22 [1] CRAN (R 4.2.0)
 sparseMatrixStats      1.10.0     2022-11-01 [1] Bioconductor
 spatstat.data          3.0-1      2023-03-12 [1] CRAN (R 4.2.0)
 spatstat.explore       3.2-1      2023-05-13 [1] CRAN (R 4.2.0)
 spatstat.geom          3.2-1      2023-05-09 [1] CRAN (R 4.2.0)
 spatstat.random        3.1-5      2023-05-11 [1] CRAN (R 4.2.0)
 spatstat.sparse        3.0-2      2023-06-25 [1] CRAN (R 4.2.0)
 spatstat.utils         3.0-3      2023-05-09 [1] CRAN (R 4.2.0)
 speckle              * 0.0.3      2022-10-07 [1] Github (Oshlack/speckle@83df3e9)
 statmod                1.5.0      2023-01-06 [1] CRAN (R 4.2.0)
 stringi                1.7.12     2023-01-11 [1] CRAN (R 4.2.0)
 stringr                1.5.0      2022-12-02 [1] CRAN (R 4.2.0)
 SummarizedExperiment * 1.28.0     2022-11-01 [1] Bioconductor
 survival               3.5-5      2023-03-12 [1] CRAN (R 4.2.0)
 tensor                 1.5        2012-05-05 [1] CRAN (R 4.2.0)
 tibble                 3.2.1      2023-03-20 [1] CRAN (R 4.2.0)
 tidygraph              1.2.3      2023-02-01 [1] CRAN (R 4.2.0)
 tidyr                  1.3.0      2023-01-24 [1] CRAN (R 4.2.0)
 tidyselect             1.2.0      2022-10-10 [1] CRAN (R 4.2.1)
 tidytree               0.4.2      2022-12-18 [1] CRAN (R 4.2.0)
 timechange             0.2.0      2023-01-11 [1] CRAN (R 4.2.0)
 treeio                 1.20.2     2022-08-14 [1] Bioconductor
 tweenr                 2.0.2      2022-09-06 [1] CRAN (R 4.2.0)
 utf8                   1.2.3      2023-01-31 [1] CRAN (R 4.2.0)
 uwot                   0.1.16     2023-06-29 [1] CRAN (R 4.2.0)
 vctrs                  0.6.3      2023-06-14 [1] CRAN (R 4.2.0)
 vipor                  0.4.5      2017-03-22 [1] CRAN (R 4.2.0)
 viridis                0.6.3      2023-05-03 [1] CRAN (R 4.2.0)
 viridisLite            0.4.2      2023-05-02 [1] CRAN (R 4.2.0)
 withr                  2.5.1      2023-09-26 [1] CRAN (R 4.2.1)
 xfun                   0.39       2023-04-20 [1] CRAN (R 4.2.0)
 xgboost                1.7.5.1    2023-03-30 [1] CRAN (R 4.2.0)
 xtable                 1.8-4      2019-04-21 [1] CRAN (R 4.2.0)
 XVector                0.38.0     2022-11-01 [1] Bioconductor
 yaml                   2.3.7      2023-01-23 [1] CRAN (R 4.2.0)
 yulab.utils            0.0.6      2022-12-20 [1] CRAN (R 4.2.0)
 zlibbioc               1.44.0     2022-11-01 [1] Bioconductor
 zoo                    1.8-12     2023-04-13 [1] CRAN (R 4.2.0)

 [1] /Library/Frameworks/R.framework/Versions/4.2/Resources/library

──────────────────────────────────────────────────────────────────────────────