1 Load data

library(scater)
library(scran)
library(tidyverse)
library(patchwork)

Re-run scoreMarkers on the clustered data.

sce <- readRDS("R_objects/Caron_clustered.500.rds")
markers <- scoreMarkers(sce, 
                        groups = sce$label, 
                        block = sce$SampleName)

2 Cell Type Labelling

One of the main tasks we often want to perform is annotating our cells as known types of cells ocurring in our sampled tissue. This requires prior knowledge of cell transcriptomic states and therefore becomes easier if there are well-curated resources available. However, for less well-studied tissues these may not be available and so cell type annotation may rely on “manual annotation” using a small set of genes with known cell-specific expression (e.g. from microscopy data, qPCR on cell-sorted samples, etc.).

In this section we will do a very simple manual labelling of our clusters, based on known genes expressed in different blood cell types. However, there are more systematic methods for cell type annotation, in particular when prior information is available for those cells:

  • The SingleR package uses previously labelled bulk or single-cell datasets to annotate a new dataset.
  • The AUCcell package classifies cells into types based on user-provided lists of “signature” genes for each type. These lists can be generated from literature, or also be based on prior RNA-seq datasets.
  • Another strategy is to perform a standard gene set enrichment analysis on the top marker genes for each cluster.

Any of these approaches is suitable, and they can often be done in conjunction. To learn more about these approaches, read the chapter on cell type annotation in the OSCA book.

2.1 Manual annotation

A lot is known about immune cell markers, in particular as many surface markers have been identified as useful for immunophenotyping.

To help us in our annotation, we start by retrieving the top-ranked genes from each cluster into a list. We do this by looping through the list using the lapply() function and in each case picking the genes with rank < 10 for Cohen’s D statistic:

top_markers_all <- lapply(markers, function(x){
  x %>% 
    as.data.frame() %>% 
    filter(rank.logFC.cohen < 10) %>% 
    rownames()
})

top_markers_all
## $`1`
##  [1] "STMN1"           "LAPTM5"          "DPYD"            "RPS27"          
##  [5] "RCSD1"           "ZFP36L2"         "ENSG00000229839" "TMSB10"         
##  [9] "PTMA"            "FHIT"            "MME"             "RPL34"          
## [13] "RPS3A"           "SSBP2"           "MEF2C"           "CD74"           
## [17] "EBF1"            "SOX4"            "HLA-E"           "AIF1"           
## [21] "HLA-DRA"         "HLA-DRB1"        "HLA-DPA1"        "HLA-DPB1"       
## [25] "CD24"            "ENSG00000287092" "AUTS2"           "CDK6"           
## [29] "KMT2E"           "RPS6"            "APBB1IP"         "LINC01374"      
## [33] "DNTT"            "RPS3"            "GAPDH"           "ARHGDIB"        
## [37] "SOCS2"           "RPL21"           "FOXO1"           "FOXN3"          
## [41] "RPS2"            "RPS15A"          "PRKCB"           "TERF2"          
## [45] "RPL13"           "SNHG29"          "RPL23A"          "MSI2"           
## [49] "RPL17"           "RPS19"           "FTL"             "RPL13A"         
## [53] "PLCB1"           "ERG"             "XBP1"            "CD99"           
## [57] "TMSB4X"         
## 
## $`2`
##  [1] "STMN1"   "HMGN2"   "RCSD1"   "YWHAQ"   "TMSB10"  "PTMA"    "TRA2B"  
##  [8] "H2AZ1"   "RPS3A"   "HMGB2"   "SSBP2"   "CD74"    "EBF1"    "TUBB"   
## [15] "HLA-DRA" "BACH2"   "CD24"    "AKAP12"  "AUTS2"   "MCM7"    "STRBP"  
## [22] "SET"     "VIM"     "CFL1"    "RPS3"    "GAPDH"   "TUBA1B"  "NAP1L1" 
## [29] "HMGB1"   "IGHM"    "PCLAF"   "KPNB1"   "ACTG1"   "TYMS"    "UHRF1"  
## [36] "HMGN1"   "IGLL1"   "TMSB4X" 
## 
## $`3`
##  [1] "RCSD1"      "ARHGAP15"   "FOXP1"      "CBLB"       "ZBTB20"    
##  [6] "MME"        "PDS5A"      "LEF1"       "GAB1"       "SSBP2"     
## [11] "MEF2C"      "CD74"       "EBF1"       "STK10"      "CASC15"    
## [16] "CD2AP"      "AKAP12"     "AUTS2"      "CALN1"      "KMT2E"     
## [21] "LINC-PINT"  "PSD3"       "PAG1"       "UBR5"       "ST3GAL1"   
## [26] "DOCK8"      "CEMIP2"     "HBB"        "MALAT1"     "FCHSD2"    
## [31] "GAB2"       "MAML2"      "PAN3"       "FOXO1"      "ARHGEF7"   
## [36] "INO80"      "RAB11A"     "ARIH1"      "MSI2"       "CYTH1"     
## [41] "RNF125"     "TCF4"       "GNG7"       "INSR"       "ZNF350-AS1"
## [46] "LARGE1"     "MT-ND2"     "MT-CO1"     "MT-CO3"     "MT-ND3"    
## [51] "MT-CYB"    
## 
## $`4`
##  [1] "CD52"     "RPS27"    "FCRL1"    "RALGPS2"  "ANGPTL1"  "TMSB10"  
##  [7] "AFF3"     "ARHGAP15" "BANK1"    "RPL34"    "RPS3A"    "CD74"    
## [13] "HLA-DRA"  "HLA-DRB1" "HLA-DQB1" "HLA-DPA1" "HLA-DPB1" "RPS18"   
## [19] "BACH2"    "ADK"      "MS4A1"    "MALAT1"   "FCHSD2"   "RPL41"   
## [25] "BTG1"     "RPL21"    "RPS29"    "IGHD"     "IGHM"     "RPS2"    
## [31] "PRKCB"    "RPL13"    "RPL26"    "RPL18A"   "CD79A"    "FTL"     
## [37] "CD37"     "RPS5"     "TMSB4X"   "RPL39"   
## 
## $`5`
##  [1] "RPS27"     "PTPRC"     "TMSB10"    "ARHGAP15"  "ANKRD44"   "RPL32"    
##  [7] "FOXP1"     "LEF1"      "RPL34"     "RPS3A"     "FYB1"      "CAMK4"    
## [13] "RPS14"     "LTB"       "RPS18"     "BACH2"     "LINC-PINT" "RPL7"     
## [19] "RPS6"      "IFITM1"    "RPLP2"     "MALAT1"    "MAML2"     "CD3E"     
## [25] "CD3D"      "RPL41"     "BTG1"      "RPL21"     "KLF12"     "TRAC"     
## [31] "RPS29"     "PRKCH"     "BCL11B"    "B2M"       "RPS2"      "IL32"     
## [37] "RPL13"     "RPL26"     "SKAP1"     "RPS15"     "RPS28"     "RPS5"     
## [43] "TMSB4X"    "RPL10"    
## 
## $`6`
##  [1] "CD52"      "S100A4"    "CD247"     "PTPRC"     "DUSP2"     "RPL31"    
##  [7] "ARHGAP15"  "CNOT6L"    "RPL34"     "RPS3A"     "GZMA"      "RPS14"    
## [13] "HLA-A"     "HLA-B"     "FYN"       "TNFAIP3"   "KMT2E"     "LINC-PINT"
## [19] "TRBC1"     "SRGN"      "IFITM1"    "CD3E"      "CD3D"      "CD69"     
## [25] "KLRD1"     "PRKCH"     "B2M"       "RPS2"      "IL32"      "CCL5"     
## [31] "SKAP1"     "PITPNC1"   "RPS28"     "MYO1F"     "HCST"      "NKG7"     
## [37] "CST7"      "ITGB2"     "TMSB4X"    "RPL10"    
## 
## $`7`
##  [1] "MACO1"    "TRIM58"   "SEC62"    "RAPGEF2"  "RHAG"     "MAN1A1"  
##  [7] "ARL4A"    "BPGM"     "SLC25A37" "BNIP3L"   "CA1"      "IFIT1B"  
## [13] "HBB"      "HBD"      "MALAT1"   "HMBS"     "HECTD4"   "HERC1"   
## [19] "DENND4A"  "HBM"      "HBA2"     "HBA1"     "AHSP"     "TERF2IP" 
## [25] "SPECC1"   "SLC4A1"   "SLC25A39" "BLVRB"    "ALAS2"   
## 
## $`8`
##  [1] "YBX1"     "UROD"     "NFIA"     "NUCKS1"   "LBR"      "GYPC"    
##  [7] "SMC4"     "HMGB2"    "DEK"      "TUBB"     "ANK1"     "CA1"     
## [13] "CA2"      "SMC2"     "HBB"      "HBD"      "FTH1"     "TUBA1B"  
## [19] "HMGB1"    "TFDP1"    "SLC25A21" "NUSAP1"   "PRC1"     "HBA2"    
## [25] "HBA1"     "AHSP"     "TOP2A"    "PRDX2"    "UBA52"    "BLVRB"   
## [31] "FTL"      "ATP5F1E"  "ALAS2"   
## 
## $`9`
##  [1] "SEC62"    "SNCA"     "RPS12"    "SLC25A37" "BNIP3L"   "NCOA4"   
##  [7] "HBB"      "HBD"      "IFI27"    "HBA2"     "HBA1"     "AHSP"    
## [13] "UBB"      "OAZ1"     "UBA52"    "ATP5F1E"  "ALAS2"   
## 
## $`10`
##  [1] "S100A11"         "S100A9"          "S100A6"          "S100A4"         
##  [5] "MNDA"            "FCER1G"          "TMSB10"          "LRRFIP1"        
##  [9] "CSTA"            "RPS3A"           "ARHGAP26"        "LST1"           
## [13] "AIF1"            "ACTB"            "SNX10"           "LYN"            
## [17] "RPL7"            "VIM"             "SRGN"            "GAPDH"          
## [21] "LYZ"             "ENSG00000257764" "RPS2"            "COTL1"          
## [25] "CYBA"            "RPS28"           "TYROBP"          "FTL"            
## [29] "CST3"            "LGALS1"          "TMSB4X"         
## 
## $`11`
##  [1] "STMN1"   "RPS27"   "PRKCE"   "TMSB10"  "AFF3"    "RPL31"   "ZEB2"   
##  [8] "PTMA"    "MME"     "CD38"    "ATP8A1"  "RPL34"   "RPS3A"   "PDE4D"  
## [15] "CD74"    "CYFIP2"  "EBF1"    "SOX4"    "HLA-DRA" "BACH2"   "PAX5"   
## [22] "SYK"     "RPS24"   "MALAT1"  "BCL7A"   "RUBCNL"  "PCDH9"   "TCL1A"  
## [29] "IGHM"    "B2M"     "ARIH1"   "ACSM3"   "PRKCB"   "CD79B"   "RPS28"  
## [36] "NIBAN3"  "CD37"    "RPL13A"  "IGLL5"   "VPREB3"  "RPL10"  
## 
## $`12`
##  [1] "YBX1"            "BCL11A"          "RPL31"           "BARD1"          
##  [5] "ITM2C"           "RBM47"           "JCHAIN"          "RUFY3"          
##  [9] "PLAC8"           "FHIP1A"          "CD74"            "HLA-DRA"        
## [13] "RUNX2"           "SNX9"            "LYN"             "COX6C"          
## [17] "ENSG00000225885" "GNAQ"            "TXN"             "IRF7"           
## [21] "FCHSD2"          "RPS25"           "CD4"             "C12orf75"       
## [25] "SLC15A4"         "FLT3"            "ALOX5AP"         "RNASE6"         
## [29] "IRF8"            "P4HB"            "MYL12B"          "TCF4"           
## [33] "PTPRS"           "RPS28"           "LILRA4"          "APP"            
## [37] "CSF2RA"          "PLP2"

If we took some time to examine this list (which would benefit from knowing about the underlying biology of the immune system), we can start to see some genes known to differentiate different types of cells:

  • HBA1 and HBA2 → expressed in red blood cells (erythrocytes)
  • CST3 → specific to monocytes
  • CD3E and CD3D → specific to T cells
  • NKG7 → specific to natural killer (NK) T cells
  • CD79A and CD24 → specific to B cells
  • MS4A1 (CD20) → a clinically-important antigen used as a target to treat B cell-related diseases, such as leukemia. Cells with this antigen are referred to as CD20+ B cells.

Let’s visualise these markers’ expression in our clusters:

known_genes <- c(
  "HBA1", # erythrocytes
  "CST3", # monocytes
  "CD3E", # T cells
  "NKG7", # NK T cells
  "CD79A",  # B cells
  "MS4A1" # CD20 B cells
  )

# violin plot
plotExpression(sce, x = "label", features = known_genes)

# scaled heatmap of expression
plotGroupedHeatmap(sce, 
                   features = known_genes,
                   group = "label",
                   block = "SampleGroup", 
                   scale = TRUE, center = TRUE, 
                   zlim = c(-3, 3))

Based on the expression patterns for these cells, we classify these clusters as follows:

Cluster Labelled Cell Type Evidence
1 B cells CD79A
2 B cells CD79A
3 B cells CD79A
4 B cells CD79A
5 CD20+ B cells CD79A + MS4A1
6 T cells CD3D
7 NK T cells CD3D + NKG7
8 Erythrocytes HBA1
9 Erythrocytes HBA1
10 Erythrocytes HBA1
11 Monocytes CST3
12 B cells CD79A

Now that we have a more meaningful annotation for our clusters, let’s add this to our SingleCellExperiment object. We will also add the original cluster ID in parenthesis to remind ourselves that this annotation was done based on the clusters.

The cell labels are stored in the SingleCellExperiment object as a factor (a type of object in R to store categorical data), and so we can change the labels using the levels() function, like so:

levels(colLabels(sce)) <- c("B (c1)", "B (c2)", 
                            "B (c3)", "B (c4)",
                            "CD20+ B (c5)", 
                            "T (c6)", "NK T (c7)", 
                            "Erythrocytes (c8)", "Erythrocytes (c9)", 
                            "Erythrocytes c(10)",
                            "Monocytes (c11)", "B (c12)")

Now, when we label our UMAP, we can see the new labels, which are more intutitive to interpret:

plotReducedDim(sce, dimred = "UMAP_corrected", 
               colour_by = "label", text_by = "label")

2.2 (Bonus) Further exploration

2.2.1 Erythrocytes

Looking at the expression of HBA1 and HBA2:

plotExpression(sce, x = "label", features = c("HBA1", "HBA2")) +
  scale_x_discrete(guide = guide_axis(angle = 45))

You may notice that there is a lot of background expression across several cell clusters. HBA1 and HBA2 are common components of the “soup” or ambient RNA in scRNA-seq experiments involving blood cells. Hemoglobin chains, such as HBA1 and HBA2, are very highly expressed in red blood cells and burst red blood cells will contribute their RNA to the medium from which the cells are loaded into the 10X Chromium machine. Some of this medium, or “soup”, containing ambient RNA is captured with each cell. There are methods available to correct for soup in your analysis such as SoupX.

2.2.2 B Cells

Our simple manual annotation wasn’t very conclusive about cluster 12. While it expresses the CD79A B-cell marker, it also appears to be quite separate from other B-cell clusters on our UMAP.

plotReducedDim(sce, dimred = "UMAP_corrected", 
               colour_by = "CD79A", text_by = "label")

This is also the case for cluster 5, however we could see that it likely represents CD20+ B-cells, which explains its separate clustering. However, we didn’t have any specific gene in our small list that distinguishes cluster 12 from the other B-cell clusters.

We could look at our list of top markers and identify any that are unique to this cluster:

setdiff(top_markers_all[[12]], unlist(top_markers_all[1:11]))
##  [1] "BCL11A"          "BARD1"           "ITM2C"           "RBM47"          
##  [5] "JCHAIN"          "RUFY3"           "PLAC8"           "FHIP1A"         
##  [9] "RUNX2"           "SNX9"            "COX6C"           "ENSG00000225885"
## [13] "GNAQ"            "TXN"             "IRF7"            "RPS25"          
## [17] "CD4"             "C12orf75"        "SLC15A4"         "FLT3"           
## [21] "ALOX5AP"         "RNASE6"          "IRF8"            "P4HB"           
## [25] "MYL12B"          "PTPRS"           "LILRA4"          "APP"            
## [29] "CSF2RA"          "PLP2"

And use this list to further investigate the specific properties of this cluster. For example, we can see that CD38 (another “cluster of differentiation” gene) is expressed highly in this cluster:

plotExpression(sce, x = "label", 
               features = "CD38") +
  scale_x_discrete(guide = guide_axis(angle = 45))

One thing to note is that this cluster only seems to contain cells from PBMMC samples:

table(sce$SampleGroup, sce$label)
##             
##              B (c1) B (c2) B (c3) B (c4) CD20+ B (c5) T (c6) NK T (c7)
##   ETV6-RUNX1   1188    284     49     71          218     38        56
##   PBMMC         106    132      9    138          296    103        62
##             
##              Erythrocytes (c8) Erythrocytes (c9) Erythrocytes c(10)
##   ETV6-RUNX1                26                65                  5
##   PBMMC                     90                77                209
##             
##              Monocytes (c11) B (c12)
##   ETV6-RUNX1               0       0
##   PBMMC                  263      15

Therefore, it suggests there are absent from our cancer blood samples.

The difficulty in annotating cluster 12 exemplifies the limitation of manual cell annotation, which can become quite laborious and limited in its ability to classify cells.

Also, we should keep in mind that perhaps our clustering wasn’t ideal, there may have been technical issues during normalisation and dataset integration, which we should investigate (e.g. by producing UMAP and clustering from different normalisation methods).

3 Session information

sessionInfo()
devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value
##  version  R version 4.3.3 (2024-02-29)
##  os       Ubuntu 22.04.4 LTS
##  system   x86_64, linux-gnu
##  ui       X11
##  language (EN)
##  collate  en_US.UTF-8
##  ctype    en_US.UTF-8
##  tz       Etc/UTC
##  date     2024-04-15
##  pandoc   3.1.12.3 @ /opt/miniforge3/envs/R/bin/ (via rmarkdown)
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package              * version   date (UTC) lib source
##  abind                  1.4-5     2016-07-21 [2] CRAN (R 4.3.0)
##  beachmat               2.18.0    2023-10-24 [2] Bioconductor
##  beeswarm               0.4.0     2021-06-01 [2] CRAN (R 4.3.0)
##  Biobase              * 2.62.0    2023-10-24 [2] Bioconductor
##  BiocGenerics         * 0.48.1    2023-11-01 [2] Bioconductor
##  BiocNeighbors          1.20.0    2023-10-24 [2] Bioconductor
##  BiocParallel           1.36.0    2023-10-24 [2] Bioconductor
##  BiocSingular           1.18.0    2023-10-24 [2] Bioconductor
##  bitops                 1.0-7     2021-04-24 [2] CRAN (R 4.3.0)
##  bluster                1.12.0    2023-10-24 [2] Bioconductor
##  bslib                  0.6.1     2023-11-28 [2] CRAN (R 4.3.2)
##  cachem                 1.0.8     2023-05-01 [2] CRAN (R 4.3.0)
##  cli                    3.6.2     2023-12-11 [2] CRAN (R 4.3.2)
##  cluster                2.1.6     2023-12-01 [2] CRAN (R 4.3.2)
##  codetools              0.2-19    2023-02-01 [2] CRAN (R 4.3.0)
##  colorspace             2.1-0     2023-01-23 [2] CRAN (R 4.3.0)
##  cowplot                1.1.3     2024-01-22 [2] CRAN (R 4.3.2)
##  crayon                 1.5.2     2022-09-29 [2] CRAN (R 4.3.0)
##  DelayedArray           0.28.0    2023-10-24 [2] Bioconductor
##  DelayedMatrixStats     1.24.0    2023-10-24 [2] Bioconductor
##  devtools               2.4.5     2022-10-11 [2] CRAN (R 4.3.0)
##  digest                 0.6.35    2024-03-11 [2] CRAN (R 4.3.3)
##  dplyr                * 1.1.4     2023-11-17 [2] CRAN (R 4.3.2)
##  dqrng                  0.3.2     2023-11-29 [2] CRAN (R 4.3.2)
##  edgeR                  4.0.2     2023-11-19 [2] Bioconductor 3.18 (R 4.3.2)
##  ellipsis               0.3.2     2021-04-29 [2] CRAN (R 4.3.0)
##  evaluate               0.23      2023-11-01 [2] CRAN (R 4.3.1)
##  fansi                  1.0.6     2023-12-08 [2] CRAN (R 4.3.2)
##  farver                 2.1.1     2022-07-06 [2] CRAN (R 4.3.0)
##  fastmap                1.1.1     2023-02-24 [2] CRAN (R 4.3.0)
##  forcats              * 1.0.0     2023-01-29 [2] CRAN (R 4.3.0)
##  fs                     1.6.3     2023-07-20 [2] CRAN (R 4.3.1)
##  generics               0.1.3     2022-07-05 [2] CRAN (R 4.3.0)
##  GenomeInfoDb         * 1.38.1    2023-11-08 [2] Bioconductor
##  GenomeInfoDbData       1.2.11    2024-03-19 [2] Bioconductor
##  GenomicRanges        * 1.54.1    2023-10-29 [2] Bioconductor
##  ggbeeswarm             0.7.2     2023-04-29 [2] CRAN (R 4.3.0)
##  ggplot2              * 3.5.0     2024-02-23 [2] CRAN (R 4.3.2)
##  ggrepel                0.9.5     2024-01-10 [2] CRAN (R 4.3.2)
##  glue                   1.7.0     2024-01-09 [2] CRAN (R 4.3.2)
##  gridExtra              2.3       2017-09-09 [2] CRAN (R 4.3.0)
##  gtable                 0.3.4     2023-08-21 [2] CRAN (R 4.3.1)
##  highr                  0.10      2022-12-22 [2] CRAN (R 4.3.0)
##  hms                    1.1.3     2023-03-21 [2] CRAN (R 4.3.0)
##  htmltools              0.5.7     2023-11-03 [2] CRAN (R 4.3.2)
##  htmlwidgets            1.6.4     2023-12-06 [2] CRAN (R 4.3.2)
##  httpuv                 1.6.14    2024-01-26 [2] CRAN (R 4.3.2)
##  igraph                 2.0.2     2024-02-17 [2] CRAN (R 4.3.2)
##  IRanges              * 2.36.0    2023-10-24 [2] Bioconductor
##  irlba                  2.3.5.1   2022-10-03 [2] CRAN (R 4.3.3)
##  jquerylib              0.1.4     2021-04-26 [2] CRAN (R 4.3.0)
##  jsonlite               1.8.8     2023-12-04 [2] CRAN (R 4.3.2)
##  knitr                  1.45      2023-10-30 [2] CRAN (R 4.3.2)
##  labeling               0.4.3     2023-08-29 [2] CRAN (R 4.3.1)
##  later                  1.3.2     2023-12-06 [2] CRAN (R 4.3.2)
##  lattice                0.22-5    2023-10-24 [2] CRAN (R 4.3.1)
##  lifecycle              1.0.4     2023-11-07 [2] CRAN (R 4.3.2)
##  limma                  3.58.1    2023-10-31 [2] Bioconductor
##  locfit                 1.5-9.9   2024-03-01 [2] CRAN (R 4.3.3)
##  lubridate            * 1.9.3     2023-09-27 [2] CRAN (R 4.3.1)
##  magrittr               2.0.3     2022-03-30 [2] CRAN (R 4.3.0)
##  Matrix                 1.6-5     2024-01-11 [2] CRAN (R 4.3.2)
##  MatrixGenerics       * 1.14.0    2023-10-24 [2] Bioconductor
##  matrixStats          * 1.2.0     2023-12-11 [2] CRAN (R 4.3.2)
##  memoise                2.0.1     2021-11-26 [2] CRAN (R 4.3.0)
##  metapod                1.10.0    2023-10-24 [2] Bioconductor
##  mime                   0.12      2021-09-28 [2] CRAN (R 4.3.0)
##  miniUI                 0.1.1.1   2018-05-18 [2] CRAN (R 4.3.0)
##  munsell                0.5.0     2018-06-12 [2] CRAN (R 4.3.0)
##  patchwork            * 1.2.0     2024-01-08 [2] CRAN (R 4.3.2)
##  pheatmap               1.0.12    2019-01-04 [2] CRAN (R 4.3.0)
##  pillar                 1.9.0     2023-03-22 [2] CRAN (R 4.3.0)
##  pkgbuild               1.4.4     2024-03-17 [2] CRAN (R 4.3.3)
##  pkgconfig              2.0.3     2019-09-22 [2] CRAN (R 4.3.0)
##  pkgload                1.3.4     2024-01-16 [2] CRAN (R 4.3.2)
##  profvis                0.3.8     2023-05-02 [2] CRAN (R 4.3.1)
##  promises               1.2.1     2023-08-10 [2] CRAN (R 4.3.1)
##  purrr                * 1.0.2     2023-08-10 [2] CRAN (R 4.3.1)
##  R6                     2.5.1     2021-08-19 [2] CRAN (R 4.3.0)
##  RColorBrewer           1.1-3     2022-04-03 [2] CRAN (R 4.3.0)
##  Rcpp                   1.0.12    2024-01-09 [2] CRAN (R 4.3.2)
##  RCurl                  1.98-1.14 2024-01-09 [2] CRAN (R 4.3.2)
##  readr                * 2.1.5     2024-01-10 [2] CRAN (R 4.3.2)
##  remotes                2.5.0     2024-03-17 [2] CRAN (R 4.3.3)
##  rlang                  1.1.3     2024-01-10 [2] CRAN (R 4.3.2)
##  rmarkdown              2.26      2024-03-05 [2] CRAN (R 4.3.3)
##  rstudioapi             0.15.0    2023-07-07 [2] CRAN (R 4.3.0)
##  rsvd                   1.0.5     2021-04-16 [2] CRAN (R 4.3.0)
##  S4Arrays               1.2.0     2023-10-24 [2] Bioconductor
##  S4Vectors            * 0.40.2    2023-11-23 [2] Bioconductor 3.18 (R 4.3.2)
##  sass                   0.4.9     2024-03-15 [2] CRAN (R 4.3.3)
##  ScaledMatrix           1.10.0    2023-10-24 [2] Bioconductor
##  scales                 1.3.0     2023-11-28 [2] CRAN (R 4.3.2)
##  scater               * 1.30.1    2023-11-16 [2] Bioconductor
##  scran                * 1.30.0    2023-10-24 [2] Bioconductor
##  scuttle              * 1.12.0    2023-10-24 [2] Bioconductor
##  sessioninfo            1.2.2     2021-12-06 [2] CRAN (R 4.3.0)
##  shiny                  1.8.0     2023-11-17 [2] CRAN (R 4.3.2)
##  SingleCellExperiment * 1.24.0    2023-10-24 [2] Bioconductor
##  SparseArray            1.2.2     2023-11-07 [2] Bioconductor
##  sparseMatrixStats      1.14.0    2023-10-24 [2] Bioconductor
##  statmod                1.5.0     2023-01-06 [2] CRAN (R 4.3.0)
##  stringi                1.8.3     2023-12-11 [2] CRAN (R 4.3.2)
##  stringr              * 1.5.1     2023-11-14 [2] CRAN (R 4.3.2)
##  SummarizedExperiment * 1.32.0    2023-10-24 [2] Bioconductor
##  tibble               * 3.2.1     2023-03-20 [2] CRAN (R 4.3.0)
##  tidyr                * 1.3.1     2024-01-24 [2] CRAN (R 4.3.2)
##  tidyselect             1.2.0     2022-10-10 [2] CRAN (R 4.3.0)
##  tidyverse            * 2.0.0     2023-02-22 [2] CRAN (R 4.3.0)
##  timechange             0.3.0     2024-01-18 [2] CRAN (R 4.3.2)
##  tzdb                   0.4.0     2023-05-12 [2] CRAN (R 4.3.0)
##  urlchecker             1.0.1     2021-11-30 [2] CRAN (R 4.3.0)
##  usethis                2.2.3     2024-02-19 [2] CRAN (R 4.3.2)
##  utf8                   1.2.4     2023-10-22 [2] CRAN (R 4.3.1)
##  vctrs                  0.6.5     2023-12-01 [2] CRAN (R 4.3.2)
##  vipor                  0.4.7     2023-12-18 [2] CRAN (R 4.3.2)
##  viridis                0.6.5     2024-01-29 [2] CRAN (R 4.3.2)
##  viridisLite            0.4.2     2023-05-02 [2] CRAN (R 4.3.0)
##  withr                  3.0.0     2024-01-16 [2] CRAN (R 4.3.2)
##  xfun                   0.42      2024-02-08 [2] CRAN (R 4.3.2)
##  xtable                 1.8-4     2019-04-21 [2] CRAN (R 4.3.0)
##  XVector                0.42.0    2023-10-24 [2] Bioconductor
##  yaml                   2.3.8     2023-12-11 [2] CRAN (R 4.3.2)
##  zlibbioc               1.48.0    2023-10-24 [2] Bioconductor
## 
##  [1] /Users/sawle01/R/x86_64-conda-linux-gnu-library/4.3
##  [2] /opt/miniforge3/envs/R/lib/R/library
## 
## ──────────────────────────────────────────────────────────────────────────────