NB-FOXR2 project [source]


1 Configuration

Configuration of project directory & analysis outputs:

Show full config

source(here("rr_helpers.R"))

# Set up outputs
message("Document index: ", doc_id)
## Document index: 02
# Specify where to save outputs
out        <- here("output", doc_id); dir.create(out, recursive = TRUE)
figout     <- here("figures", doc_id, "/")
cache      <- paste0("/project/kleinman/bhavyaa.chandarana/cache/NB-FOXR2/public/", doc_id, "/")

The root directory of this project is:

## /project/kleinman/bhavyaa.chandarana/from_hydra/2023-05-NB-FOXR2/public

Outputs and figures will be saved at these paths, relative to project root:

## public/output/02
## public/figures/02//

Setting a random seed:

set.seed(100)

2 Overview

Here we'll assemble a set of cell type signatures from the developing brain / adult brain, building off the collection assembled for our Chen et al, Cell, 2020 study on G34R/V gliomas.

I will also add additional signatures for other brain datasets.

NOTE: This document re-uses a few functions for processing markers into lists of gene signatures, filter_markers() and signatures_to_list() which are located in code/functions/scRNAseq.R.

3 Libraries

library(here)
library(magrittr)
library(tidyr)
library(dplyr)
library(readr)
library(readxl)
library(glue)
library(purrr)
library(ggplot2)
library(pheatmap)
library(Seurat)

source(here("include/style.R"))
source(here("code/functions/scRNAseq.R"))

ggplot2::theme_set(theme_min())

conflicted::conflicts_prefer(dplyr::filter)

4 Gather signatures

Set function for conversion ensembl <-> symbol.

signatures_to_list <- function(signatures, type = "ens") {
    
    if (type == "ens") {
        
        signatures %>% 
            select(Cluster, gene) %>%
            split(.$Cluster) %>%
            map(~ pull(.x, gene) %>% symbols2ensembl())
        
    } else if (type == "sym") {
        
        signatures %>% 
            select(Cluster, gene) %>%
            split(.$Cluster) %>%
            map(~ pull(.x, gene))
    }
}

symbols2ensembl <- function(genes) {
    
    load(here("data/singlecell/references_genome/biomaRt_hg_symbol_to_ens_lds.Rda"))
    genes_ens_lds %>% filter(HGNC.symbol %in% genes) %>% pull(Gene.stable.ID)
    
}

4.1 Signatures compiled for Chen et al, 2020

In our analysis of H3G34R/V gliomas, we assembled signatures from several studies on pre and postnatal forebrain, which we will re-use here (GitHub link). Copying over the comments from the Chen et al analysis:

We obtained reference datasets for the forebrain across species and the lifespan: Jessa et al, 2019; Nowakowski et al, 2017; Velmeshev et al, 2019 We also obtained two reference datasets capturing the adult SVZ: Anderson et al, 2020; Mizrak et al, 2019

# laod gene signatures
signatures_ens <- readRDS(here("data/singlecell/references_normal/Chen_Cell_2020/signatures_ens.Rds"))
signatures_sym <- readRDS(here("data/singlecell/references_normal/Chen_Cell_2020//signatures_sym.Rds"))

# load signature annotation
cell_type_anno <- read_tsv(here("data/singlecell/references_normal/Chen_Cell_2020/signature_annotations.tsv"))
## Rows: 340 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (5): Sample, Age, Cell_type, Cluster, Dataset
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

This set contains signatures from the our mouse forebrain atlas published in Jessa et al, Nature Genetics, 2019. Since we have recently extended the timepoints covered by this atlas (Jessa et al, Nature Genetics, 2022), we will remove all the 2019 signatures from this collection. In the next section, we load in both 2019 & 2022 signatures.

cell_type_anno_filt <- cell_type_anno %>% 
    filter(Dataset != "Jessa et al 2019")

signatures_ens <- signatures_ens[cell_type_anno_filt$Cluster]
signatures_sym <- signatures_sym[cell_type_anno_filt$Cluster]

4.2 Jessa et al, Nature Genetics, 2022

Load the signatures for the extended atlas, combining timepoints published in 2019 and 2022:

# load signatures
jessa_signatures <- readRDS(here("data/singlecell/references_normal/Jessa_NatGenet_2022/joint_mouse_extended.signatures_ID_20210710.Rds"))

# subset to forebrain
jessa_signatures_ens <- jessa_signatures$hg_ens[grepl("^F-", names(jessa_signatures$hg_ens))]
jessa_signatures_sym <- jessa_signatures$hg_sym[grepl("^F-", names(jessa_signatures$hg_sym))]

# load annotation
jessa_cell_type_anno <- read_tsv(here("data/singlecell/references_normal/Jessa_NatGenet_2022/metadata_20210710_with_qc_v2.tsv")) %>%
    filter(Location == "Forebrain") %>% 
    filter(!grepl("EXCLUDE", Label)) %>% 
    filter(Label %in% names(jessa_signatures_ens)) %>% 
    select(Cluster = Label,
           Age = Timepoint,
           Cell_type = Level4_type) %>% 
    mutate(Dataset = "Jessa et al 2022",
           Sample = "Mouse forebrain")
## Rows: 346 Columns: 22
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (15): Alias, Sample, Location, Timepoint, Colour, Cell_ontological_class...
## dbl  (7): Cluster, N_cells, median_logFC, max_logFC, n_gene_FC_above_1.5, me...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# sanity check
nrow(jessa_cell_type_anno) == length(jessa_signatures_ens)
## [1] TRUE
nrow(jessa_cell_type_anno) == length(jessa_signatures_sym)
## [1] TRUE

4.3 Aldinger et al, Nat Neurosci, 2021

# load cell annotaiton
aldinger_anno <- read_xlsx(here("data/singlecell/references_normal/Aldinger_NatNeurosci_2021/data/Aldinger_SupplementaryTables.xlsx"), sheet = 8, skip = 2) %>% 
    dplyr::rename(Cluster = `Cluster-Cell Type Abbreviation`, Cell_type = `Cell Type`)

# load cluster markers
load(here("data/singlecell/references_normal/Aldinger_NatNeurosci_2021/aldinger_markers.Rda"))

# convert to signatures
aldinger_signatures <- aldinger_markers %>% 
    mutate(Cluster = paste0("Human fetal cerebellum ", cluster)) %>% 
    dplyr::rename(avg_logFC = avg_log2FC) %>% 
    filter_markers(n_top = 100)

sort(table(aldinger_signatures$Cluster))
## 
##              Human fetal cerebellum 20-Choroid 
##                                             31 
##              Human fetal cerebellum 05-eCN/UBC 
##                                             98 
##                   Human fetal cerebellum 01-PC 
##                                            100 
##                   Human fetal cerebellum 02-RL 
##                                            100 
##                  Human fetal cerebellum 03-GCP 
##                                            100 
##                   Human fetal cerebellum 04-GN 
##                                            100 
##                  Human fetal cerebellum 06-iCN 
##                                            100 
##                  Human fetal cerebellum 07-PIP 
##                                            100 
##                   Human fetal cerebellum 08-BG 
##                                            100 
##                  Human fetal cerebellum 09-Ast 
##                                            100 
##                 Human fetal cerebellum 10-Glia 
##                                            100 
##                  Human fetal cerebellum 11-OPC 
##                                            100 
##        Human fetal cerebellum 12-Committed OPC 
##                                            100 
##          Human fetal cerebellum 13-Endothelial 
##                                            100 
##            Human fetal cerebellum 14-Microglia 
##                                            100 
##             Human fetal cerebellum 15-Meninges 
##                                            100 
##            Human fetal cerebellum 16-Pericytes 
##                                            100 
##            Human fetal cerebellum 17-Brainstem 
##                                            100 
##                  Human fetal cerebellum 18-MLI 
##                                            100 
##        Human fetal cerebellum 19-Ast/Ependymal 
##                                            100 
## Human fetal cerebellum 21-BS Choroid/Ependymal 
##                                            100
aldinger_signatures_ens <- aldinger_signatures %>%
    signatures_to_list("ens")

aldinger_signatures_sym <- aldinger_signatures %>%
    signatures_to_list("sym")

aldinger_cell_type_anno  <- aldinger_anno %>%
    select(-3, -4, -5) %>% 
    mutate(Cluster = paste0("Human fetal cerebellum ", Cluster)) %>% 
    mutate(Dataset = "Aldinger et al 2021",
           Sample = "Human fetal cerebellum",
           Age = "9-21 PCW")

4.4 Dong et al, Cancer Cell

This study profiled human fetal embryos and adrenal glands as a reference for studies of extra-cranial neuroblastoma.

dong_embryo_markers <- read_xlsx(here("data/singlecell/references_normal/Dong_CancerCell_2020/Dong_TableS3.xlsx"), skip = 2) %>%
    dplyr::rename(Cluster = `Cell  type`, gene = Gene)

dong_sympatho_markers <- read_xlsx(here("data/singlecell/references_normal/Dong_CancerCell_2020/Dong_TableS4.xlsx"), skip = 2) %>%
    dplyr::rename(Cluster = Cell_type, gene = Gene)

dong_signatures <- bind_rows(dong_embryo_markers %>% mutate(Cluster = paste0("Human 4PCW ", Cluster)),
                             dong_sympatho_markers %>% mutate(Cluster = paste0("Human fetal adrenal ", Cluster))) %>%
    # take care of a common cluster name between datasets
    mutate(Cluster = ifelse(Cluster == "Human fetal adrenal SCPs", "Human fetal adrenal SCP", Cluster)) %>% 
    filter_markers(sp = "hg", n_top = 100)

table(dong_signatures$Cluster)
## 
##                              Human 4PCW EMT NCCs 
##                                              100 
##                           Human 4PCW Floor plate 
##                                              100 
##                  Human 4PCW Forebrain Primordium 
##                                              100 
##                               Human 4PCW INs Pro 
##                                              100 
##                           Human 4PCW Melanoblast 
##                                              100 
##                                 Human 4PCW MNs I 
##                                              100 
##                                Human 4PCW MNs II 
##                                              100 
##                               Human 4PCW MNs III 
##                                              100 
##                               Human 4PCW MNs Pro 
##                                              100 
##                                  Human 4PCW NCCs 
##                                              100 
##                                    Human 4PCW NT 
##                                              100 
##                        Human 4PCW Pre-EMT NCCs I 
##                                              100 
##                       Human 4PCW Pre-EMT NCCs II 
##                                              100 
##                                   Human 4PCW SNs 
##                                              100 
##     Human fetal adrenal Cycling chromaffin cells 
##                                              100 
##       Human fetal adrenal Cycling sympathoblasts 
##                                              100 
## Human fetal adrenal Non-cycling chromaffin cells 
##                                              100 
##   Human fetal adrenal Non-cycling sympathoblasts 
##                                              100 
##                          Human fetal adrenal SCP 
##                                              100
dong_signatures_ens <- dong_signatures %>% signatures_to_list("ens")
dong_signatures_sym <- dong_signatures %>% signatures_to_list("sym")

dong_cell_type_anno <- dong_signatures %>%
    distinct(Cluster) %>%
    mutate(Dataset = "Dong et al 2020",
           Age = "Human fetal",
           Cell_type = Cluster,
           Sample = case_when(
               grepl("4PCW", Cluster) ~ "Human 4PCW embryo neural lineages",
               grepl("adrenal", Cluster) ~ "Human 8-14PCW fetal adrenal glands"
           ))

4.5 Jansky et al, Nature Genetics, 2021

This study also profiled fetal human adrenal glands and adrenal medulla for comparisons/study of neuroblastoma.

jansky_4 <- read_xlsx(here("data/singlecell/references_normal/Jansky_NatGenet_2021/Jansky_et_al_SupplementaryTables1-11.xlsx"), sheet = "Suppl. Table 4", skip = 1)
jansky_5 <- read_xlsx(here("data/singlecell/references_normal/Jansky_NatGenet_2021/Jansky_et_al_SupplementaryTables1-11.xlsx"), sheet = "Suppl. Table 5", skip = 1)

jansky_signatures <- bind_rows(jansky_4, jansky_5) %>% 
    dplyr::rename(Cluster = cluster,
                  avg_logFC = `average logFC`) %>% 
    filter_markers() %>%
    mutate(Cluster = paste0("Human fetal adrenal2 ", Cluster))

jansky_signatures_ens <- jansky_signatures %>% signatures_to_list("ens")
jansky_signatures_sym <- jansky_signatures %>% signatures_to_list("sym")

jansky_cell_type_anno <- jansky_signatures %>%
    distinct(Cluster) %>%
    mutate(Dataset = "Jansky et al 2021",
           Age = "Human fetal 7-17PCW",
           Cell_type = Cluster,
           Sample = "Human fetal adrenal gland")

4.6 Kildisiute et al, Science Advances, 2021

This study also profiled human fetal adrenal glands as a reference for studies of extra-cranial neuroblastoma.

These markers were called with a custom algorithm by the authors, as described here by the authors in their Methods:

Using well-established marker genes of different cell types curated from the literature (table S2), we assigned a cell type to each cluster. Where two clusters were annotated as the same cell type, we merged them together. As further confirmation of our annotation, we next identified marker genes for each population algorithmically (table S6). To do this, we used a method that uses the tf-idf metric to identify genes specific to each population, as implemented in the “quickMarkers” function in the SoupX R package (29). We further filtered genes to include only those genes with a P value less than 0.01 after multiple hypothesis correction (hypergeometric test).

Let's plot the markers produced in this study, comparing for each gene, the TF-IDF metric with the difference in detection rate of the gene in cells inside the cluster compared to all other cells. Each point is one gene.

kildisiute_markers <- read_xlsx(here("data/singlecell/references_normal/Kildisiute_SciAdv_2021/Kildisiute_Tables_S1_to_S12.xlsx"),
                                sheet = "TableS6.algorithmic_markers") %>%
    # filter out tumor datasets
    filter(dataset %in% c("adrenal_gland", "stringent_adrenal")) %>%
    mutate(pct_diff = geneFrequency - geneFrequencyOutsideCluster) %>%
    dplyr::rename(Cluster = cluster) %>%
    filter(Cluster != "Other") %>%
    mutate(Cluster = paste0("Human fetal adrenal ", Cluster))

# quite a large number of markers
table(kildisiute_markers$Cluster, kildisiute_markers$dataset)
##                                           
##                                            adrenal_gland stringent_adrenal
##   Human fetal adrenal Bridge                        6877                25
##   Human fetal adrenal Chromaffin                    9324                31
##   Human fetal adrenal Cortex                       13593                 0
##   Human fetal adrenal Erythroblasts                  441                 0
##   Human fetal adrenal Leukocytes                    4143                 0
##   Human fetal adrenal Mesenchyme                    5441                 0
##   Human fetal adrenal Podocytes                        0               176
##   Human fetal adrenal SCPs                          1887                57
##   Human fetal adrenal Sympathoblastic               8146                59
##   Human fetal adrenal Vascular Endothelium          2734                 0
# explore the dataset
kildisiute_markers %>%
    ggplot(aes(x = pct_diff, y = tfidf)) +
    geom_point(aes(colour = Cluster), alpha = 0.3) +
    geom_smooth(aes(colour = Cluster), method = "lm", se = FALSE) +
    xlab("Diff. in detection rate inside and outside cluster") +
    ylab("TF-IDF metric") +
    ggtitle("Before filtering")
## `geom_smooth()` using formula = 'y ~ x'

This tells us that a high TF-IDF metric correlates with high/specific detection rate. However, for some clusters, there's more variability along the X-axis, so I'll select markers based on the difference in detection rates (pct_diff), rather than the TF-IDF metric..

kildisiute_signatures <- kildisiute_markers %>%
    # filter out mitochondrial and ribosomal genes
    dplyr::filter(., !grepl("RPS|RPL|MRPS|MRPL|^MT-", gene)) %>%
    group_by(Cluster) %>%
    arrange(desc(pct_diff)) %>%
    # make sure they're unique
    distinct(gene, .keep_all = TRUE) %>%
    dplyr::slice(1:100) %>%
    ungroup()

# re-plot the same figure with th efiltered markers
kildisiute_signatures %>%
    ggplot(aes(x = pct_diff, y = tfidf)) +
    geom_point(aes(colour = Cluster), alpha = 0.3) +
    geom_smooth(aes(colour = Cluster), method = "lm", se = FALSE) +
    xlab("Diff. in detection rate inside and outside cluster") + 
    ylab("TF-IDF metric") +
    xlim(c(0, 1)) + ylim(c(0, 5)) +
    ggtitle("After filtering")
## `geom_smooth()` using formula = 'y ~ x'

table(kildisiute_signatures$Cluster)
## 
##               Human fetal adrenal Bridge 
##                                      100 
##           Human fetal adrenal Chromaffin 
##                                      100 
##               Human fetal adrenal Cortex 
##                                      100 
##        Human fetal adrenal Erythroblasts 
##                                      100 
##           Human fetal adrenal Leukocytes 
##                                      100 
##           Human fetal adrenal Mesenchyme 
##                                      100 
##            Human fetal adrenal Podocytes 
##                                      100 
##                 Human fetal adrenal SCPs 
##                                      100 
##      Human fetal adrenal Sympathoblastic 
##                                      100 
## Human fetal adrenal Vascular Endothelium 
##                                      100
kildisiute_signatures_ens <- kildisiute_signatures %>% signatures_to_list("ens")
kildisiute_signatures_sym <- kildisiute_signatures %>% signatures_to_list("sym")

kildisiute_cell_type_anno <- kildisiute_signatures %>%
    distinct(Cluster) %>%
    mutate(Dataset = "Kildisiute et al 2021",
           Age = "Human fetal 8-21PCW",
           Cell_type = Cluster,
           Sample = "Human fetal adrenal glands")

4.7 Shi et al, Science, 2021

Here we'll select markers from Shi et al, Science, 2021, which correspond to differentially expressed genes between different human fetal ganglionic eminence progenitor clusters.

shi_table_s6 <- read_xlsx(here("data/singlecell/references_normal/Shi_Science_2021/data/Shi2021_table_s6.xlsx"), skip = 1)

# how many genes per cluster?
table(shi_table_s6$cluster)
## 
## pC1 pC2 pC3 pL1 pL2 pL3 pM1 pM2 pM3 pM4 
##  49  48  48  50  49  33  48  38  48  46
length(unique(shi_table_s6$gene))
## [1] 305
shi_signatures_ens <- shi_table_s6 %>%
    select(cluster, gene) %>%
    mutate(cluster = paste0("Human fetal ", cluster)) %>%
    split(.$cluster) %>%
    map(~ pull(.x, gene) %>% symbols2ensembl())

shi_signatures_sym <- shi_table_s6 %>%
    select(cluster, gene) %>%
    mutate(cluster = paste0("Human fetal ", cluster)) %>%
    split(.$cluster) %>%
    map(~ pull(.x, gene))

signatures_ens2 <- c(signatures_ens, shi_signatures_ens)

shi_cell_type_anno  <- shi_table_s6 %>%
    distinct(cluster) %>%
    select(Cluster = cluster) %>%
    mutate(Cluster = paste0("Human fetal ", Cluster)) %>%
    mutate(Dataset = "Shi et al 2021", Sample = "Human fetal GE", Age = "Human fetal",
           Cell_type = case_when(
               grepl("C", Cluster) ~ "CGE progenitor",
               grepl("M", Cluster) ~ "MGE progenitor",
               grepl("L", Cluster) ~ "LGE progenitor"
           ))

4.8 Van Bruggen et al, Dev Cell, 2022

This study focused on emergence of OPCs in the early human fetal brain.

vanbruggen_anno <- read_tsv(here("data/singlecell/references_normal/VanBruggen_DevCell_2022/cluster_annotation.tsv"))
## Rows: 31 Columns: 3
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (1): Annotation
## dbl (1): Cluster
## lgl (1): Color
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

We noted issues with gene naming in the supplementary tables provided with the manuscript, so we re-called markers using Seurat::FindAllMarkers() and load them here:

load(here("data/singlecell/references_normal/VanBruggen_DevCell_2022/vanbruggen_markers2.Rda"))

scRNA_human_dev <- readRDS(here("data/singlecell/references_normal/VanBruggen_DevCell_2022/scRNA_human_dev.rds"))
vanbruggen_anno <- data.frame("Cluster" = names(sort(table(scRNA_human_dev$Clusters), decreasing = TRUE))) %>% 
    tibble::rowid_to_column(var = "Number")

vanbruggen_signatures <- vanbruggen_markers2 %>% 
    dplyr::rename(avg_logFC = avg_log2FC, Cluster = cluster) %>% 
    filter_markers(n_top = 100) %>% 
    left_join(vanbruggen_anno, by = "Cluster") %>% 
    mutate(Cluster = paste0("Human fetal ", Number, "-", Cluster))

sort(table(vanbruggen_signatures$Cluster))
## 
##                             Human fetal 23-Striatum/Cortical neurons 
##                                                                    3 
##       Human fetal 24-Radial glia/Glioblast/Forebrain progenitor EMX1 
##                                                                    3 
##              Human fetal 30-Midbrain/Hindbrain inhibitory neuroblast 
##                                                                   48 
##                                   Human fetal 14-GABAergic forebrain 
##                                                                   53 
##                                  Human fetal 6-Cortical Interneurons 
##                                                                   55 
##        Human fetal 2-Inhibitory neurons Midbrain, possibly GABAergic 
##                                                                   63 
##                              Human fetal 1-Excitatory neurons cortex 
##                                                                  100 
##                                 Human fetal 10-Radial Glia/Glioblast 
##                                                                  100 
##                                    Human fetal 11-Cortical Pyramidal 
##                                                                  100 
##                       Human fetal 12-Forebrain inhibitory neuroblast 
##                                                                  100 
##                                   Human fetal 13-Radial Glia cycling 
##                                                                  100 
##                                           Human fetal 15-Radial Glia 
##                                                                  100 
##                              Human fetal 16-Mid/Hindbrain neuroblast 
##                                                                  100 
##                                     Human fetal 17-Glioblast/Pre-OPC 
##                                                                  100 
##                     Human fetal 18-Neuroblast motorneuron/GABAergic? 
##                                                                  100 
##                                                     Human fetal 19-U 
##                                                                  100 
##                              Human fetal 20-Radial Glia VLMC primed? 
##                                                                  100 
##                                  Human fetal 21-Hindbrain neuroblast 
##                                                                  100 
## Human fetal 22-GABAergic or interneuron neuroblast probably midbrain 
##                                                                  100 
##                                                  Human fetal 25-OPCs 
##                                                                  100 
##                                                 Human fetal 26-VLMCs 
##                                                                  100 
##                        Human fetal 27-Midbrain inhibitory neuroblast 
##                                                                  100 
##                                           Human fetal 28-Endothelial 
##                                                                  100 
##                                             Human fetal 29-Microglia 
##                                                                  100 
##                        Human fetal 3-Radial Glia potential glioblast 
##                                                                  100 
##                            Human fetal 4-Excitatory neurons midbrain 
##                                                                  100 
##          Human fetal 5-Forebrain early neuroblast possibly GABAergic 
##                                                                  100 
##                   Human fetal 7-Excitatory neurons possibly midbrain 
##                                                                  100 
##                       Human fetal 8-Forebrain neural progenitor EMX1 
##                                                                  100 
##                                              Human fetal 9-Glioblast 
##                                                                  100
vanbruggen_signatures_ens <- vanbruggen_signatures %>%
    signatures_to_list("ens")

vanbruggen_signatures_sym <- vanbruggen_signatures %>%
    signatures_to_list("sym")

vanbruggen_cell_type_anno  <- vanbruggen_signatures %>%
    distinct(Cluster) %>%
    mutate(Dataset = "VanBruggen et al 2021",
           Sample = "Human fetal forebrain",
           Age = "8-10GW",
           Cell_type = Cluster)

4.9 Yu et al, Nature Neuroscience, 2021

This study also investigated human fetal ganglionic eminences and cortical interneuron development.

yu_cluster_markers <- read_xlsx(here("data/singlecell/references_normal/Yu_NatNeurosci_2021/Yu_NatNeuro_2021_Sup_tables.xlsx"),
                                sheet = 3, skip = 2) %>% 
    filter(!is.na(Cluster)) %>% 
    filter(!(Cluster %in% c("MG", "EC1", "EC2"))) %>% 
    mutate(Cluster = paste0("Fetal GE ", Cluster)) %>% 
    mutate(P_val = as.numeric(P_val), P_val_adj = as.numeric(P_val_adj))

yu_MGE_markers <- read_xlsx(here("data/singlecell/references_normal/Yu_NatNeurosci_2021/Yu_NatNeuro_2021_Sup_tables.xlsx"),
                            sheet = 11, skip = 2) %>% 
    mutate(Cluster = paste0("MGE-", Cluster))

yu_LGE_markers <- read_xlsx(here("data/singlecell/references_normal/Yu_NatNeurosci_2021/Yu_NatNeuro_2021_Sup_tables.xlsx"),
                            sheet = 12, skip = 2) %>% 
    mutate(Cluster = paste0("LGE-", Cluster)) %>% 
    mutate(P_val = as.numeric(P_val), P_val_adj = as.numeric(P_val_adj))

yu_CGE_markers <- read_xlsx(here("data/singlecell/references_normal/Yu_NatNeurosci_2021/Yu_NatNeuro_2021_Sup_tables.xlsx"),
                            sheet = 15, skip = 2) %>% 
    mutate(Cluster = paste0("CGE-", Cluster))

yu_markers <- bind_rows(yu_cluster_markers,
                        yu_MGE_markers,
                        yu_LGE_markers,
                        yu_CGE_markers) %>% 
    rename(gene = Gene, avg_logFC = Avg_logFC) %>% 
    mutate(Cluster = gsub("Fetal", "Human fetal", Cluster))

How many clusters, and how many markers per cluster?

unique(yu_markers$Cluster)
##  [1] "Human fetal GE P1"    "Human fetal GE P2"    "Human fetal GE P3"   
##  [4] "Human fetal GE P4"    "Human fetal GE P5"    "Human fetal GE ExN4" 
##  [7] "Human fetal GE ExN5"  "Human fetal GE P6"    "Human fetal GE MGE1" 
## [10] "Human fetal GE MGE2"  "Human fetal GE CGE1"  "Human fetal GE LGE1" 
## [13] "Human fetal GE LGE2"  "Human fetal GE LGE3"  "Human fetal GE OPC"  
## [16] "Human fetal GE ExN1"  "Human fetal GE ExN2"  "Human fetal GE ExN3" 
## [19] "MGE-ZEB2+,MAF+"       "MGE-POU3F2+,CNTNAP2+" "MGE-NR2F1+,MEIS2+"   
## [22] "MGE-LHX8+,NKX2-1+"    "MGE-ANGPT2+,CRABP1+"  "LGE-ISL1+,EBF1+ 4"   
## [25] "LGE-ISL1+,EBF1+ 3"    "LGE-ISL1+,EBF1+ 2"    "LGE-ISL1+,EBF1+ 1"   
## [28] "LGE-SIX3+,SOX2+ 5"    "LGE-SIX3+,SOX2+ 4"    "LGE-SIX3+,SOX2+ 3"   
## [31] "LGE-SIX3+,SOX2+ 2"    "LGE-SIX3+,SOX2+ 1"    "LGE-PAX6+,ETV1+"     
## [34] "LGE-ASPM+,TOP2A+"     "CGE-CALB2+,NPAS3+"    "CGE-NFIA+,ST18+"     
## [37] "CGE-ANK3+,ENC1+"      "CGE-GRIA1+,SST+"      "CGE-TOP2A+,HMGB2+"
table(yu_markers$Cluster)
## 
##      CGE-ANK3+,ENC1+    CGE-CALB2+,NPAS3+      CGE-GRIA1+,SST+ 
##                  116                   50                   86 
##      CGE-NFIA+,ST18+    CGE-TOP2A+,HMGB2+  Human fetal GE CGE1 
##                  178                   59                  104 
##  Human fetal GE ExN1  Human fetal GE ExN2  Human fetal GE ExN3 
##                  287                  192                  375 
##  Human fetal GE ExN4  Human fetal GE ExN5  Human fetal GE LGE1 
##                  261                  504                  115 
##  Human fetal GE LGE2  Human fetal GE LGE3  Human fetal GE MGE1 
##                  158                  130                  130 
##  Human fetal GE MGE2   Human fetal GE OPC    Human fetal GE P1 
##                  112                  444                  504 
##    Human fetal GE P2    Human fetal GE P3    Human fetal GE P4 
##                  482                  484                  444 
##    Human fetal GE P5    Human fetal GE P6     LGE-ASPM+,TOP2A+ 
##                  361                  249                  138 
##    LGE-ISL1+,EBF1+ 1    LGE-ISL1+,EBF1+ 2    LGE-ISL1+,EBF1+ 3 
##                   67                  107                  179 
##    LGE-ISL1+,EBF1+ 4      LGE-PAX6+,ETV1+    LGE-SIX3+,SOX2+ 1 
##                  113                  194                   90 
##    LGE-SIX3+,SOX2+ 2    LGE-SIX3+,SOX2+ 3    LGE-SIX3+,SOX2+ 4 
##                  115                  246                  115 
##    LGE-SIX3+,SOX2+ 5  MGE-ANGPT2+,CRABP1+    MGE-LHX8+,NKX2-1+ 
##                  140                  104                  225 
##    MGE-NR2F1+,MEIS2+ MGE-POU3F2+,CNTNAP2+       MGE-ZEB2+,MAF+ 
##                  109                   63                   98

The imbalance in number of markers per cluster means that we should do some filtering to get them to roughly equal length:

yu_signatures <- yu_markers %>% 
    filter_markers(n_top = 100)

sort(table(yu_signatures$Cluster))
## 
##    CGE-CALB2+,NPAS3+    CGE-TOP2A+,HMGB2+ MGE-POU3F2+,CNTNAP2+ 
##                   50                   59                   63 
##    LGE-ISL1+,EBF1+ 1      CGE-GRIA1+,SST+    LGE-SIX3+,SOX2+ 1 
##                   67                   86                   90 
##       MGE-ZEB2+,MAF+      CGE-ANK3+,ENC1+      CGE-NFIA+,ST18+ 
##                   98                  100                  100 
##  Human fetal GE CGE1  Human fetal GE ExN1  Human fetal GE ExN2 
##                  100                  100                  100 
##  Human fetal GE ExN3  Human fetal GE ExN4  Human fetal GE ExN5 
##                  100                  100                  100 
##  Human fetal GE LGE1  Human fetal GE LGE2  Human fetal GE LGE3 
##                  100                  100                  100 
##  Human fetal GE MGE1  Human fetal GE MGE2   Human fetal GE OPC 
##                  100                  100                  100 
##    Human fetal GE P1    Human fetal GE P2    Human fetal GE P3 
##                  100                  100                  100 
##    Human fetal GE P4    Human fetal GE P5    Human fetal GE P6 
##                  100                  100                  100 
##     LGE-ASPM+,TOP2A+    LGE-ISL1+,EBF1+ 2    LGE-ISL1+,EBF1+ 3 
##                  100                  100                  100 
##    LGE-ISL1+,EBF1+ 4      LGE-PAX6+,ETV1+    LGE-SIX3+,SOX2+ 2 
##                  100                  100                  100 
##    LGE-SIX3+,SOX2+ 3    LGE-SIX3+,SOX2+ 4    LGE-SIX3+,SOX2+ 5 
##                  100                  100                  100 
##  MGE-ANGPT2+,CRABP1+    MGE-LHX8+,NKX2-1+    MGE-NR2F1+,MEIS2+ 
##                  100                  100                  100
yu_signatures_ens <- yu_signatures %>%
    signatures_to_list("ens")

yu_signatures_sym <- yu_signatures %>%
    signatures_to_list("sym")

yu_cell_type_anno  <- yu_signatures %>%
    distinct(Cluster) %>%
    mutate(Dataset = "Yu et al 2021",
           Sample = "Human fetal GE",
           Age = "Human fetal",
           Cell_type = Cluster)

4.10 Compile all signatures

cell_type_anno_all <- bind_rows(cell_type_anno_filt,
                                jessa_cell_type_anno,
                                shi_cell_type_anno,
                                yu_cell_type_anno,
                                vanbruggen_cell_type_anno,
                                dong_cell_type_anno,
                                kildisiute_cell_type_anno,
                                jansky_cell_type_anno,
                                aldinger_cell_type_anno) %>%
    mutate(Species = case_when(
        grepl("Velmeshev|Nowakowski|Yu|Shi|Dong|Kildisiute|Aldinger|VanBruggen|Jansky", Dataset) ~ "Human",
        TRUE ~ "Mouse"
    ))

cell_type_anno_all %>% distinct(Dataset, Species) %>% arrange(Species)
signatures_ens_all <- c(signatures_ens, jessa_signatures_ens, shi_signatures_ens, yu_signatures_ens,
                        dong_signatures_ens, kildisiute_signatures_ens,
                        vanbruggen_signatures_ens, jansky_signatures_ens,
                        aldinger_signatures_ens)
signatures_sym_all <- c(signatures_sym, jessa_signatures_sym, shi_signatures_sym, yu_signatures_sym,
                        dong_signatures_sym, kildisiute_signatures_sym,
                        vanbruggen_signatures_sym, jansky_signatures_sym,
                        aldinger_signatures_sym)

# QC: check length
sig_length <- map_dbl(signatures_ens_all, length) %>%
    tibble::enframe("Signature", "Length") %>%
    arrange(Length) %>%
    mutate(Signature = factor(Signature, levels = Signature))

sig_length %>% ggplot(aes(x = Signature, y = Length)) +
    geom_col() +
    rotate_x() +
    geom_hline(yintercept = 75, colour = "red") +
    theme(axis.text.x = element_text(size = rel(0.5)))

signatures_keep <- sig_length %>%
    filter(Length >= 75) %>%
    pull(Signature) %>%
    as.character()

# what is being dropped
sig_length %>%
    filter(Length < 75) %>%
    pull(Signature) %>% 
    as.character()
##  [1] "Human fetal 23-Striatum/Cortical neurons"                      
##  [2] "Human fetal 24-Radial glia/Glioblast/Forebrain progenitor EMX1"
##  [3] "Human fetal cerebellum 20-Choroid"                             
##  [4] "Human fetal pL3"                                               
##  [5] "Human fetal pM2"                                               
##  [6] "Human fetal 30-Midbrain/Hindbrain inhibitory neuroblast"       
##  [7] "Human fetal 14-GABAergic forebrain"                            
##  [8] "Human fetal pC1"                                               
##  [9] "Human fetal pL1"                                               
## [10] "Human fetal pM1"                                               
## [11] "CGE-CALB2+,NPAS3+"                                             
## [12] "Human fetal 2-Inhibitory neurons Midbrain, possibly GABAergic" 
## [13] "Human fetal pL2"                                               
## [14] "Human fetal 6-Cortical Interneurons"                           
## [15] "Human fetal pC2"                                               
## [16] "Human fetal pM3"                                               
## [17] "Human fetal pM4"                                               
## [18] "Human fetal pC3"                                               
## [19] "Human fetal adrenal2 connecting Progenitor cells"              
## [20] "CGE-TOP2A+,HMGB2+"                                             
## [21] "MGE-POU3F2+,CNTNAP2+"                                          
## [22] "LGE-ISL1+,EBF1+ 1"
# total number of signatures
dim(cell_type_anno_all)
## [1] 412   6

Since every study uses a slightly different cell type naming scheme, we will assign a harmonized class label for each cluster, for ease of interpretation:

cell_type_anno_all <- cell_type_anno_all %>% 
    mutate(Keep = ifelse(Cluster %in% signatures_keep, TRUE, FALSE)) %>% 
    mutate(Class = case_when(
        grepl("-P|prolif|TOP2A|Cycling|div", Cluster) & !grepl("Pericytes", Cluster) ~ "Proliferating progenitors",
        grepl("RG|[Rr]adial", Cluster) &
            !grepl("NRGN", Cluster) &
            !grepl("[Oo]lig", Cluster) ~ "Radial glia",
        grepl("NSC", Cluster) ~ "Neural stem cell",
        grepl("OPC|Oligodendrocyte progenitor cell|Oligodendrocyte precurso|COP", Cluster) ~ "Oligodendrocyte precursors",
        grepl("NFOL|MOL|[Oo]ligo|OL", Cluster) ~ "Oligodendrocytes",
        grepl("ASEP|EPEN|[Ee]pendymal|[Cc]horoid|CPLX", Cluster) ~ "Ependymal",
        grepl("AST|Ast|Astr|BG", Cluster) ~ "Astrocytes",
        grepl("MNG|[Mm]eninges|VLM", Cluster) ~ "Meninges",
        grepl("Mesenchym", Cluster) ~ "Mesenchyme",
        grepl("PERI|[Pp]ericyte|[Mm]ural|Vascular|ENDO|[Ee]ndo|[Ff]ibroblast|VSMC", Cluster) ~ "Mural",
        grepl("Muscle|Myo", Cluster) ~ "Muscle",
        grepl("Glia|GLIP|[Gg]lioblast", Cluster) ~ "Glial progenitors",
        grepl("ERY|Immune|MGL|MAC|Microgl|Macro|Leuko|Erythro| T ", Cluster) ~ "Immune",
        grepl("SCP|SCHW|[Cc]hromaffin|Bridge|[Ss]ympatho|Adrenal|NCC|Melano", Cluster) ~ "Neural crest lineages",
        grepl("EN|EMX|EXN|ExN|[Ee]xcit|nEN|Pyram", Cluster) & !grepl("ENC", Cluster) ~ "Excitatory neurons",
        grepl("Human fetal GE [pP]", Cluster) ~ "GE neural precursors",
        grepl("GE|GABA|nIN|MGIN|MGE|CGE|LGE|SST|PV|[Ii]nhib|CIN|PV|SST|VIP|SV2C|Somato|Parv|pC|pM|pL|Inter", Cluster) &
            !grepl("[Mm]idbrain|[Hh]indbrain", Cluster) ~ "GE/Inhibitory neurons",
        grepl("EXIP|NEURP|IP|[Ii]ntermediate|prog|Neurogenic", Cluster) &
            !grepl("VIP", Cluster) & !grepl("Human fetal progenitor:", Cluster) ~ "Neuronal progenitors",
        grepl("SPN|Str|STR|SMSN|Striatum", Cluster) ~ "Striatal neurons",
        grepl("GN|iCN|INs|MLI|Moto|MN|NRGN|[Nn]eu|MFN|CJRZN|UBC|GABAN|NEUR|THLN|SN|INH|SRN|ACHN", Cluster) & !grepl("SMSN", Cluster) ~ "Other neurons",
        grepl("Human fetal cortex:|Human fetal progenitor:|Human fetal CS12-13:", Cluster) ~ "Unlabelled",
        TRUE ~ "Other"))

save(cell_type_anno_all, signatures_keep, signatures_sym_all, signatures_ens_all, signatures_keep,
     file = glue("{out}/signatures.Rda"))

5 Prepare supplementary table

Here, we'll prepare a supplementary table containing all the reference gene signatures and their associated cell types/datasets from which they originate.

# collapse signatures into strings
sigs_sym_df <- imap_dfr(signatures_sym_all,
                        ~ data.frame(Cluster = .y, Signature_sym = glue_collapse(.x, sep = ",")))

sigs_ens_df <- imap_dfr(signatures_ens_all,
                        ~ data.frame(Cluster = .y, Signature_ENS = glue_collapse(.x, sep = ",")))

# join with cell type annotation
TABLE_ref_sigs <- cell_type_anno_all %>% 
    left_join(sigs_sym_df) %>% 
    left_join(sigs_ens_df) %>%
    # filter to kept signatures
    filter(Keep) %>% 
    select(-Keep) %>%
    mutate(Cell_type = ifelse(is.na(Cell_type), Cluster, Cell_type))
## Joining with `by = join_by(Cluster)`
## Joining with `by = join_by(Cluster)`
rr_write_tsv(TABLE_ref_sigs,
             glue("{out}/TABLE_reference_signatures.tsv"),
             "Cell type specific reference signatures and associated metadata and dataset info")
## ...writing description of TABLE_reference_signatures.tsv to public/output/02/TABLE_reference_signatures.desc

6 Compare signatures

We have assembled signatures from two species, from multiple marker-identification approaches, and from multiple studies. As a sanity check, we compute pairwise Jaccard Index for overlap in genes between the signatures, in order to confirm that similar cell types do have similar gene signatures.

# calculate Jaccard index as follows:
# |X and Y| / |X or Y|
jaccard <- function(x, y) length(base::intersect(x, y)) / length(base::union(x, y))

signatures_overlap <- sapply(signatures_sym_all[signatures_keep],
                             function(x) sapply(signatures_sym_all[signatures_keep],
                                                function(y) jaccard(x, y)))

anno <- cell_type_anno_all %>% select(Cluster, Dataset, Species, Class) %>% tibble::column_to_rownames(var = "Cluster")

palette_dataset <- set_qual_pal(length(unique(anno$Dataset)))
names(palette_dataset) <- unique(anno$Dataset)

hm_jaccard <- pheatmap(signatures_overlap,
                       color             = custom_magma,
                       border_color      = NA,
                       treeheight_row    = 50,
                       treeheight_col    = 0,
                       cutree_rows       = 35,
                       cutree_cols       = 35,
                       annotation_row    = anno,
                       annotation_col    = anno,
                       annotation_colors = list("Dataset" = palette_dataset,
                                                "Species" = c("Mouse" = "gray90", "Human" = "black"),
                                                "Class"   = palette_class),
                       cellwidth         = 3,
                       cellheight        = 3,
                       fontsize_row      = 4,
                       fontsize_col      = 4,
                       filename          = glue("{figout}/signature_jaccard.png"))

# save heatmap to extract clustering order
save(hm_jaccard, file = glue("{out}/hm_jaccard.Rda"))

knitr::include_graphics(glue("{figout}/signature_jaccard.png"))

7 Stats

cell_type_stats <- cell_type_anno_all %>%
    filter(Cluster %in% signatures_keep) %>% 
    mutate(Sample = case_when(
        Dataset == "Jessa et al 2019" & grepl("Forebrain", Sample) ~ "Mouse forebrain",
        Dataset == "Jessa et al 2019" & grepl("Pons", Sample) ~ "Mouse pons",
        TRUE ~ Sample
    )) %>% 
    mutate(Age = case_when(
        Dataset == "Jessa et al 2019" & grepl("forebrain", Sample) ~ "Mouse E12-P6",
        Dataset == "Jessa et al 2019" & grepl("pons", Sample) ~ "Mouse E12-P6",
        TRUE ~ Age
    )) %>% 
    group_by(Sample, Age, Dataset) %>% count() %>% arrange(Dataset)

sum(cell_type_stats$n)
## [1] 390
kableExtra::kable(cell_type_stats)
Sample Age Dataset n
Human fetal cerebellum 9-21 PCW Aldinger et al 2021 20
Striatum Mouse P9 Anderson et al 2020 38
Human 4PCW embryo neural lineages Human fetal Dong et al 2020 14
Human 8-14PCW fetal adrenal glands Human fetal Dong et al 2020 5
Human fetal adrenal gland Human fetal 7-17PCW Jansky et al 2021 18
Mouse forebrain E10.5 Jessa et al 2022 8
Mouse forebrain E12.5 Jessa et al 2022 14
Mouse forebrain E13.5 Jessa et al 2022 14
Mouse forebrain E15.5 Jessa et al 2022 17
Mouse forebrain E16.5 Jessa et al 2022 19
Mouse forebrain E18.5 Jessa et al 2022 23
Mouse forebrain P0 Jessa et al 2022 20
Mouse forebrain P3 Jessa et al 2022 16
Mouse forebrain P6 Jessa et al 2022 13
Human fetal adrenal glands Human fetal 8-21PCW Kildisiute et al 2021 10
V-SVZ Mouse adult Mizrak et al 2019 22
Human fetal cortex/MGE Human fetal Nowakowski et al 2017 47
Human fetal forebrain 8-10GW VanBruggen et al 2021 24
Human ped/adult cortex Human ped/adult Velmeshev et al 2019 13
Human fetal GE Human fetal Yu et al 2021 35
cell_type_stats %>%
    tibble::rowid_to_column(var = "Order") %>% 
    ggplot(aes(x = Order, y = n)) +
    geom_col(aes(fill = Dataset), width = 0.5) +
    scale_fill_manual(values = palette_dataset) +
    coord_flip()


8 Reproducibility

This document was last rendered on:

## 2024-11-01 11:43:26

The git repository and last commit:

## Local:    main /project/kleinman/bhavyaa.chandarana/from_hydra/2023-05-NB-FOXR2/public
## Remote:   main @ origin (https://github.com/fungenomics/NB-FOXR2.git)
## Head:     [0e89693] 2024-09-12: Initial commit

The random seed was set with set.seed(100)

The R session info:

## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value
##  version  R version 4.1.2 (2021-11-01)
##  os       Rocky Linux 8.10 (Green Obsidian)
##  system   x86_64, linux-gnu
##  ui       X11
##  language (EN)
##  collate  en_US.UTF-8
##  ctype    en_US.UTF-8
##  tz       America/Toronto
##  date     2024-11-01
##  pandoc   1.19.2.1 @ /cvmfs/soft.computecanada.ca/gentoo/2020/usr/bin/ (via rmarkdown)
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  ! package        * version date (UTC) lib source
##  P abind            1.4-5   2016-07-21 [?] CRAN (R 4.1.2)
##  P BiocManager      1.30.15 2021-05-11 [?] CRAN (R 4.1.2)
##  P bit              4.0.4   2020-08-04 [?] CRAN (R 4.1.2)
##  P bit64            4.0.5   2020-08-30 [?] CRAN (R 4.1.2)
##  P bslib            0.3.1   2021-10-06 [?] CRAN (R 4.1.2)
##  P cachem           1.0.6   2021-08-19 [?] CRAN (R 4.1.2)
##  P callr            3.7.6   2024-03-25 [?] RSPM
##  P cellranger       1.1.0   2016-07-27 [?] CRAN (R 4.1.2)
##  P cli              3.6.1   2023-03-23 [?] RSPM (R 4.1.2)
##  P cluster          2.1.2   2021-04-17 [?] CRAN (R 4.1.2)
##  P codetools        0.2-18  2020-11-04 [?] CRAN (R 4.1.2)
##  P colorspace       2.0-2   2021-06-24 [?] CRAN (R 4.1.2)
##  P conflicted       1.2.0   2023-02-01 [?] CRAN (R 4.1.2)
##  P cowplot          1.1.1   2020-12-30 [?] CRAN (R 4.1.2)
##  P crayon           1.4.2   2021-10-29 [?] CRAN (R 4.1.2)
##  P data.table       1.14.2  2021-09-27 [?] CRAN (R 4.1.2)
##  P deldir           1.0-6   2021-10-23 [?] CRAN (R 4.1.2)
##  P devtools         2.4.5   2022-10-11 [?] CRAN (R 4.1.2)
##  P digest           0.6.35  2024-03-11 [?] CRAN (R 4.1.2)
##  P dplyr          * 1.1.1   2023-03-22 [?] CRAN (R 4.1.2)
##  P ellipsis         0.3.2   2021-04-29 [?] CRAN (R 4.1.2)
##  P evaluate         0.23    2023-11-01 [?] CRAN (R 4.1.2)
##  P fansi            1.0.2   2022-01-14 [?] CRAN (R 4.1.2)
##  P farver           2.1.0   2021-02-28 [?] CRAN (R 4.1.2)
##  P fastmap          1.1.0   2021-01-25 [?] CRAN (R 4.1.2)
##  P fitdistrplus     1.1-6   2021-09-28 [?] CRAN (R 4.1.2)
##  P fs               1.5.2   2021-12-08 [?] CRAN (R 4.1.2)
##  P future           1.25.0  2022-04-24 [?] CRAN (R 4.1.2)
##  P future.apply     1.8.1   2021-08-10 [?] CRAN (R 4.1.2)
##  P generics         0.1.3   2022-07-05 [?] CRAN (R 4.1.2)
##  P ggplot2        * 3.4.2   2023-04-03 [?] CRAN (R 4.1.2)
##  P ggrepel          0.9.1   2021-01-15 [?] CRAN (R 4.1.2)
##  P ggridges         0.5.3   2021-01-08 [?] CRAN (R 4.1.2)
##  P git2r            0.29.0  2021-11-22 [?] CRAN (R 4.1.2)
##  P globals          0.14.0  2020-11-22 [?] CRAN (R 4.1.2)
##  P glue           * 1.6.2   2022-02-24 [?] CRAN (R 4.1.2)
##  P goftest          1.2-3   2021-10-07 [?] CRAN (R 4.1.2)
##  P gridExtra        2.3     2017-09-09 [?] CRAN (R 4.1.2)
##  P gtable           0.3.0   2019-03-25 [?] CRAN (R 4.1.2)
##  P here           * 1.0.1   2020-12-13 [?] CRAN (R 4.1.2)
##  P highr            0.9     2021-04-16 [?] CRAN (R 4.1.2)
##  P hms              1.1.1   2021-09-26 [?] CRAN (R 4.1.2)
##  P htmltools        0.5.2   2021-08-25 [?] CRAN (R 4.1.2)
##  P htmlwidgets      1.5.4   2021-09-08 [?] CRAN (R 4.1.2)
##  P httpuv           1.6.5   2022-01-05 [?] CRAN (R 4.1.2)
##  P httr             1.4.2   2020-07-20 [?] CRAN (R 4.1.2)
##  P ica              1.0-2   2018-05-24 [?] CRAN (R 4.1.2)
##  P igraph           2.0.3   2024-03-13 [?] CRAN (R 4.1.2)
##  P irlba            2.3.5   2021-12-06 [?] CRAN (R 4.1.2)
##  P jquerylib        0.1.4   2021-04-26 [?] CRAN (R 4.1.2)
##  P jsonlite         1.8.8   2023-12-04 [?] CRAN (R 4.1.2)
##  P kableExtra       1.3.4   2021-02-20 [?] CRAN (R 4.1.2)
##  P KernSmooth       2.23-20 2021-05-03 [?] CRAN (R 4.1.2)
##  P knitr            1.37    2021-12-16 [?] CRAN (R 4.1.2)
##  P labeling         0.4.2   2020-10-20 [?] CRAN (R 4.1.2)
##  P later            1.3.0   2021-08-18 [?] CRAN (R 4.1.2)
##  P lattice          0.20-45 2021-09-22 [?] CRAN (R 4.1.2)
##  P lazyeval         0.2.2   2019-03-15 [?] CRAN (R 4.1.2)
##  P leiden           0.3.9   2021-07-27 [?] CRAN (R 4.1.2)
##  P lifecycle        1.0.3   2022-10-07 [?] CRAN (R 4.1.2)
##  P listenv          0.8.0   2019-12-05 [?] CRAN (R 4.1.2)
##  P lmtest           0.9-39  2021-11-07 [?] CRAN (R 4.1.2)
##  P magrittr       * 2.0.3   2022-03-30 [?] CRAN (R 4.1.2)
##  P MASS             7.3-54  2021-05-03 [?] CRAN (R 4.1.2)
##  P Matrix           1.3-4   2021-06-01 [?] CRAN (R 4.1.2)
##  P matrixStats      0.61.0  2021-09-17 [?] CRAN (R 4.1.2)
##  P memoise          2.0.1   2021-11-26 [?] CRAN (R 4.1.2)
##  P mgcv             1.8-38  2021-10-06 [?] CRAN (R 4.1.2)
##  P mime             0.12    2021-09-28 [?] CRAN (R 4.1.2)
##  P miniUI           0.1.1.1 2018-05-18 [?] CRAN (R 4.1.2)
##  P munsell          0.5.0   2018-06-12 [?] CRAN (R 4.1.2)
##  P nlme             3.1-153 2021-09-07 [?] CRAN (R 4.1.2)
##  P parallelly       1.30.0  2021-12-17 [?] CRAN (R 4.1.2)
##  P patchwork        1.1.1   2020-12-17 [?] CRAN (R 4.1.2)
##  P pbapply          1.5-0   2021-09-16 [?] CRAN (R 4.1.2)
##  P pheatmap       * 1.0.12  2019-01-04 [?] CRAN (R 4.1.2)
##  P pillar           1.9.0   2023-03-22 [?] RSPM (R 4.1.2)
##  P pkgbuild         1.4.2   2023-06-26 [?] CRAN (R 4.1.2)
##  P pkgconfig        2.0.3   2019-09-22 [?] CRAN (R 4.1.2)
##  P pkgload          1.3.3   2023-09-22 [?] CRAN (R 4.1.2)
##  P plotly           4.10.0  2021-10-09 [?] CRAN (R 4.1.2)
##  P plyr             1.8.6   2020-03-03 [?] CRAN (R 4.1.2)
##  P png              0.1-7   2013-12-03 [?] CRAN (R 4.1.2)
##  P polyclip         1.10-0  2019-03-14 [?] CRAN (R 4.1.2)
##  P prettyunits      1.1.1   2020-01-24 [?] CRAN (R 4.1.2)
##  P processx         3.8.4   2024-03-16 [?] RSPM
##  P profvis          0.3.8   2023-05-02 [?] CRAN (R 4.1.2)
##  P promises         1.2.0.1 2021-02-11 [?] CRAN (R 4.1.2)
##  P ps               1.7.6   2024-01-18 [?] RSPM
##  P purrr          * 1.0.1   2023-01-10 [?] CRAN (R 4.1.2)
##  P R6               2.5.1   2021-08-19 [?] CRAN (R 4.1.2)
##  P RANN             2.6.1   2019-01-08 [?] CRAN (R 4.1.2)
##  P RColorBrewer   * 1.1-2   2014-12-07 [?] CRAN (R 4.1.2)
##  P Rcpp             1.0.8   2022-01-13 [?] CRAN (R 4.1.2)
##  P RcppAnnoy        0.0.19  2021-07-30 [?] CRAN (R 4.1.2)
##  P readr          * 2.1.1   2021-11-30 [?] CRAN (R 4.1.2)
##  P readxl         * 1.3.1   2019-03-13 [?] CRAN (R 4.1.2)
##  P remotes          2.4.2.1 2023-07-18 [?] CRAN (R 4.1.2)
##  P renv             1.0.3   2023-09-19 [?] CRAN (R 4.1.2)
##  P reshape2         1.4.4   2020-04-09 [?] CRAN (R 4.1.2)
##  P reticulate       1.23    2022-01-14 [?] CRAN (R 4.1.2)
##  P rlang            1.1.3   2024-01-10 [?] CRAN (R 4.1.2)
##  P rmarkdown        2.11    2021-09-14 [?] CRAN (R 4.1.2)
##  P ROCR             1.0-11  2020-05-02 [?] CRAN (R 4.1.2)
##  P rpart            4.1-15  2019-04-12 [?] CRAN (R 4.1.2)
##  P rprojroot        2.0.2   2020-11-15 [?] CRAN (R 4.1.2)
##  P rstudioapi       0.13    2020-11-12 [?] CRAN (R 4.1.2)
##  P Rtsne            0.15    2018-11-10 [?] CRAN (R 4.1.2)
##  P rvest            1.0.2   2021-10-16 [?] CRAN (R 4.1.2)
##  P sass             0.4.0   2021-05-12 [?] CRAN (R 4.1.2)
##  P scales           1.2.1   2022-08-20 [?] CRAN (R 4.1.2)
##  P scattermore      0.7     2020-11-24 [?] CRAN (R 4.1.2)
##  P sctransform      0.3.3   2022-01-13 [?] CRAN (R 4.1.2)
##  P sessioninfo      1.2.2   2021-12-06 [?] CRAN (R 4.1.2)
##  P Seurat         * 4.0.0   2021-01-30 [?] CRAN (R 4.1.2)
##  P SeuratObject   * 4.0.4   2021-11-23 [?] CRAN (R 4.1.2)
##  P shiny            1.7.1   2021-10-02 [?] CRAN (R 4.1.2)
##  P spatstat         1.64-1  2020-05-12 [?] CRAN (R 4.1.2)
##  P spatstat.data    2.1-2   2021-12-17 [?] CRAN (R 4.1.2)
##  P spatstat.utils   2.3-0   2021-12-12 [?] CRAN (R 4.1.2)
##  P stringi          1.7.6   2021-11-29 [?] CRAN (R 4.1.2)
##  P stringr          1.5.0   2022-12-02 [?] CRAN (R 4.1.2)
##  P survival         3.2-13  2021-08-24 [?] CRAN (R 4.1.2)
##  P svglite          2.0.0   2021-02-20 [?] CRAN (R 4.1.2)
##  P systemfonts      1.0.3   2021-10-13 [?] CRAN (R 4.1.2)
##  P tensor           1.5     2012-05-05 [?] CRAN (R 4.1.2)
##  P tibble           3.2.1   2023-03-20 [?] RSPM (R 4.1.2)
##  P tidyr          * 1.3.0   2023-01-24 [?] CRAN (R 4.1.2)
##  P tidyselect       1.2.0   2022-10-10 [?] CRAN (R 4.1.2)
##  P tzdb             0.3.0   2022-03-28 [?] CRAN (R 4.1.2)
##  P urlchecker       1.0.1   2021-11-30 [?] CRAN (R 4.1.2)
##  P usethis          2.2.2   2023-07-06 [?] CRAN (R 4.1.2)
##  P utf8             1.2.2   2021-07-24 [?] CRAN (R 4.1.2)
##  P uwot             0.1.11  2021-12-02 [?] CRAN (R 4.1.2)
##  P vctrs            0.6.5   2023-12-01 [?] CRAN (R 4.1.2)
##  P viridis        * 0.5.1   2018-03-29 [?] RSPM (R 4.1.2)
##  P viridisLite    * 0.3.0   2018-02-01 [?] CRAN (R 4.1.2)
##  P vroom            1.5.7   2021-11-30 [?] CRAN (R 4.1.2)
##  P webshot          0.5.2   2019-11-22 [?] CRAN (R 4.1.2)
##  P withr            2.5.0   2022-03-03 [?] CRAN (R 4.1.2)
##  P xfun             0.29    2021-12-14 [?] CRAN (R 4.1.2)
##  P xml2             1.3.3   2021-11-30 [?] CRAN (R 4.1.2)
##  P xtable           1.8-4   2019-04-21 [?] CRAN (R 4.1.2)
##  P yaml             2.2.1   2020-02-01 [?] CRAN (R 4.1.2)
##  P zoo              1.8-9   2021-03-09 [?] CRAN (R 4.1.2)
## 
##  [1] /project/kleinman/bhavyaa.chandarana/from_hydra/2023-05-NB-FOXR2/public/renv/library/R-4.1/x86_64-pc-linux-gnu
##  [2] /home/kleinman/bhavyaa.chandarana/.cache/R/renv/sandbox/R-4.1/x86_64-pc-linux-gnu/145cef2c
## 
##  P ── Loaded and on-disk path mismatch.
## 
## ──────────────────────────────────────────────────────────────────────────────


A project of the Kleinman Lab at McGill University, using the rr reproducible research template.