Here, we describe a few additional analyses that can be performed with single-cell RNA sequencing data. This includes detection of significant correlations between genes and regressing out the effect of cell cycle from the gene expression matrix.
All software packages used in this workflow are publicly available from the Comprehensive R Archive Network (https://cran.r-project.org) or the Bioconductor project (http://bioconductor.org). The specific version numbers of the packages used are shown below, along with the version of the R installation.
sessionInfo()
## R version 4.3.0 RC (2023-04-13 r84269)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.2 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.17-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] scran_1.28.0 scater_1.28.0
## [3] ggplot2_3.4.2 scuttle_1.10.0
## [5] SingleCellExperiment_1.22.0 SummarizedExperiment_1.30.0
## [7] Biobase_2.60.0 GenomicRanges_1.52.0
## [9] GenomeInfoDb_1.36.0 IRanges_2.34.0
## [11] S4Vectors_0.38.0 BiocGenerics_0.46.0
## [13] MatrixGenerics_1.12.0 matrixStats_0.63.0
## [15] readxl_1.4.2 R.utils_2.12.2
## [17] R.oo_1.25.0 R.methodsS3_1.8.2
## [19] BiocFileCache_2.8.0 dbplyr_2.3.2
## [21] knitr_1.42 BiocStyle_2.28.0
##
## loaded via a namespace (and not attached):
## [1] DBI_1.1.3 bitops_1.0-7
## [3] gridExtra_2.3 rlang_1.1.0
## [5] magrittr_2.0.3 compiler_4.3.0
## [7] RSQLite_2.3.1 DelayedMatrixStats_1.22.0
## [9] vctrs_0.6.2 pkgconfig_2.0.3
## [11] fastmap_1.1.1 magick_2.7.4
## [13] XVector_0.40.0 labeling_0.4.2
## [15] utf8_1.2.3 rmarkdown_2.21
## [17] ggbeeswarm_0.7.1 purrr_1.0.1
## [19] bit_4.0.5 xfun_0.39
## [21] bluster_1.10.0 zlibbioc_1.46.0
## [23] cachem_1.0.7 beachmat_2.16.0
## [25] jsonlite_1.8.4 blob_1.2.4
## [27] highr_0.10 DelayedArray_0.26.0
## [29] BiocParallel_1.34.0 irlba_2.3.5.1
## [31] parallel_4.3.0 cluster_2.1.4
## [33] R6_2.5.1 bslib_0.4.2
## [35] limma_3.56.0 jquerylib_0.1.4
## [37] cellranger_1.1.0 Rcpp_1.0.10
## [39] bookdown_0.33 Matrix_1.5-4
## [41] igraph_1.4.2 tidyselect_1.2.0
## [43] yaml_2.3.7 viridis_0.6.2
## [45] codetools_0.2-19 curl_5.0.0
## [47] lattice_0.21-8 tibble_3.2.1
## [49] withr_2.5.0 evaluate_0.20
## [51] pillar_1.9.0 BiocManager_1.30.20
## [53] filelock_1.0.2 generics_0.1.3
## [55] RCurl_1.98-1.12 sparseMatrixStats_1.12.0
## [57] munsell_0.5.0 scales_1.2.1
## [59] glue_1.6.2 metapod_1.8.0
## [61] tools_4.3.0 BiocNeighbors_1.18.0
## [63] ScaledMatrix_1.8.0 locfit_1.5-9.7
## [65] cowplot_1.1.1 grid_4.3.0
## [67] edgeR_3.42.0 colorspace_2.1-0
## [69] GenomeInfoDbData_1.2.10 beeswarm_0.4.0
## [71] BiocSingular_1.16.0 vipor_0.4.5
## [73] cli_3.6.1 rsvd_1.0.5
## [75] fansi_1.0.4 viridisLite_0.4.1
## [77] dplyr_1.1.2 gtable_0.3.3
## [79] sass_0.4.5 digest_0.6.31
## [81] dqrng_0.3.0 ggrepel_0.9.3
## [83] farver_2.1.1 memoise_2.0.1
## [85] htmltools_0.5.5 lifecycle_1.0.3
## [87] httr_1.4.5 statmod_1.5.0
## [89] bit64_4.0.5
Angel, P., and M. Karin. 1991. “The role of Jun, Fos and the AP-1 complex in cell-proliferation and transformation.” Biochim. Biophys. Acta 1072 (2-3): 129–57.
Bourgon, R., R. Gentleman, and W. Huber. 2010. “Independent filtering increases detection power for high-throughput experiments.” Proc. Natl. Acad. Sci. U.S.A. 107 (21): 9546–51.
Phipson, B., and G. K. Smyth. 2010. “Permutation P-values should never be zero: calculating exact P-values when permutations are randomly drawn.” Stat. Appl. Genet. Mol. Biol. 9: Article 39.
Simes, R. J. 1986. “An Improved Bonferroni Procedure for Multiple Tests of Significance.” Biometrika 73 (3): 751–54.
Wilson, N. K., D. G. Kent, F. Buettner, M. Shehata, I. C. Macaulay, F. J. Calero-Nieto, M. Sanchez Castillo, et al. 2015. “Combined single-cell functional and gene expression analysis resolves heterogeneity within stem cell populations.” Cell Stem Cell 16 (6): 712–24.
3 Comments on filtering by abundance
Low-abundance genes are problematic as zero or near-zero counts do not contain much information for reliable statistical inference. In applications involving hypothesis testing, these genes typically do not provide enough evidence to reject the null hypothesis yet they still increase the severity of the multiple testing correction. The discreteness of the counts may also interfere with statistical procedures, e.g., by compromising the accuracy of continuous approximations. Thus, low-abundance genes are often removed in many RNA-seq analysis pipelines before the application of downstream methods.
The “optimal” choice of filtering strategy depends on the downstream application. A more aggressive filter is usually required to remove discreteness and to avoid zeroes, e.g., for normalization purposes. By comparison, the filter statistic for hypothesis testing is mainly required to be independent of the test statistic under the null hypothesis (Bourgon, Gentleman, and Huber 2010). Given these differences in priorities, we (or the relevant function) will filter at each step as appropriate, rather than applying a single filter for the entire analysis. For example,
computeSumFactors()
will apply a somewhat stringent filter based on the average count, whilefitTrendVar()
will apply a relatively relaxed filter based on the average log-expression. Other applications will not do any abundance-based filtering at all (e.g.,denoisePCA()
) to preserve biological signal from lowly expressed genes.Nonetheless, if global filtering is desired, it is simple to achieve by simply subsetting the
SingleCellExperiment
object. The example below demonstrates how we could remove genes with average counts less than 1 in the HSC dataset. The number ofTRUE
values indemo.keep
corresponds to the number of retained rows/genes after filtering.