Single cell transcriptomes of human EPS-blastoids generated by Fan et al., 2021
2022-01-25
Fan, Y., Min, Z., Alsolami, S., Ma, Z., Zhang, E., Chen, W., Zhong, K., Pei, W., Kang, X., Zhang, P., et al. (2021). Generation of human blastocyst-like structures from pluripotent stem cells. Cell Discovery 7, 1–14.
- BioProject Accession: PRJNA667174
 - GEO Accession: GSE158971
 
Load required packages.
Sys.time()[1] "2022-01-25 02:49:54 CST"
Data preparation
Functions loading
Data loading
Raw fastq files of this dataset were downloaded and re-processed as described in Yu et al. 2021 to minimize platform and processing differences.
The expression matrix was re-generated from raw fastq files. To make this analysis comparable with the original publication, the same cell ids are retrieved.
PROJECT_DIR <- "/Users/jialei/Dropbox/Data/Projects/UTSW/Peri-implantation"Matrix
BACKED <- NULL
adata <- ad$read_h5ad(
    filename = file.path(
        PROJECT_DIR,
        "raw/public/PRJNA667174",
        "matrix",
        "adata.h5ad"
    ),
    backed = BACKED
)
matrix_readcount_use <- adata |> convert_adata()dim(matrix_readcount_use)[1] 33538 30439
Embedding
EMBEDDING_FILE <- "embedding_ncomponents10_ccc1_seed20210719.csv.gz"
embedding <- vroom::vroom(
    file = file.path(
        PROJECT_DIR,
        "raw/public/PRJNA667174",
        "clustering/PRJNA667174/exploring",
        "Scanpy_Harmony",
        EMBEDDING_FILE
    )
)
embedding |>
    head() |>
    knitr::kable()| cell | batch | louvain | leiden | x_tsne | y_tsne | x_umap | y_umap | x_fitsne | y_fitsne | x_phate | y_phate | x_umap_min_dist=0.1 | y_umap_min_dist=0.1 | x_multicoretsne | y_multicoretsne | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| GSM4816780_AAACCCAAGTCACAGG | GSM4816780 | 0 | 0 | -59.61914 | -34.25100 | -2.434389 | 8.971638 | -68.549462 | 39.35378 | -0.0098444 | -0.0098271 | -2.276734 | 9.453928 | 1.7424585 | 0.0409331 | 
| GSM4816780_AAACCCAAGTTACTCG | GSM4816780 | 3 | 10 | 72.60726 | 81.89310 | 12.410583 | 2.235562 | 2.113421 | 109.57434 | 0.0452768 | 0.0093461 | 12.907623 | 2.995861 | 0.1721521 | 2.7968170 | 
| GSM4816780_AAACCCACATAATCGC | GSM4816780 | 5 | 8 | 10.69915 | 11.80464 | 2.457198 | 12.121967 | -18.971701 | 36.84989 | 0.0163275 | -0.0094425 | 3.231614 | 10.969112 | -0.0700925 | 0.1236116 | 
| GSM4816780_AAACCCACATCATCTT | GSM4816780 | 4 | 3 | -57.99653 | 95.91599 | 12.462027 | 11.089141 | 90.450377 | 15.79619 | 0.0314861 | -0.0030768 | 11.308686 | 10.344496 | -2.5766431 | 1.8918896 | 
| GSM4816780_AAACCCACATTCCTAT | GSM4816780 | 1 | 4 | -14.01938 | -142.56613 | -6.957992 | 10.141818 | -96.927817 | -53.61567 | -0.0092716 | -0.0123081 | -5.528971 | 11.530880 | 2.6173480 | -1.4231000 | 
| GSM4816780_AAACCCAGTGCCGTAC | GSM4816780 | 5 | 2 | -10.25328 | 14.79214 | 3.759502 | 11.010690 | -7.149860 | 32.01512 | 0.0171529 | -0.0095562 | 4.935977 | 10.719850 | -0.4245640 | 0.0006467 | 
dim(embedding)[1] 30439    16
Metadata
cell_metadata <- vroom::vroom(
    file = file.path(
        PROJECT_DIR,
        "raw/public/PRJNA667174",
        "matrix",
        "cell_metadata.csv"
    )
) |>
    dplyr::left_join(
        adata$obs |>
            tibble::rownames_to_column(var = "cell")
    )
cell_metadata |>
    head() |>
    knitr::kable()| cell | lineage | developmental_stage | batch | num_umis | num_features | mt_percentage | 
|---|---|---|---|---|---|---|
| GSM4816780_AAACCCAAGTCACAGG | EPI | D6 | GSM4816780 | 54160 | 6368 | 0.0201440 | 
| GSM4816780_AAACCCAAGTTACTCG | TE | D6 | GSM4816780 | 1824 | 1041 | 0.0010965 | 
| GSM4816780_AAACCCACATAATCGC | TE | D6 | GSM4816780 | 5850 | 2212 | 0.0025641 | 
| GSM4816780_AAACCCACATCATCTT | IM | D6 | GSM4816780 | 898 | 571 | 0.0111359 | 
| GSM4816780_AAACCCACATTCCTAT | IM | D6 | GSM4816780 | 36394 | 6010 | 0.0125295 | 
| GSM4816780_AAACCCAGTGCCGTAC | TE | D6 | GSM4816780 | 4755 | 1953 | 0.0012618 | 
Check memory usage.
purrr::walk(list(matrix_readcount_use, cell_metadata), function(x) {
    print(object.size(x), units = "auto", standard = "SI")
})1.2 GB
3.9 MB
Single-cell transcriptome analysis
embedding |>
    dplyr::group_by(
        batch
    ) |>
    dplyr::summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_percentage = median(mt_percentage)
    ) |>
    gt::gt() |>
    gt::tab_options(table.font.size = "median") |>
    gt::summary_rows(
        columns = c(num_cells),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    ) |>
    gt::summary_rows(
        columns = c(median_umis:median_mt_percentage),
        fns = list(
            Mean = ~ mean(.)
        ),
        decimals = c(2)
    )| batch | num_cells | median_umis | median_features | median_mt_percentage | |
|---|---|---|---|---|---|
| GSM4816780 | 10933 | 6203.0 | 2240.0 | 0.007092199 | |
| GSM4816781 | 11634 | 12780.5 | 3357.0 | 0.052984867 | |
| GSM4816782 | 7872 | 12238.0 | 3778.5 | 0.065663483 | |
| Sum | — | 30,439 | — | — | — | 
| Mean | — | — | 10,407.17 | 3,125.17 | 0.04 | 
embedding |>
    dplyr::group_by(
        leiden
    ) |>
    dplyr::summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_percentage = median(mt_percentage)
    ) |>
    gt::gt() |>
    gt::tab_options(table.font.size = "median") |>
    gt::summary_rows(
        columns = c("num_cells"),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    ) |>
    gt::summary_rows(
        columns = c(median_umis:median_mt_percentage),
        fns = list(
            Mean = ~ mean(.)
        ),
        decimals = 2
    )| leiden | num_cells | median_umis | median_features | median_mt_percentage | |
|---|---|---|---|---|---|
| 0 | 3766 | 30355.5 | 5476.0 | 0.055449145 | |
| 1 | 3391 | 24105.0 | 4961.0 | 0.057462115 | |
| 2 | 3028 | 2982.0 | 1323.0 | 0.013956873 | |
| 3 | 2957 | 841.0 | 534.0 | 0.030703625 | |
| 4 | 2655 | 24943.0 | 5121.0 | 0.055765976 | |
| 5 | 2272 | 23833.0 | 4629.5 | 0.043561692 | |
| 6 | 2050 | 1134.0 | 666.0 | 0.013907496 | |
| 7 | 1990 | 1399.0 | 778.0 | 0.020248509 | |
| 8 | 1304 | 8219.5 | 2591.5 | 0.006524399 | |
| 9 | 1207 | 2036.0 | 1107.0 | 0.054143646 | |
| 10 | 1160 | 3418.0 | 1493.0 | 0.003813516 | |
| 11 | 1029 | 24929.0 | 4990.0 | 0.044210168 | |
| 12 | 904 | 16867.0 | 4129.0 | 0.056618586 | |
| 13 | 717 | 5813.0 | 2375.0 | 0.093905032 | |
| 14 | 592 | 31812.0 | 5605.0 | 0.053662762 | |
| 15 | 410 | 17966.5 | 4359.0 | 0.070959755 | |
| 16 | 382 | 3411.5 | 1537.0 | 0.035595393 | |
| 17 | 367 | 24991.0 | 5047.0 | 0.053125720 | |
| 18 | 258 | 1479.0 | 758.5 | 0.039723450 | |
| Sum | — | 30,439 | — | — | — | 
| Mean | — | — | 13,186.05 | 3,025.29 | 0.04 | 
Embedding visualization
x_column <- "x_umap_min_dist=0.1"
y_column <- "y_umap_min_dist=0.1"
# GEOM_POINT_SIZE <- 1.25
GEOM_POINT_SIZE <- 0.3
EMBEDDING_TITLE_PREFIX <- "UMAP"
RASTERISED <- TRUEClustering & UMI & MT
p_embedding_leiden <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$leiden |> as.factor(),
    label = paste(EMBEDDING_TITLE_PREFIX, "Leiden", sep = "; "),
    label_position = NULL,
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    shuffle_values = TRUE,
    rasterise = RASTERISED
) +
    theme_customized()
CB_POSITION <- c(0.8, 0.995)
p_embedding_UMI <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = log10(embedding$num_umis),
    label = paste(EMBEDDING_TITLE_PREFIX, "UMI", sep = "; "),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE * 1.25,
    sort_values = TRUE,
    shuffle_values = FALSE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        x = CB_POSITION[1],
        legend_key_size = 2,
        legend_text_size = 5
    )
p_embedding_MT <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$mt_percentage,
    label = paste(EMBEDDING_TITLE_PREFIX, "MT%", sep = "; "),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE * 2,
    sort_values = TRUE,
    shuffle_values = FALSE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        x = CB_POSITION[1],
        legend_key_size = 2,
        legend_text_size = 5
    )Clustering of 30,439 cells (10,933 cells in Fig. 3a, 11,634 and 7,872 cells in Fig. 4cd).
purrr::reduce(
    list(
        p_embedding_leiden,
        p_embedding_UMI,
        p_embedding_MT
    ),
    `+`
) +
    patchwork::plot_layout(ncol = 3) +
    patchwork::plot_annotation(
        theme = ggplot2::theme(plot.margin = ggplot2::margin())
    )Lineage, origin & developmental stage
p_embedding_lineage <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$lineage,
    label = paste(EMBEDDING_TITLE_PREFIX, "Lineage", sep = "; "),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    shuffle_values = TRUE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        x = CB_POSITION[1],
        legend_key_size = 2,
        legend_text_size = 5
    )
p_embedding_batch <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$batch |> as.factor(),
    label = paste(EMBEDDING_TITLE_PREFIX, "Batch", sep = "; "),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    shuffle_values = TRUE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        x = CB_POSITION[1] - 0.1,
        legend_key_size = 2,
        legend_text_size = 5
    )
p_embedding_developmental_stage <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$developmental_stage |> as.factor(),
    label = paste(EMBEDDING_TITLE_PREFIX, "Developmental stage", sep = "; "),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    shuffle_values = TRUE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        x = CB_POSITION[1],
        legend_key_size = 2,
        legend_text_size = 5
    )purrr::reduce(
    list(
        p_embedding_lineage,
        p_embedding_batch,
        p_embedding_developmental_stage
    ),
    `+`
) +
    patchwork::plot_layout(ncol = 3) +
    patchwork::plot_annotation(
        theme = ggplot2::theme(plot.margin = ggplot2::margin())
    )Developmental stage
embedding |>
    dplyr::group_by(
        developmental_stage
    ) |>
    dplyr::summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_percentage = median(mt_percentage)
    ) |>
    gt::gt() |>
    gt::tab_options(table.font.size = "median") |>
    gt::summary_rows(
        columns = c(num_cells),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    ) |>
    gt::summary_rows(
        columns = c(median_umis:median_mt_percentage),
        fns = list(
            Mean = ~ mean(.)
        ),
        decimals = c(2)
    )| developmental_stage | num_cells | median_umis | median_features | median_mt_percentage | |
|---|---|---|---|---|---|
| D6 | 10933 | 6203.0 | 2240.0 | 0.007092199 | |
| D8 | 11634 | 12780.5 | 3357.0 | 0.052984867 | |
| D10 | 7872 | 12238.0 | 3778.5 | 0.065663483 | |
| Sum | — | 30,439 | — | — | — | 
| Mean | — | — | 10,407.17 | 3,125.17 | 0.04 | 
purrr::map(levels(embedding$developmental_stage), function(x) {
    plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = as.numeric(
            embedding$developmental_stage == x
        ) |> as.factor(),
        label = paste(EMBEDDING_TITLE_PREFIX, x, sep = "; "),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = FALSE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        rasterise = RASTERISED
    ) +
        theme_customized() +
        scale_color_manual(
            values = c("grey70", "salmon")
        )
}) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 3) +
    patchwork::plot_annotation(
        theme = ggplot2::theme(plot.margin = ggplot2::margin())
    )Lineage
embedding |>
    dplyr::group_by(
        lineage
    ) |>
    dplyr::summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        num_features = median(num_features),
        median_mt_percentage = median(mt_percentage)
    ) |>
    gt::gt() |>
    gt::tab_options(table.font.size = "median") |>
    gt::summary_rows(
        columns = c(num_cells),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    ) |>
    gt::summary_rows(
        columns = c(median_umis:median_mt_percentage),
        fns = list(
            Mean = ~ mean(.)
        ),
        decimals = c(2)
    )| lineage | num_cells | median_umis | num_features | median_mt_percentage | |
|---|---|---|---|---|---|
| EPI | 1340 | 28910.0 | 5194.0 | 0.018937359 | |
| PE | 2083 | 23615.0 | 4849.0 | 0.020250376 | |
| TE | 2472 | 2253.5 | 1112.5 | 0.003417852 | |
| IM | 6478 | 4360.5 | 1841.0 | 0.008306207 | |
| CTB | 9438 | 22634.5 | 4912.0 | 0.066582772 | |
| STB | 8628 | 2255.5 | 1219.0 | 0.030517943 | |
| Sum | — | 30,439 | — | — | — | 
| Mean | — | — | 14,004.83 | 3,187.92 | 0.02 | 
purrr::map(levels(embedding$lineage), function(x) {
    plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = as.numeric(embedding$lineage == x) |> as.factor(),
        label = paste(EMBEDDING_TITLE_PREFIX, x, sep = "; "),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = FALSE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        shuffle_values = FALSE,
        rasterise = RASTERISED,
        legend_size = 2
    ) +
        theme_customized(
            x = CB_POSITION[1] - 0.3,
            legend_key_size = 2,
            legend_text_size = 5
        ) +
        scale_color_manual(
            values = c("grey70", "salmon")
        )
}) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 3) +
    patchwork::plot_annotation(
        theme = ggplot2::theme(plot.margin = ggplot2::margin())
    )Composition
p_barplot_composition_developmental_stage <- calc_group_composition(
    data = embedding,
    x = "leiden",
    group = "developmental_stage"
) |>
    dplyr::mutate(
        leiden = factor(leiden)
    ) |>
    plot_barplot(
        x = "leiden",
        y = "percentage",
        z = "developmental_stage",
        legend_ncol = 1
    )
p_barplot_composition_lineage <- calc_group_composition(
    data = embedding,
    x = "leiden",
    group = "lineage"
) |>
    dplyr::mutate(
        leiden = factor(leiden)
    ) |>
    plot_barplot(
        x = "leiden",
        y = "percentage",
        z = "lineage",
        legend_ncol = 1
    )
p_barplot_combined <- list(
    p_barplot_composition_lineage,
    p_barplot_composition_developmental_stage
) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(nrow = 2, guides = "collect") +
    patchwork::plot_annotation(
        theme = ggplot2::theme(plot.margin = ggplot2::margin())
    )
p_barplot_combinedcalc_group_composition(
    data = embedding,
    x = "lineage",
    group = "developmental_stage"
) |>
    plot_barplot(
        x = "lineage",
        y = "percentage",
        z = "developmental_stage",
        legend_ncol = 1
    )calc_group_composition(
    data = embedding,
    x = "developmental_stage",
    group = "lineage"
) |>
    plot_barplot(
        x = "developmental_stage",
        y = "percentage",
        z = "lineage",
        legend_ncol = 1
    )Expression
Embedding
FEATURES_SELECTED <- c(
    "ENSG00000204531_POU5F1",
    "ENSG00000111704_NANOG",
    "ENSG00000171872_KLF17",
    "ENSG00000186103_ARGFX",
    #
    "ENSG00000164736_SOX17",
    "ENSG00000125798_FOXA2",
    "ENSG00000136574_GATA4",
    "ENSG00000134853_PDGFRA",
    #
    "ENSG00000179348_GATA2",
    "ENSG00000070915_SLC12A3",
    "ENSG00000165556_CDX2",
    "ENSG00000007866_TEAD3"
)purrr::map(FEATURES_SELECTED, function(x) {
    selected_feature <- x
    cat(selected_feature, "\n")
    values <- log10(
        calc_cpm(matrix_readcount_use[, embedding$cell])
        [selected_feature, ] + 1
    )
    p1 <- plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = values,
        label = paste(
            EMBEDDING_TITLE_PREFIX,
            selected_feature |> stringr::str_remove(pattern = "^E.+_"),
            sep = "; "
        ),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = TRUE,
        geom_point_size = GEOM_POINT_SIZE * 2,
        sort_values = TRUE,
        shuffle_values = FALSE,
        rasterise = RASTERISED,
        legend_size = 2
    ) +
        scale_color_viridis_c(
            na.value = "grey80"
        ) +
        theme_customized(
            x = CB_POSITION[1] + 0.05,
            legend_key_size = 2,
            legend_text_size = 5
        )
    return(p1)
}) |>
    # unlist(recursive = FALSE) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 3, byrow = FALSE) +
    patchwork::plot_annotation(
        theme = ggplot2::theme(plot.margin = ggplot2::margin())
    )ENSG00000204531_POU5F1 
ENSG00000111704_NANOG 
ENSG00000171872_KLF17 
ENSG00000186103_ARGFX 
ENSG00000164736_SOX17 
ENSG00000125798_FOXA2 
ENSG00000136574_GATA4 
ENSG00000134853_PDGFRA 
ENSG00000179348_GATA2 
ENSG00000070915_SLC12A3 
ENSG00000165556_CDX2 
ENSG00000007866_TEAD3 
R session info
devtools::session_info()─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.1.2 (2021-11-01)
 os       macOS Monterey 12.1
 system   aarch64, darwin20.6.0
 ui       unknown
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Chicago
 date     2022-01-25
 pandoc   2.17.0.1 @ /opt/homebrew/bin/ (via rmarkdown)
─ Packages ───────────────────────────────────────────────────────────────────
 package       * version     date (UTC) lib source
 assertthat      0.2.1       2019-03-21 [1] CRAN (R 4.1.1)
 backports       1.4.1       2021-12-13 [1] CRAN (R 4.1.2)
 beeswarm        0.4.0       2021-06-01 [1] CRAN (R 4.1.2)
 bit             4.0.4       2020-08-04 [1] CRAN (R 4.1.1)
 bit64           4.0.5       2020-08-30 [1] CRAN (R 4.1.1)
 brio            1.1.3       2021-11-30 [1] CRAN (R 4.1.2)
 broom           0.7.11      2022-01-03 [1] CRAN (R 4.1.2)
 cachem          1.0.6       2021-08-19 [1] CRAN (R 4.1.1)
 callr           3.7.0       2021-04-20 [1] CRAN (R 4.1.1)
 cellranger      1.1.0       2016-07-27 [1] CRAN (R 4.1.1)
 checkmate       2.0.0       2020-02-06 [1] CRAN (R 4.1.1)
 cli             3.1.1       2022-01-20 [1] CRAN (R 4.1.2)
 colorspace      2.0-2       2021-06-24 [1] CRAN (R 4.1.1)
 crayon          1.4.2       2021-10-29 [1] CRAN (R 4.1.1)
 data.table      1.14.2      2021-09-27 [1] CRAN (R 4.1.1)
 DBI             1.1.2       2021-12-20 [1] CRAN (R 4.1.2)
 dbplyr          2.1.1       2021-04-06 [1] CRAN (R 4.1.1)
 desc            1.4.0       2021-09-28 [1] CRAN (R 4.1.1)
 devtools        2.4.3.9000  2022-01-22 [1] Github (r-lib/devtools@41280ac)
 digest          0.6.29      2021-12-01 [1] CRAN (R 4.1.2)
 dplyr         * 1.0.7.9000  2022-01-12 [1] Github (tidyverse/dplyr@0501335)
 dtplyr          1.2.1       2022-01-19 [1] CRAN (R 4.1.2)
 ellipsis        0.3.2       2021-04-29 [1] CRAN (R 4.1.1)
 evaluate        0.14        2019-05-28 [1] CRAN (R 4.1.1)
 extrafont     * 0.17        2014-12-08 [1] CRAN (R 4.1.1)
 extrafontdb     1.0         2012-06-11 [1] CRAN (R 4.1.1)
 fansi           1.0.2       2022-01-14 [1] CRAN (R 4.1.2)
 farver          2.1.0       2021-02-28 [1] CRAN (R 4.1.1)
 fastmap         1.1.0       2021-01-25 [1] CRAN (R 4.1.1)
 forcats       * 0.5.1.9000  2021-11-29 [1] Github (tidyverse/forcats@b4dade0)
 fs              1.5.2.9000  2021-12-09 [1] Github (r-lib/fs@6d1182f)
 gargle          1.2.0       2021-07-02 [1] CRAN (R 4.1.1)
 generics        0.1.1       2021-10-25 [1] CRAN (R 4.1.1)
 ggbeeswarm      0.6.0       2017-08-07 [1] CRAN (R 4.1.2)
 ggplot2       * 3.3.5       2021-06-25 [1] CRAN (R 4.1.1)
 ggrastr         1.0.1       2021-12-08 [1] Github (VPetukhov/ggrastr@7aed9af)
 glue            1.6.1.9000  2022-01-23 [1] Github (tidyverse/glue@3da70df)
 googledrive     2.0.0       2021-07-08 [1] CRAN (R 4.1.1)
 googlesheets4   1.0.0       2021-07-21 [1] CRAN (R 4.1.1)
 gt              0.3.1.9000  2022-01-17 [1] Github (rstudio/gt@fcabb41)
 gtable          0.3.0.9000  2021-10-28 [1] Github (r-lib/gtable@a0bd272)
 haven           2.4.3       2021-08-04 [1] CRAN (R 4.1.1)
 highr           0.9         2021-04-16 [1] CRAN (R 4.1.1)
 hms             1.1.1       2021-09-26 [1] CRAN (R 4.1.1)
 htmltools       0.5.2       2021-08-25 [1] CRAN (R 4.1.1)
 htmlwidgets     1.5.4       2021-09-08 [1] CRAN (R 4.1.1)
 httr            1.4.2       2020-07-20 [1] CRAN (R 4.1.1)
 jsonlite        1.7.3       2022-01-17 [1] CRAN (R 4.1.2)
 knitr           1.37.1      2021-12-21 [1] https://yihui.r-universe.dev (R 4.1.2)
 labeling        0.4.2       2020-10-20 [1] CRAN (R 4.1.1)
 lattice         0.20-45     2021-09-22 [2] CRAN (R 4.1.2)
 lifecycle       1.0.1       2021-09-24 [1] CRAN (R 4.1.1)
 lubridate       1.8.0       2022-01-20 [1] Github (tidyverse/lubridate@566590f)
 magrittr        2.0.1       2020-11-17 [1] CRAN (R 4.1.1)
 Matrix        * 1.4-0       2021-12-08 [2] CRAN (R 4.1.2)
 memoise         2.0.1       2021-11-26 [1] CRAN (R 4.1.2)
 modelr          0.1.8.9000  2021-10-27 [1] Github (tidyverse/modelr@16168e0)
 munsell         0.5.0       2018-06-12 [1] CRAN (R 4.1.1)
 patchwork     * 1.1.0.9000  2021-10-27 [1] Github (thomasp85/patchwork@79223d3)
 pillar          1.6.4       2021-10-18 [1] CRAN (R 4.1.1)
 pkgbuild        1.3.1       2021-12-20 [1] CRAN (R 4.1.2)
 pkgconfig       2.0.3       2019-09-22 [1] CRAN (R 4.1.1)
 pkgload         1.2.4       2021-11-30 [1] CRAN (R 4.1.2)
 png             0.1-7       2013-12-03 [1] CRAN (R 4.1.1)
 prettyunits     1.1.1       2020-01-24 [1] CRAN (R 4.1.1)
 processx        3.5.2       2021-04-30 [1] CRAN (R 4.1.1)
 ps              1.6.0       2021-02-28 [1] CRAN (R 4.1.1)
 purrr         * 0.3.4       2020-04-17 [1] CRAN (R 4.1.1)
 R.cache         0.15.0      2021-04-30 [1] CRAN (R 4.1.1)
 R.methodsS3     1.8.1       2020-08-26 [1] CRAN (R 4.1.1)
 R.oo            1.24.0      2020-08-26 [1] CRAN (R 4.1.1)
 R.utils         2.11.0      2021-09-26 [1] CRAN (R 4.1.1)
 R6              2.5.1.9000  2021-12-09 [1] Github (r-lib/R6@1b05b89)
 ragg            1.2.1.9000  2021-12-08 [1] Github (r-lib/ragg@c68c666)
 Rcpp            1.0.8       2022-01-13 [1] CRAN (R 4.1.2)
 readr         * 2.1.1       2021-11-30 [1] CRAN (R 4.1.2)
 readxl          1.3.1.9000  2022-01-20 [1] Github (tidyverse/readxl@2ccb82c)
 remotes         2.4.2       2022-01-24 [1] Github (r-lib/remotes@7b0ee01)
 reprex          2.0.1       2021-08-05 [1] CRAN (R 4.1.1)
 reticulate      1.23        2022-01-14 [1] CRAN (R 4.1.2)
 rlang           1.0.0       2022-01-20 [1] Github (r-lib/rlang@f2fbaad)
 rmarkdown       2.11.12     2022-01-24 [1] Github (rstudio/rmarkdown@b53a7ce)
 rprojroot       2.0.2       2020-11-15 [1] CRAN (R 4.1.1)
 rstudioapi      0.13.0-9000 2022-01-15 [1] Github (rstudio/rstudioapi@5d0f087)
 Rttf2pt1        1.3.9       2021-07-22 [1] CRAN (R 4.1.1)
 rvest           1.0.2       2021-10-16 [1] CRAN (R 4.1.1)
 sass            0.4.0       2021-05-12 [1] CRAN (R 4.1.1)
 scales          1.1.1       2020-05-11 [1] CRAN (R 4.1.1)
 sessioninfo     1.2.2       2021-12-06 [1] CRAN (R 4.1.2)
 stringi         1.7.6       2021-11-29 [1] CRAN (R 4.1.2)
 stringr       * 1.4.0.9000  2022-01-24 [1] Github (tidyverse/stringr@85f6140)
 styler        * 1.6.2.9000  2022-01-17 [1] Github (r-lib/styler@9274aed)
 systemfonts     1.0.3.9000  2021-12-07 [1] Github (r-lib/systemfonts@414114e)
 testthat        3.1.2.9000  2022-01-21 [1] Github (r-lib/testthat@54b9db2)
 textshaping     0.3.6       2021-10-13 [1] CRAN (R 4.1.1)
 tibble        * 3.1.6.9000  2022-01-18 [1] Github (tidyverse/tibble@7aa54e6)
 tidyr         * 1.1.4       2021-09-27 [1] CRAN (R 4.1.1)
 tidyselect      1.1.1       2021-04-30 [1] CRAN (R 4.1.1)
 tidyverse     * 1.3.1.9000  2021-12-08 [1] Github (tidyverse/tidyverse@6186fbf)
 tzdb            0.2.0       2021-10-27 [1] CRAN (R 4.1.1)
 usethis         2.1.5.9000  2022-01-20 [1] Github (r-lib/usethis@57b109a)
 utf8            1.2.2       2021-07-24 [1] CRAN (R 4.1.1)
 vctrs           0.3.8       2021-04-29 [1] CRAN (R 4.1.1)
 vipor           0.4.5       2017-03-22 [1] CRAN (R 4.1.2)
 viridisLite     0.4.0       2021-04-13 [1] CRAN (R 4.1.1)
 vroom           1.5.7       2021-11-30 [1] CRAN (R 4.1.2)
 withr           2.4.3       2021-11-30 [1] CRAN (R 4.1.2)
 xfun            0.29        2021-12-14 [1] CRAN (R 4.1.2)
 xml2            1.3.3       2021-11-30 [1] CRAN (R 4.1.2)
 yaml            2.2.1       2020-02-01 [1] CRAN (R 4.1.1)
 [1] /opt/homebrew/lib/R/4.1/site-library
 [2] /opt/homebrew/Cellar/r/4.1.2/lib/R/library
─ Python configuration ───────────────────────────────────────────────────────
 python:         /Users/jialei/.pyenv/shims/python
 libpython:      /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5/lib/libpython3.9.dylib
 pythonhome:     /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5:/Users/jialei/.pyenv/versions/miniforge3-4.10.1-5
 version:        3.9.5 | packaged by conda-forge | (default, Jun 19 2021, 00:24:55)  [Clang 11.1.0 ]
 numpy:          /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5/lib/python3.9/site-packages/numpy
 numpy_version:  1.20.3
 anndata:        /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5/lib/python3.9/site-packages/anndata
 
 NOTE: Python version was forced by RETICULATE_PYTHON
──────────────────────────────────────────────────────────────────────────────