Petropoulos, S., Edsgärd, D., Reinius, B., Deng, Q., Panula, S.P., Codeluppi, S., Plaza Reyes, A., Linnarsson, S., Sandberg, R., and Lanner, F. (2016). Single-Cell RNA-Seq Reveals Lineage and X Chromosome Dynamics in Human Preimplantation Embryos. Cell 165, 1012–1026.

  • BioProject Accession: PRJEB11202
  • ArrayExpress: E-MTAB-3929



Load required packages.

library(tidyverse)
library(magrittr)
library(Matrix)
library(Seurat)
library(extrafont)
library(patchwork)
# library(tidylog)
Sys.time()
## [1] "2020-08-03 17:22:12 CDT"

Data preparation

Functions loading

source(
    file = file.path(
        SCRIPT_DIR,
        "utilities.R"
    )
)

Data loading

embedding <- read_csv(
    file = "embedding_ncomponents9_seed20200317.csv"
) %>%
    select(cell:y_tsne, x_phate, y_phate)
## Parsed with column specification:
## cols(
##   cell = col_character(),
##   batch = col_character(),
##   louvain = col_double(),
##   x_tsne = col_double(),
##   y_tsne = col_double(),
##   x_umap = col_double(),
##   y_umap = col_double(),
##   x_fitsne = col_double(),
##   y_fitsne = col_double(),
##   x_phate = col_double(),
##   y_phate = col_double()
## )
embedding %>% head()
reticulate::py_discover_config()
## python:         /Users/jialei/.pyenv/shims/python
## libpython:      /Users/jialei/.pyenv/versions/3.8.2/lib/libpython3.8.dylib
## pythonhome:     /Users/jialei/.pyenv/versions/3.8.2:/Users/jialei/.pyenv/versions/3.8.2
## version:        3.8.2 (default, May 23 2020, 03:35:41)  [Clang 11.0.3 (clang-1103.0.32.62)]
## numpy:          /Users/jialei/.pyenv/versions/3.8.2/lib/python3.8/site-packages/numpy
## numpy_version:  1.19.0
## 
## NOTE: Python version was forced by RETICULATE_PYTHON
np <- reticulate::import("numpy", convert = TRUE)
scipy.sparse <- reticulate::import(module = "scipy.sparse", convert = TRUE)

matrix_readcount_use <- scipy.sparse$load_npz("../matrix_readcount.npz")
matrix_readcount_use_features <- np$load("../matrix_readcount_features.npy")
matrix_readcount_use_barcodes <- np$load("../matrix_readcount_barcodes.npy")
colnames(matrix_readcount_use) <- matrix_readcount_use_barcodes
# rownames(matrix_readcount_use) <- matrix_readcount_use_features
rownames(matrix_readcount_use) <- paste(
    gene_symbo_info$X1,
    gene_symbo_info$X2,
    sep = "_"
)

matrix_readcount_use <- matrix_readcount_use[, embedding$cell]

# calculate CPM
matrix_cpm_use <- calc_cpm(matrix_readcount_use)

stopifnot(
    dim(matrix_readcount_use) == dim(matrix_cpm_use)
)
print(dim(matrix_readcount_use))
## [1] 33538  1529
walk(list(embedding, matrix_readcount_use, matrix_cpm_use), function(x) {
    print(object.size(x), units = "auto", standard = "SI")
})
## 282.9 kB
## 190.6 MB
## 190.6 MB

Profiling of human pre-implantation

Add metadata.

embedding %<>%
    left_join(
        x = read_delim("../E-MTAB-3929.sdrf.txt", delim = "\t") %>%
            select(
                "Comment[ENA_RUN]",
                "Characteristics[individual]",
                "Characteristics[inferred lineage]"
            ) %>%
            rename(
                cell = `Comment[ENA_RUN]`,
                embryo = `Characteristics[individual]`,
                lineage = `Characteristics[inferred lineage]`
            )
    )
## Warning: Duplicated column names deduplicated: 'Protocol REF' => 'Protocol
## REF_1' [17], 'Protocol REF' => 'Protocol REF_2' [24], 'Performer' =>
## 'Performer_1' [25], 'Protocol REF' => 'Protocol REF_3' [33], 'Protocol REF'
## => 'Protocol REF_4' [36], 'Derived Array Data File' => 'Derived Array Data
## File_1' [37], 'Comment [Derived ArrayExpress FTP file]' => 'Comment [Derived
## ArrayExpress FTP file]_1' [38], 'Protocol REF' => 'Protocol REF_5' [39],
## 'Derived Array Data File' => 'Derived Array Data File_2' [40], 'Comment [Derived
## ArrayExpress FTP file]' => 'Comment [Derived ArrayExpress FTP file]_2' [41],
## 'Protocol REF' => 'Protocol REF_6' [42], 'Derived Array Data File' => 'Derived
## Array Data File_3' [43], 'Comment [Derived ArrayExpress FTP file]' => 'Comment
## [Derived ArrayExpress FTP file]_3' [44]
## Parsed with column specification:
## cols(
##   .default = col_character(),
##   `Characteristics[cell]` = col_double(),
##   `Characteristics[inferred pseudo-time]` = col_double(),
##   `Factor Value[cell]` = col_double()
## )
## See spec(...) for full column specifications.
## Joining, by = "cell"
embedding %>% head()
# clean up
embedding %>%
    pull(embryo) %>%
    table()
## .
##        E3.1        E3.2        E3.3        E3.4       E3.45       E3.46 
##           5           8           5           3           8           7 
##       E3.47       E3.48       E3.49       E3.50       E3.51       E3.52 
##           7           7           8           6           6           7 
##       E3.53        E4.1       E4.10       E4.11        E4.2 E4.24_5_0_4 
##           4           5          11           1           2           9 
##        E4.3   E4.31_5_1        E4.4        E4.5        E4.6        E4.7 
##          16           9          18          16           7           8 
##        E4.8        E4.9  E4.late.33  E4.late.34  E4.late.35        E5.1 
##          21          19          11          22          15           5 
##       E5.10       E5.11       E5.12       E5.13       E5.14       E5.15 
##          18          14          13          31          30          24 
##       E5.16        E5.2        E5.3       E5.37       E5.38       E5.39 
##          29           9          12          13           2           7 
##       E5.40       E5.41       E5.42       E5.43        E5.5        E5.6 
##          26          19          10          19          11          14 
##        E5.7        E5.8        E5.9 E5.early.31 E5.early.36        E6.1 
##          32           7           8          10          14          16 
##       E6.10       E6.11       E6.12       E6.13       E6.14       E6.15 
##          16           7          35          39          31          38 
##       E6.16       E6.17       E6.18        E6.2       E6.22        E6.3 
##          12          46          23          11          22           6 
##        E6.4        E6.6        E6.7        E6.8        E6.9       E7.10 
##           6          21           8          60          18          16 
##       E7.11       E7.12       E7.13       E7.14       E7.15       E7.16 
##          23          21          12          22          21          64 
##       E7.17       E7.19        E7.2        E7.3        E7.4        E7.5 
##          50          22          27          22          38          10 
##        E7.6        E7.7        E7.8        E7.9 
##          27          21          31          39
embedding %<>%
    mutate(
        developmental_stage = str_remove(
            string = embryo,
            pattern = "\\.[0-9_]+"
        ) %>%
            str_replace(
                pattern = "\\.",
                replacement = "_"
            ),
        developmental_stage = factor(
            developmental_stage,
            levels = c(
                "E3",
                "E4",
                "E4_late",
                "E5_early",
                "E5",
                "E6",
                "E7"
            )
        ),
        #
        developmental_stage2 = str_remove(
            string = developmental_stage,
            pattern = "_.+$"
        ),
        developmental_stage2 = factor(
            developmental_stage2,
            levels = str_sort(unique(developmental_stage2), numeric = TRUE)
        ),
        #
        lineage = factor(
            lineage,
            levels = c(
                "epiblast",
                "primitive endoderm",
                "trophectoderm",
                "not applicable"
            )
        ),
    )

Summarize sequencing depth.

embedding %>%
    mutate(
        num_umis = colSums(matrix_readcount_use[, cell]),
        num_genes = colSums(matrix_readcount_use[, cell] > 0)
    ) %>%
    group_by(louvain) %>%
    summarise(
        num_cell = n(),
        median_umis = median(num_umis),
        median_genes = median(num_genes)
    ) %>%
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")
## `summarise()` ungrouping output (override with `.groups` argument)

louvain num_cell median_umis median_genes
0 294 2045877 11683.0
1 225 1811303 11251.0
2 199 1181313 9059.0
3 169 1346687 10379.0
4 152 1644427 9974.5
5 149 585284 6763.0
6 137 1889933 10987.0
7 120 1334711 9616.0
8 84 1570985 10117.5

Summarize development stage info.

embedding %>%
    dplyr::count(developmental_stage) %>%
    gt::gt() %>%
    gt::cols_label(n = "num_cell") %>%
    gt::tab_options(table.font.size = "median")

developmental_stage num_cell
E3 81
E4 142
E4_late 48
E5_early 24
E5 353
E6 415
E7 466

Summarize lineage info.

embedding %>%
    dplyr::count(lineage) %>%
    gt::gt() %>%
    gt::cols_label(n = "num_cell") %>%
    gt::tab_options(table.font.size = "median")

lineage num_cell
epiblast 127
primitive endoderm 108
trophectoderm 861
not applicable 433

Lineage & developmental stage

p_embedding_cluster <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$louvain %>% as.factor(),
    label = "t-SNE; Cluster",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain)))
    )

p_embedding_developmental_stage <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$developmental_stage,
    label = "t-SNE; Developmental stage",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = ggthemes::tableau_color_pal("Tableau 20")(
            length(levels(embedding$developmental_stage))
        )
    ) +
    labs(color = NULL) +
    guides(colour = guide_legend(override.aes = list(size = 3))) +
    customized_theme()

p_embedding_lineage <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$lineage,
    label = "t-SNE; Lineage",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = ggthemes::tableau_color_pal("Tableau 10")(
            length(levels(embedding$lineage))
        )
    ) +
    labs(color = NULL) +
    guides(colour = guide_legend(override.aes = list(size = 3))) +
    customized_theme()
p_embedding_cluster_phate <- plot_embedding(
    embedding = embedding[, c("x_phate", "y_phate")],
    color_values = embedding$louvain %>% as.factor(),
    label = "PHATE; Cluster",
    # label_position = c(label_x, label_y),
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain)))
    )

p_embedding_developmental_stage_phate <- plot_embedding(
    embedding = embedding[, c("x_phate", "y_phate")],
    color_values = embedding$developmental_stage,
    label = "PHATE; Developmental stage",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = ggthemes::tableau_color_pal("Tableau 20")(
            length(levels(embedding$developmental_stage))
        )
    ) +
    labs(color = NULL) +
    guides(colour = guide_legend(override.aes = list(size = 3))) +
    customized_theme(x = 0.35)

p_embedding_lineage_phate <- plot_embedding(
    embedding = embedding[, c("x_phate", "y_phate")],
    color_values = embedding$lineage,
    label = "PHATE; Lineage",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    scale_color_manual(
        values = ggthemes::tableau_color_pal("Tableau 10")(
            length(levels(embedding$lineage))
        )
    ) +
    labs(color = NULL) +
    guides(colour = guide_legend(override.aes = list(size = 3))) +
    customized_theme(x = 0.35)
list(
    p_embedding_cluster,
    p_embedding_developmental_stage,
    p_embedding_lineage,
    p_embedding_cluster_phate,
    p_embedding_developmental_stage_phate,
    p_embedding_lineage_phate
) %>%
    purrr::reduce(`+`) +
    plot_layout(nrow = 2, byrow = TRUE) +
    plot_annotation(theme = theme(plot.margin = margin()))

Expression

FEATURES_SELECTED <- c(
    "ENSG00000204531_POU5F1",
    "ENSG00000181449_SOX2",
    "ENSG00000111704_NANOG",
    "ENSG00000134853_PDGFRA",
    "ENSG00000136574_GATA4",
    "ENSG00000125798_FOXA2",
    "ENSG00000179348_GATA2",
    "ENSG00000107485_GATA3",
    "ENSG00000153071_DAB2"
    # "ENSG00000087510_TFAP2C",
)

map(FEATURES_SELECTED, function(x) {
    plot_embedding_value(
        embedding = embedding[, c("x_tsne", "y_tsne")],
        color_values = matrix_cpm_use[x, embedding$cell],
        colorbar_position = c(0.15, 0.95),
        label = str_c("t-SNE; ", x),
        label_position = NULL,
        # label_position = c(label_x, label_y),
        geom_point_size = 1,
        sort_values = TRUE,
        FUN = NULL
    )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(ncol = 3, byrow = TRUE) +
    plot_annotation(theme = theme(plot.margin = margin()))

map(FEATURES_SELECTED, function(x) {
    plot_embedding_value(
        embedding = embedding[, c("x_phate", "y_phate")],
        color_values = matrix_cpm_use[x, embedding$cell],
        colorbar_position = c(0.3, 0.95),
        label = str_c("PHATE; ", x),
        label_position = NULL,
        # label_position = c(label_x, label_y),
        geom_point_size = 1,
        sort_values = TRUE,
        FUN = NULL
    )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(ncol = 3, byrow = TRUE) +
    plot_annotation(theme = theme(plot.margin = margin()))

Sex determination

Numbers of genes on sex chromosomes.

map_int(list("X" = "X", "Y" = "Y"), function(x) {
    genePred %>%
        filter(X1 == x) %>%
        pull(X5) %>%
        length()
})
##    X    Y 
## 1078  100
features_y <- genePred %>%
    filter(X1 == "Y") %>%
    pull(X5)
features_y <- gene_symbo_info[match(features_y, gene_symbo_info$X1), ]
features_y <- paste(features_y$X1, features_y$X2, sep = "_")

features_x <- genePred %>%
    filter(X1 == "X") %>%
    pull(X5)
features_x <- gene_symbo_info[match(features_x, gene_symbo_info$X1), ]
features_x <- paste(features_x$X1, features_x$X2, sep = "_")

features_1_22 <- genePred %>%
    filter(X1 %in% 1:22) %>%
    pull(X5)
features_1_22 <- gene_symbo_info[match(features_1_22, gene_symbo_info$X1), ]
features_1_22 <- paste(features_1_22$X1, features_1_22$X2, sep = "_")
Y_EXPR_SUM_THRESHOLD <- 100
map2(list(features_x, features_y), list("X", "Y"), function(x, y) {
    matrix_cpm_use[x, ] %>%
        colSums() %>%
        enframe(
            name = "rank",
            value = "expr"
        ) %>%
        mutate(
            developmental_stage = embedding[
                match(rank, embedding$cell),
                "developmental_stage",
                drop = TRUE
            ]
        ) %>%
        plot_hist(
            x = expr,
            z = developmental_stage,
            binwidth = length(x)
        ) +
        labs(x = str_c("CPM sum of ", y, " genes", " (", length(x), ")"))
}) %>% purrr::reduce(`+`) +
    plot_layout(
        nrow = 1,
        byrow = TRUE,
        guides = "collect"
    ) + geom_vline(
        xintercept = Y_EXPR_SUM_THRESHOLD,
        color = "blue",
        linetype = "dashed",
        size = 0.3
    ) +
    plot_annotation(theme = theme(plot.margin = margin()))

Assign sex for single cells based on whole embryos.

embedding %<>%
    mutate(
        y_expr = matrix_cpm_use[features_y, embedding$cell] %>%
            colSums(),
        sex = ifelse(y_expr >= Y_EXPR_SUM_THRESHOLD, "male", "female")
    )
embedding %>% head()
embryo_sex <- sapply(
    sort(unique(embedding$embryo)),
    function(x) {
        # cat(x, "\n")

        summarized_count <- embedding %>%
            filter(
                embryo == x
            ) %>%
            pull(sex) %>%
            table() %>%
            unlist()

        c(
            "male" = summarized_count["male"] %>% unname(),
            "female" = summarized_count["female"]
        ) %>% unname()
    }
) %>%
    t() %>%
    replace_na(replace = 0) %>%
    as.data.frame() %>%
    rename(
        male = V1,
        female = V2
    )
embryo_sex %>%
    rownames_to_column(var = "embryo")

Embryos with sex undetermined.

embryos_included <- rownames(embryo_sex)[rowSums(embryo_sex > 0) == 1]
embryo_sex[!rownames(embryo_sex) %in% embryos_included, ] %>%
    rownames_to_column(var = "embryo")
embedding %<>%
    mutate(
        sex_embryo = case_when(
            embryo %in% embryos_included & y_expr >= Y_EXPR_SUM_THRESHOLD ~ "male",
            embryo %in% embryos_included & y_expr < Y_EXPR_SUM_THRESHOLD ~ "female",
            !embryo %in% embryos_included ~ "N/A",
        ),
        sex_embryo = factor(
            sex_embryo,
            levels = c("male", "female", "N/A")
        )
    )
embedding

Summarize sex of single cells.

embedding %>%
    count(sex_embryo) %>%
    gt::gt() %>%
    gt::cols_label(
        sex_embryo = "sex",
        n = "num_cell"
    ) %>%
    gt::tab_options(table.font.size = "median")

sex num_cell
male 656
female 703
N/A 170

p_embedding_sex <- plot_embedding(
    embedding = embedding[, c("x_tsne", "y_tsne")],
    color_values = embedding$sex_embryo,
    label = "t-SNE; Sex",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = FALSE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    customized_theme() +
    scale_color_manual(
        name = NULL,
        values = c("darkgreen", "salmon", "grey70")
    ) +
    guides(colour = guide_legend(override.aes = list(size = 3)))

p_embedding_sex_phate <- plot_embedding(
    embedding = embedding[, c("x_phate", "y_phate")],
    color_values = embedding$sex_embryo,
    label = "PHATE; Sex",
    # label_position = c(label_x, label_y),
    show_color_value_labels = FALSE,
    show_color_legend = FALSE,
    geom_point_size = 1,
    sort_values = FALSE
) +
    customized_theme() +
    scale_color_manual(
        name = NULL, values = c("darkgreen", "salmon", "grey70")
    ) +
    guides(colour = guide_legend(override.aes = list(size = 3)))

p_embedding_sex + p_embedding_sex_phate +
    plot_layout(ncol = 2, byrow = TRUE, guides = "collect") +
    plot_annotation(theme = theme(plot.margin = margin()))

embedding %>%
    filter(sex_embryo == "male") %>%
    group_by(developmental_stage) %>%
    summarise(num_cells = n()) %>%
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")
## `summarise()` ungrouping output (override with `.groups` argument)

developmental_stage num_cells
E3 35
E4 83
E4_late 15
E5 206
E6 141
E7 176

map(list(features_y, features_1_22), function(x) {
    embedding %>%
        filter(sex_embryo == "male") %>%
        pull(cell) %>%
        matrix_cpm_use[x, .] %>%
        colSums() %>%
        enframe()
}) %>%
    bind_cols() %>%
    select(c(1, 2, 4)) %>%
    `colnames<-`(c("cell", "value1", "value2")) %>%
    mutate(norm_value = value1 / value2) %>%
    left_join(embedding %>% select(cell, developmental_stage)) %>%
    plot_violin(x = developmental_stage, y = norm_value) +
    scale_x_discrete(name = "Developmental stage, male") +
    scale_y_continuous(name = "Sum of\nnormalized expression of Y")

embedding %>%
    filter(sex_embryo == "female") %>%
    group_by(developmental_stage) %>%
    summarise(num_cells = n()) %>%
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")
## `summarise()` ungrouping output (override with `.groups` argument)

developmental_stage num_cells
E3 33
E4 40
E4_late 33
E5_early 24
E5 133
E6 200
E7 240

map(list(features_x, features_1_22), function(x) {
    embedding %>%
        filter(sex_embryo == "female") %>%
        pull(cell) %>%
        matrix_cpm_use[x, .] %>%
        colSums() %>%
        enframe()
}) %>%
    bind_cols() %>%
    select(c(1, 2, 4)) %>%
    `colnames<-`(c("cell", "value1", "value2")) %>%
    mutate(norm_value = value1 / value2) %>%
    left_join(embedding %>% select(cell, developmental_stage)) %>%
    plot_violin(x = developmental_stage, y = norm_value) +
    scale_x_discrete(name = "Developmental stage, female") +
    scale_y_continuous(name = "Sum of\nnormalized expression of X")

R session info

devtools::session_info()$platform
##  setting  value                       
##  version  R version 4.0.2 (2020-06-22)
##  os       macOS Catalina 10.15.6      
##  system   x86_64, darwin19.5.0        
##  ui       unknown                     
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/Chicago             
##  date     2020-08-03
devtools::session_info()$pack %>%
    as_tibble() %>%
    select(
        package,
        loadedversion,
        date,
        `source`
    ) %>%
    print(n = nrow(.))
## # A tibble: 142 x 4
##     package        loadedversion date       source                              
##     <chr>          <chr>         <chr>      <chr>                               
##   1 abind          1.4-5         2016-07-21 CRAN (R 4.0.0)                      
##   2 ape            5.4           2020-06-03 CRAN (R 4.0.2)                      
##   3 assertthat     0.2.1         2019-03-21 CRAN (R 4.0.0)                      
##   4 backports      1.1.8         2020-06-17 CRAN (R 4.0.1)                      
##   5 blob           1.2.1         2020-01-20 CRAN (R 4.0.0)                      
##   6 broom          0.7.0.9001    2020-07-28 Github (tidymodels/broom@762e3ad)   
##   7 callr          3.4.3.9000    2020-07-31 Github (r-lib/callr@b96da8f)        
##   8 cellranger     1.1.0         2016-07-27 CRAN (R 4.0.0)                      
##   9 checkmate      2.0.0         2020-02-06 CRAN (R 4.0.0)                      
##  10 cli            2.0.2         2020-02-28 CRAN (R 4.0.0)                      
##  11 cluster        2.1.0         2019-06-19 CRAN (R 4.0.2)                      
##  12 codetools      0.2-16        2018-12-24 CRAN (R 4.0.2)                      
##  13 colorspace     1.4-1         2019-03-18 CRAN (R 4.0.0)                      
##  14 cowplot        1.0.0         2019-07-11 CRAN (R 4.0.0)                      
##  15 crayon         1.3.4         2017-09-16 CRAN (R 4.0.0)                      
##  16 data.table     1.13.0        2020-07-24 CRAN (R 4.0.2)                      
##  17 DBI            1.1.0         2019-12-15 CRAN (R 4.0.0)                      
##  18 dbplyr         1.4.4.9000    2020-07-28 Github (tidyverse/dbplyr@a6ed629)   
##  19 deldir         0.1-28        2020-07-15 CRAN (R 4.0.2)                      
##  20 desc           1.2.0         2018-05-01 CRAN (R 4.0.0)                      
##  21 devtools       2.3.1.9000    2020-07-31 Github (r-lib/devtools@df619ce)     
##  22 digest         0.6.25        2020-02-23 CRAN (R 4.0.0)                      
##  23 dplyr          1.0.1.9001    2020-08-03 Github (tidyverse/dplyr@dc3e0e6)    
##  24 ellipsis       0.3.1.9000    2020-07-18 Github (r-lib/ellipsis@57a5071)     
##  25 evaluate       0.14          2019-05-28 CRAN (R 4.0.0)                      
##  26 extrafont      0.17          2014-12-08 CRAN (R 4.0.2)                      
##  27 extrafontdb    1.0           2012-06-11 CRAN (R 4.0.0)                      
##  28 fansi          0.4.1         2020-01-08 CRAN (R 4.0.0)                      
##  29 farver         2.0.3         2020-01-16 CRAN (R 4.0.0)                      
##  30 fastmap        1.0.1         2019-10-08 CRAN (R 4.0.0)                      
##  31 fitdistrplus   1.1-1         2020-05-19 CRAN (R 4.0.0)                      
##  32 forcats        0.5.0.9000    2020-05-28 Github (tidyverse/forcats@ab81d1b)  
##  33 fs             1.5.0.9000    2020-08-03 Github (r-lib/fs@93e70a9)           
##  34 future         1.18.0        2020-07-09 CRAN (R 4.0.2)                      
##  35 future.apply   1.6.0         2020-07-01 CRAN (R 4.0.2)                      
##  36 generics       0.0.2         2018-11-29 CRAN (R 4.0.0)                      
##  37 ggplot2        3.3.2.9000    2020-08-03 Github (tidyverse/ggplot2@f0e561e)  
##  38 ggrepel        0.9.0         2020-07-24 Github (slowkow/ggrepel@4d0ef50)    
##  39 ggridges       0.5.2         2020-01-12 CRAN (R 4.0.0)                      
##  40 ggthemes       4.2.0         2019-05-13 CRAN (R 4.0.0)                      
##  41 globals        0.12.5        2019-12-07 CRAN (R 4.0.0)                      
##  42 glue           1.4.1.9000    2020-07-07 Github (tidyverse/glue@205f18b)     
##  43 goftest        1.2-2         2019-12-02 CRAN (R 4.0.2)                      
##  44 gridExtra      2.3           2017-09-09 CRAN (R 4.0.0)                      
##  45 gt             0.2.1         2020-08-01 Github (rstudio/gt@6058358)         
##  46 gtable         0.3.0         2019-03-25 CRAN (R 4.0.0)                      
##  47 haven          2.3.1         2020-06-01 CRAN (R 4.0.0)                      
##  48 hms            0.5.3         2020-01-08 CRAN (R 4.0.0)                      
##  49 htmltools      0.5.0         2020-06-16 CRAN (R 4.0.1)                      
##  50 htmlwidgets    1.5.1         2019-10-08 CRAN (R 4.0.0)                      
##  51 httpuv         1.5.4         2020-06-06 CRAN (R 4.0.0)                      
##  52 httr           1.4.2         2020-07-20 CRAN (R 4.0.2)                      
##  53 ica            1.0-2         2018-05-24 CRAN (R 4.0.0)                      
##  54 igraph         1.2.5         2020-03-19 CRAN (R 4.0.2)                      
##  55 irlba          2.3.3         2019-02-05 CRAN (R 4.0.2)                      
##  56 jsonlite       1.7.0         2020-06-25 CRAN (R 4.0.2)                      
##  57 KernSmooth     2.23-17       2020-04-26 CRAN (R 4.0.2)                      
##  58 knitr          1.29          2020-06-23 CRAN (R 4.0.2)                      
##  59 labeling       0.3           2014-08-23 CRAN (R 4.0.0)                      
##  60 later          1.1.0.1       2020-06-05 CRAN (R 4.0.0)                      
##  61 lattice        0.20-41       2020-04-02 CRAN (R 4.0.2)                      
##  62 lazyeval       0.2.2         2019-03-15 CRAN (R 4.0.0)                      
##  63 leiden         0.3.3         2020-02-04 CRAN (R 4.0.0)                      
##  64 lifecycle      0.2.0         2020-03-06 CRAN (R 4.0.0)                      
##  65 listenv        0.8.0         2019-12-05 CRAN (R 4.0.0)                      
##  66 lmtest         0.9-37        2019-04-30 CRAN (R 4.0.2)                      
##  67 lubridate      1.7.9         2020-07-11 Github (tidyverse/lubridate@de2ee09)
##  68 magrittr       1.5.0.9000    2020-08-03 Github (tidyverse/magrittr@d6731e3) 
##  69 MASS           7.3-51.6      2020-04-26 CRAN (R 4.0.2)                      
##  70 Matrix         1.2-18        2019-11-27 CRAN (R 4.0.2)                      
##  71 memoise        1.1.0         2017-04-21 CRAN (R 4.0.0)                      
##  72 mgcv           1.8-31        2019-11-09 CRAN (R 4.0.2)                      
##  73 mime           0.9           2020-02-04 CRAN (R 4.0.0)                      
##  74 miniUI         0.1.1.1       2018-05-18 CRAN (R 4.0.0)                      
##  75 modelr         0.1.8.9000    2020-05-19 Github (tidyverse/modelr@16168e0)   
##  76 munsell        0.5.0         2018-06-12 CRAN (R 4.0.0)                      
##  77 nlme           3.1-148       2020-05-24 CRAN (R 4.0.2)                      
##  78 patchwork      1.0.1.9000    2020-06-22 Github (thomasp85/patchwork@82a5e03)
##  79 pbapply        1.4-2         2019-08-31 CRAN (R 4.0.0)                      
##  80 pillar         1.4.6.9000    2020-07-21 Github (r-lib/pillar@8aef8f2)       
##  81 pkgbuild       1.1.0.9000    2020-07-14 Github (r-lib/pkgbuild@3a87bd9)     
##  82 pkgconfig      2.0.3         2019-09-22 CRAN (R 4.0.0)                      
##  83 pkgload        1.1.0         2020-05-29 CRAN (R 4.0.0)                      
##  84 plotly         4.9.2.1       2020-04-04 CRAN (R 4.0.0)                      
##  85 plyr           1.8.6         2020-03-03 CRAN (R 4.0.0)                      
##  86 png            0.1-7         2013-12-03 CRAN (R 4.0.0)                      
##  87 polyclip       1.10-0        2019-03-14 CRAN (R 4.0.2)                      
##  88 prettyunits    1.1.1         2020-01-24 CRAN (R 4.0.2)                      
##  89 processx       3.4.3         2020-07-05 CRAN (R 4.0.2)                      
##  90 promises       1.1.1         2020-06-09 CRAN (R 4.0.0)                      
##  91 ps             1.3.3         2020-05-08 CRAN (R 4.0.0)                      
##  92 purrr          0.3.4.9000    2020-08-03 Github (tidyverse/purrr@eefc561)    
##  93 R6             2.4.1.9000    2020-07-18 Github (r-lib/R6@1415d11)           
##  94 RANN           2.6.1         2019-01-08 CRAN (R 4.0.0)                      
##  95 RColorBrewer   1.1-2         2014-12-07 CRAN (R 4.0.0)                      
##  96 Rcpp           1.0.5         2020-07-06 CRAN (R 4.0.2)                      
##  97 RcppAnnoy      0.0.16        2020-03-08 CRAN (R 4.0.0)                      
##  98 readr          1.3.1.9000    2020-07-16 Github (tidyverse/readr@2ab51b2)    
##  99 readxl         1.3.1.9000    2020-05-28 Github (tidyverse/readxl@3815961)   
## 100 remotes        2.2.0.9000    2020-07-23 Github (r-lib/remotes@d7fe461)      
## 101 reprex         0.3.0         2019-05-16 CRAN (R 4.0.0)                      
## 102 reshape2       1.4.4         2020-04-09 CRAN (R 4.0.0)                      
## 103 reticulate     1.16          2020-05-27 CRAN (R 4.0.2)                      
## 104 rlang          0.4.7.9000    2020-07-31 Github (r-lib/rlang@a144ac0)        
## 105 rmarkdown      2.3.3         2020-07-25 Github (rstudio/rmarkdown@204aa41)  
## 106 ROCR           1.0-11        2020-05-02 CRAN (R 4.0.0)                      
## 107 rpart          4.1-15        2019-04-12 CRAN (R 4.0.2)                      
## 108 rprojroot      1.3-2         2018-01-03 CRAN (R 4.0.0)                      
## 109 rstudioapi     0.11.0-9000   2020-07-31 Github (rstudio/rstudioapi@aa17630) 
## 110 rsvd           1.0.3         2020-02-17 CRAN (R 4.0.0)                      
## 111 Rtsne          0.16          2020-07-03 Github (jkrijthe/Rtsne@14b195f)     
## 112 Rttf2pt1       1.3.8         2020-01-10 CRAN (R 4.0.0)                      
## 113 rvest          0.3.6         2020-07-25 CRAN (R 4.0.2)                      
## 114 sass           0.2.0         2020-03-18 CRAN (R 4.0.2)                      
## 115 scales         1.1.1.9000    2020-07-24 Github (r-lib/scales@9ff4757)       
## 116 sctransform    0.2.1         2019-12-17 CRAN (R 4.0.0)                      
## 117 sessioninfo    1.1.1.9000    2020-07-18 Github (r-lib/sessioninfo@791705b)  
## 118 Seurat         3.2.0.9006    2020-08-01 Github (satijalab/seurat@a1f2f73)   
## 119 shiny          1.5.0.9001    2020-08-03 Github (rstudio/shiny@0b82b12)      
## 120 spatstat       1.64-1        2020-05-12 CRAN (R 4.0.2)                      
## 121 spatstat.data  1.4-3         2020-01-26 CRAN (R 4.0.2)                      
## 122 spatstat.utils 1.17-0        2020-02-07 CRAN (R 4.0.2)                      
## 123 stringi        1.4.6         2020-02-17 CRAN (R 4.0.0)                      
## 124 stringr        1.4.0.9000    2020-06-01 Github (tidyverse/stringr@f70c4ba)  
## 125 styler         1.3.2.9000    2020-07-25 Github (r-lib/styler@16d815e)       
## 126 survival       3.2-3         2020-06-13 CRAN (R 4.0.2)                      
## 127 tensor         1.5           2012-05-05 CRAN (R 4.0.2)                      
## 128 testthat       2.99.0.9000   2020-07-28 Github (r-lib/testthat@0af11cd)     
## 129 tibble         3.0.3.9000    2020-07-21 Github (tidyverse/tibble@b4eec19)   
## 130 tidyr          1.1.1.9000    2020-07-31 Github (tidyverse/tidyr@61e9209)    
## 131 tidyselect     1.1.0.9000    2020-07-11 Github (tidyverse/tidyselect@69fdc9…
## 132 tidyverse      1.3.0.9000    2020-06-01 Github (hadley/tidyverse@8a0bb99)   
## 133 usethis        1.6.1.9001    2020-08-01 Github (r-lib/usethis@00e0600)      
## 134 uwot           0.1.8.9000    2020-08-03 Github (jlmelville/uwot@db9e397)    
## 135 vctrs          0.3.2.9000    2020-07-23 Github (r-lib/vctrs@df8a659)        
## 136 viridisLite    0.3.0         2018-02-01 CRAN (R 4.0.0)                      
## 137 withr          2.2.0         2020-04-20 CRAN (R 4.0.0)                      
## 138 xfun           0.16          2020-07-24 CRAN (R 4.0.2)                      
## 139 xml2           1.3.2         2020-04-23 CRAN (R 4.0.0)                      
## 140 xtable         1.8-4         2019-04-21 CRAN (R 4.0.0)                      
## 141 yaml           2.2.1         2020-02-01 CRAN (R 4.0.0)                      
## 142 zoo            1.8-8         2020-05-02 CRAN (R 4.0.0)