This tutorial provides an example analysis for modelling gene detection pattern as outlined in R.Li et al, 2018. The goal of this tutorial is to provide an overview of the cell type classification and visualization tasks by learning a low dimensional embedding through a class of gene detection models: that is BFA and Binary PCA.
The following workflow summarizes a typical dimensionality reduction procedure performed by BFA or Binary PCA.
Let’s start with the installation
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("scBFA")
next we can load dependent packages
The example dataset is generated from our scRNA-seq pre-DC/cDC dataset sourced from https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE89232 After performing all quality control procedure of genes and cells (as outlined in the paper), we then select 500 most variable genes for illustration purpose. The example dataset consists of 950 cells and 500 genes
For illustration, here we construct a singleCellExperiment class to be the input of BFA and Binary PCA.
Let N stands for number of cells, G stands for the number of genes, and K stands for the number of latent dimensions.
A bfa model object computes the following parameters after fitting the gene detection matrix.
We choose 3 as number of latent dimensions and project the gene detection matrix on the embedding space.
We then visualize the low dimensional embedding of BFA in tSNE space. Points are colored by their corresponding cell types.
set.seed(5)
df = as.data.frame(bfa_model$ZZ)
df$celltype = celltype
p1 <- ggplot(df,aes(x = V1,y = V2,colour = celltype))
p1 <- p1 + geom_jitter(size=2.5,alpha = 0.8)
colorvalue <- c("#43d5f9","#24b71f","#E41A1C", "#ffc935","#3d014c","#39ddb2",
"slateblue2","maroon","#f7df27","palevioletred1","olivedrab3",
"#377EB8","#5043c1","blue","aquamarine2","chartreuse4",
"burlywood2","indianred1","mediumorchid1")
p1 <- p1 + xlab("tsne axis 1") + ylab("tsne axis 2")
p1 <- p1 + scale_color_manual(values = colorvalue)
p1 <- p1 + theme(panel.background = element_blank(),
legend.position = "right",
axis.text=element_blank(),
axis.line.x = element_line(color="black"),
axis.line.y = element_line(color="black"),
plot.title = element_blank()
)
p1
We then visualize the low dimensional embedding of Binary PCA in tSNE space. Points are colored by their corresponding cell types.
df = as.data.frame(bpca$x[,c(1:2)])
colnames(df) = c("V1","V2")
df$celltype = celltype
p1 <- ggplot(df,aes(x = V1,y = V2,colour = celltype))
p1 <- p1 + geom_jitter(size=2.5,alpha = 0.8)
colorvalue <- c("#43d5f9","#24b71f","#E41A1C", "#ffc935","#3d014c","#39ddb2",
"slateblue2","maroon","#f7df27","palevioletred1","olivedrab3",
"#377EB8","#5043c1","blue","aquamarine2","chartreuse4",
"burlywood2","indianred1","mediumorchid1")
p1 <- p1 + xlab("tsne axis 1") + ylab("tsne axis 2")
p1 <- p1 + scale_color_manual(values = colorvalue)
p1 <- p1 + theme(panel.background = element_blank(),
legend.position = "right",
axis.text=element_blank(),
axis.line.x = element_line(color="black"),
axis.line.y = element_line(color="black"),
plot.title = element_blank()
)
p1
sessionInfo()
#> R version 4.4.2 (2024-10-31)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.1 LTS
#>
#> Matrix products: default
#> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
#> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
#> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
#> [9] LC_ADDRESS=C LC_TELEPHONE=C
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats4 stats graphics grDevices utils datasets methods
#> [8] base
#>
#> other attached packages:
#> [1] scBFA_1.21.0 ggplot2_3.5.1
#> [3] zinbwave_1.29.0 SingleCellExperiment_1.29.1
#> [5] SummarizedExperiment_1.37.0 Biobase_2.67.0
#> [7] GenomicRanges_1.59.1 GenomeInfoDb_1.43.2
#> [9] IRanges_2.41.2 S4Vectors_0.45.2
#> [11] BiocGenerics_0.53.3 generics_0.1.3
#> [13] MatrixGenerics_1.19.0 matrixStats_1.4.1
#> [15] rmarkdown_2.29
#>
#> loaded via a namespace (and not attached):
#> [1] RcppAnnoy_0.0.22 splines_4.4.2 later_1.4.1
#> [4] tibble_3.2.1 polyclip_1.10-7 XML_3.99-0.17
#> [7] fastDummies_1.7.4 lifecycle_1.0.4 edgeR_4.5.1
#> [10] globals_0.16.3 lattice_0.22-6 MASS_7.3-61
#> [13] magrittr_2.0.3 limma_3.63.2 plotly_4.10.4
#> [16] sass_0.4.9 jquerylib_0.1.4 yaml_2.3.10
#> [19] httpuv_1.6.15 Seurat_5.1.0 sctransform_0.4.1
#> [22] spam_2.11-0 sp_2.1-4 spatstat.sparse_3.1-0
#> [25] reticulate_1.40.0 cowplot_1.1.3 pbapply_1.7-2
#> [28] DBI_1.2.3 buildtools_1.0.0 RColorBrewer_1.1-3
#> [31] ADGofTest_0.3 abind_1.4-8 zlibbioc_1.52.0
#> [34] Rtsne_0.17 pspline_1.0-20 purrr_1.0.2
#> [37] GenomeInfoDbData_1.2.13 ggrepel_0.9.6 irlba_2.3.5.1
#> [40] listenv_0.9.1 spatstat.utils_3.1-1 maketools_1.3.1
#> [43] genefilter_1.89.0 goftest_1.2-3 RSpectra_0.16-2
#> [46] spatstat.random_3.3-2 annotate_1.85.0 fitdistrplus_1.2-1
#> [49] parallelly_1.40.0 leiden_0.4.3.1 codetools_0.2-20
#> [52] DelayedArray_0.33.3 tidyselect_1.2.1 UCSC.utils_1.3.0
#> [55] farver_2.1.2 spatstat.explore_3.3-3 jsonlite_1.8.9
#> [58] progressr_0.15.1 ggridges_0.5.6 survival_3.7-0
#> [61] tools_4.4.2 ica_1.0-3 Rcpp_1.0.13-1
#> [64] glue_1.8.0 gridExtra_2.3 SparseArray_1.7.2
#> [67] xfun_0.49 DESeq2_1.47.1 dplyr_1.1.4
#> [70] numDeriv_2016.8-1.1 withr_3.0.2 fastmap_1.2.0
#> [73] fansi_1.0.6 digest_0.6.37 R6_2.5.1
#> [76] mime_0.12 colorspace_2.1-1 scattermore_1.2
#> [79] tensor_1.5 spatstat.data_3.1-4 RSQLite_2.3.8
#> [82] copula_1.1-4 utf8_1.2.4 tidyr_1.3.1
#> [85] data.table_1.16.2 httr_1.4.7 htmlwidgets_1.6.4
#> [88] S4Arrays_1.7.1 uwot_0.2.2 pkgconfig_2.0.3
#> [91] gtable_0.3.6 blob_1.2.4 lmtest_0.9-40
#> [94] XVector_0.47.0 sys_3.4.3 pcaPP_2.0-5
#> [97] htmltools_0.5.8.1 dotCall64_1.2 SeuratObject_5.0.2
#> [100] scales_1.3.0 png_0.1-8 spatstat.univar_3.1-1
#> [103] knitr_1.49 reshape2_1.4.4 nlme_3.1-166
#> [106] cachem_1.1.0 zoo_1.8-12 stringr_1.5.1
#> [109] KernSmooth_2.23-24 parallel_4.4.2 miniUI_0.1.1.1
#> [112] softImpute_1.4-1 AnnotationDbi_1.69.0 pillar_1.9.0
#> [115] grid_4.4.2 vctrs_0.6.5 RANN_2.6.2
#> [118] promises_1.3.2 xtable_1.8-4 cluster_2.1.6
#> [121] evaluate_1.0.1 mvtnorm_1.3-2 cli_3.6.3
#> [124] locfit_1.5-9.10 compiler_4.4.2 rlang_1.1.4
#> [127] crayon_1.5.3 future.apply_1.11.3 labeling_0.4.3
#> [130] plyr_1.8.9 stringi_1.8.4 viridisLite_0.4.2
#> [133] deldir_2.0-4 BiocParallel_1.41.0 gsl_2.1-8
#> [136] munsell_0.5.1 Biostrings_2.75.1 lazyeval_0.2.2
#> [139] spatstat.geom_3.3-4 Matrix_1.7-1 RcppHNSW_0.6.0
#> [142] stabledist_0.7-2 patchwork_1.3.0 bit64_4.5.2
#> [145] future_1.34.0 KEGGREST_1.47.0 statmod_1.5.0
#> [148] shiny_1.9.1 ROCR_1.0-11 igraph_2.1.1
#> [151] memoise_2.0.1 bslib_0.8.0 bit_4.5.0