Chapter 1 Introduction

1.1 Motivation

The Bioconductor package SingleR implements an automatic annotation method for single-cell RNA sequencing (scRNA-seq) data (Aran et al. 2019). Given a reference dataset of samples (single-cell or bulk) with known labels, it assigns those labels to new cells from a test dataset based on similarities in their expression profiles. This provides a convenient way of transferring biological knowledge across datasets, allowing users to leverage the domain expertise implicit in the creation of each reference. The most common application of SingleR involves predicting cell type (or “state”, or “kind”) in a new dataset, a process that is facilitated by the availability of curated references and compatibility with user-supplied datasets. In this manner, the burden of manually interpreting clusters and defining marker genes only has to be done once, for the reference dataset, and this knowledge can be propagated to new datasets in an automated manner.

1.2 Method description

SingleR can be considered a robust variant of nearest-neighbors classification, with some tweaks to improve resolution for closely related labels. For each test cell:

  1. We compute the Spearman correlation between its expression profile and that of each reference sample. The use of Spearman’s correlation provides a measure of robustness to batch effects across datasets. The calculation only uses the union of marker genes identified by pairwise comparisons between labels in the reference data, so as to improve resolution of separation between labels.
  2. We define the per-label score as a fixed quantile (by default, 0.8) of the correlations across all samples with that label. This accounts for differences in the number of reference samples for each label, which interferes with simpler flavors of nearest neighbor classification; it also avoids penalizing classifications to heterogeneous labels by only requiring a good match to a minority of samples.
  3. We repeat the score calculation for all labels in the reference dataset. The label with the highest score is used as SingleR’s prediction for this cell.
  4. We optionally perform a fine-tuning step to improve resolution between closely related labels. The reference dataset is subsetted to only include labels with scores close to the maximum; scores are recomputed using only marker genes for the subset of labels, thus focusing on the most relevant features; and this process is iterated until only one label remains.

1.3 Quick start

We will demonstrate the use of SingleR() on a well-known 10X Genomics dataset (Zheng et al. 2017) with the Human Primary Cell Atlas dataset (Mabbott et al. 2013) as the reference.

# Loading test data.
library(TENxPBMCData)
new.data <- TENxPBMCData("pbmc4k")

# Loading reference data with Ensembl annotations.
library(celldex)
ref.data <- HumanPrimaryCellAtlasData(ensembl=TRUE)

# Performing predictions.
library(SingleR)
predictions <- SingleR(test=new.data, assay.type.test=1, 
    ref=ref.data, labels=ref.data$label.main)

table(predictions$labels)
## 
##           B_cell              CMP               DC              GMP 
##              606                8                1                2 
##         Monocyte          NK_cell        Platelets Pre-B_cell_CD34- 
##             1164              217                3               46 
##          T_cells 
##             2293

And that’s it, really.

1.4 Where to get help

Questions on the general use of SingleR should be posted to the Bioconductor support site. Please send requests for general assistance and advice to the support site rather than to the individual authors. Bug reports or feature requests should be made to the GitHub repository; well-considered suggestions for improvements are always welcome.

Session information

R Under development (unstable) (2023-11-11 r85510)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 22.04.3 LTS

Matrix products: default
BLAS:   /home/biocbuild/bbs-3.19-bioc/R/lib/libRblas.so 
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_GB              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: America/New_York
tzcode source: system (glibc)

attached base packages:
[1] stats4    stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] SingleR_2.5.0               ensembldb_2.27.1           
 [3] AnnotationFilter_1.27.0     GenomicFeatures_1.55.1     
 [5] AnnotationDbi_1.65.2        celldex_1.13.0             
 [7] TENxPBMCData_1.21.0         HDF5Array_1.31.1           
 [9] rhdf5_2.47.1                DelayedArray_0.29.0        
[11] SparseArray_1.3.1           S4Arrays_1.3.1             
[13] abind_1.4-5                 Matrix_1.6-4               
[15] SingleCellExperiment_1.25.0 SummarizedExperiment_1.33.1
[17] Biobase_2.63.0              GenomicRanges_1.55.1       
[19] GenomeInfoDb_1.39.1         IRanges_2.37.0             
[21] S4Vectors_0.41.2            BiocGenerics_0.49.1        
[23] MatrixGenerics_1.15.0       matrixStats_1.1.0          
[25] BiocStyle_2.31.0            rebook_1.13.0              

loaded via a namespace (and not attached):
  [1] DBI_1.1.3                     bitops_1.0-7                 
  [3] biomaRt_2.59.0                CodeDepends_0.6.5            
  [5] rlang_1.1.2                   magrittr_2.0.3               
  [7] compiler_4.4.0                RSQLite_2.3.3                
  [9] dir.expiry_1.11.0             DelayedMatrixStats_1.25.1    
 [11] png_0.1-8                     vctrs_0.6.5                  
 [13] ProtGenerics_1.35.0           stringr_1.5.1                
 [15] pkgconfig_2.0.3               crayon_1.5.2                 
 [17] fastmap_1.1.1                 dbplyr_2.4.0                 
 [19] XVector_0.43.0                ellipsis_0.3.2               
 [21] utf8_1.2.4                    Rsamtools_2.19.2             
 [23] promises_1.2.1                rmarkdown_2.25               
 [25] graph_1.81.0                  purrr_1.0.2                  
 [27] bit_4.0.5                     xfun_0.41                    
 [29] beachmat_2.19.0               zlibbioc_1.49.0              
 [31] cachem_1.0.8                  jsonlite_1.8.8               
 [33] progress_1.2.2                blob_1.2.4                   
 [35] later_1.3.1                   rhdf5filters_1.15.1          
 [37] BiocParallel_1.37.0           Rhdf5lib_1.25.0              
 [39] interactiveDisplayBase_1.41.0 irlba_2.3.5.1                
 [41] parallel_4.4.0                prettyunits_1.2.0            
 [43] R6_2.5.1                      bslib_0.6.1                  
 [45] stringi_1.8.2                 rtracklayer_1.63.0           
 [47] jquerylib_0.1.4               Rcpp_1.0.11                  
 [49] bookdown_0.37                 knitr_1.45                   
 [51] httpuv_1.6.12                 tidyselect_1.2.0             
 [53] yaml_2.3.7                    codetools_0.2-19             
 [55] curl_5.1.0                    lattice_0.22-5               
 [57] tibble_3.2.1                  shiny_1.8.0                  
 [59] withr_2.5.2                   KEGGREST_1.43.0              
 [61] evaluate_0.23                 BiocFileCache_2.11.1         
 [63] xml2_1.3.6                    ExperimentHub_2.11.0         
 [65] Biostrings_2.71.1             pillar_1.9.0                 
 [67] BiocManager_1.30.22           filelock_1.0.2               
 [69] generics_0.1.3                RCurl_1.98-1.13              
 [71] BiocVersion_3.19.1            hms_1.1.3                    
 [73] sparseMatrixStats_1.15.0      xtable_1.8-4                 
 [75] glue_1.6.2                    lazyeval_0.2.2               
 [77] tools_4.4.0                   BiocIO_1.13.0                
 [79] AnnotationHub_3.11.0          ScaledMatrix_1.11.0          
 [81] GenomicAlignments_1.39.0      XML_3.99-0.16                
 [83] grid_4.4.0                    GenomeInfoDbData_1.2.11      
 [85] BiocSingular_1.19.0           restfulr_0.0.15              
 [87] rsvd_1.0.5                    cli_3.6.1                    
 [89] rappdirs_0.3.3                fansi_1.0.5                  
 [91] dplyr_1.1.4                   sass_0.4.7                   
 [93] digest_0.6.33                 rjson_0.2.21                 
 [95] memoise_2.0.1                 htmltools_0.5.7              
 [97] lifecycle_1.0.4               httr_1.4.7                   
 [99] mime_0.12                     bit64_4.0.5                  

Bibliography

Aran, D., A. P. Looney, L. Liu, E. Wu, V. Fong, A. Hsu, S. Chak, et al. 2019. “Reference-based analysis of lung single-cell sequencing reveals a transitional profibrotic macrophage.” Nat. Immunol. 20 (2): 163–72.

Mabbott, Neil A., J. K. Baillie, Helen Brown, Tom C. Freeman, and David A. Hume. 2013. “An expression atlas of human primary cells: Inference of gene function from coexpression networks.” BMC Genomics 14. https://doi.org/10.1186/1471-2164-14-632.

Zheng, G. X., J. M. Terry, P. Belgrader, P. Ryvkin, Z. W. Bent, R. Wilson, S. B. Ziraldo, et al. 2017. “Massively parallel digital transcriptional profiling of single cells.” Nat Commun 8 (January): 14049.