signifinder 1.0.0
In cancer studies, transcriptional signatures are studied because of their potential to show cancer activities while happening, and they are considered potentially useful to guide therapeutic decisions and monitoring interventions. Transcriptional signatures of bulk RNA-seq experiments are also used to assess the complex relations between the tumor and its microenvironment.
Transcriptional signatures are based upon the expression of a specific gene set and are summarized in a score designed to provide single-sample predictions. They are usually composed by a list of genes and an algorithm that through the use of gene expressions - and eventually a set of coefficients to differently weight the gene contributions - allows the computation of a single-sample prediction score.
Signatures show cancer activities in patients and can be used for patient stratification. The combined analysis of multiple signatures may reveal possible correlations between different tumor processes and allow patients to be stratified at a broader level of information. However, despite much evidence that computational implementations are useful to improve data reproducibility, applicability and dissemination, the vast majority of signatures are not published along with their computational code and only few of them have been implemented in a software, virtuous examples are: the R package consensusOV
, dedicated to the TCGA ovarian cancer signature; and the R package genefu
which hosts some of the most popular signatures of breast cancer.
signifinder
has been developed to provide an easy and fast computation of several published signatures. Thanks to the compatibility with the Bioconductor data structures and procedures, signifinder
can be easily used after the most popular expression data analysis packages to complement the results and improve data interpretations.
Several visualization functions are implemented to visualize the scores obtained from signatures. These can help in the result interpretations: users can not only browse single signatures independently but also compare them with each other.
To install this package:
if (!require("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("signifinder")
Stringent criteria for the inclusion of the signatures were established: (i) signatures are all based on a cancer topic, developed and used on cancer samples; (ii) all the signatures include the gene list and the method to calculate an expression-based score; (iii) signatures are based exclusively on transcriptomic data (exceptions have been made in case of combination of transcriptomic data and survival or histopathological data); all signatures have been developed for bulk tumor expression experiments. Additionally, the included signatures clearly state the method, the type of input data and the set of the considered genes. Signature genes have an official gene symbol (Hugo consortium) or an unequivocal translation versus this kind of annotation. Genes without an official gene symbol were removed and signatures with a total amount of untranslatable gene names greater than the 5% were not included.
The input expression dataset must be normalized RNA-Seq counts (or normalized data matrix from microarrays) and they can be provided in the form of matrix, data frame or SummarizedExperiment. Regardless of the input type, the output data is a SummarizedExperiment with the computed signature scores added in the colData
section.
Gene lists of signatures reported in literature are typically symbols, but signifinder
can either use gene symbols, NCBI entrez or ensembl gene IDs. Users can say which of the three identifiers they use (SYMBOL, ENTREZID or ENSEMBL) to let the package convert the signature gene lists for the matching of gene data (nametype
argument inside the signature functions).
When a signature is computed a message is shown that says the percentage of genes used for the calculation of the signature compared to the original list. There is no minimum threshold of genes for signatures to be computed, but a warning
will be given if there are less than the 30% of signature genes. After a signature has been calculated it is possible to visually inspect signature gene expressions using geneHeatmapSignPlot
(see Gene Expression Heatmap).
Furthermore, providing the signatures the original works also specify the type of expression value (e.g. normalized value, TPM (transcript per million), log(TPM), etc…) that should be used to compute the signature. Therefore, during signature computation, data type should be eventually converted as reported in the original work. When using signifinder
, users must supply the input data in the form of normalised counts (or normalised arrays) and, for the signatures which require this, a data transformation step will be automatically performed. The transformed data matrix will be included in the output as an additional assay and the name of the assay will be the name of the conversion (i.e. “TPM”, “CPM” or “FPKM”). Additionally, crucially important is to specify the type of data used: “microarray” or “rnaseq” (inputType
argument inside the signature functions). Finally, included signatures have been developed both from array and RNA-seq data. In signifinder
, signatures for microarray can be applied to RNA-seq data but not vice versa due to input type conversions.
Alternatively, if the input data is a SummarizedExperiment
object that contains (in addition to the normalized count) also an assay of the transformed data, this will be used directly. Note that in order to be used they must be called “TPM”, “CPM” or “FPKM”.
In the following we use an example expression dataset of ovarian cancer to show how to use signifinder
with a standard workflow.
# loading packages
library(SummarizedExperiment)
library(signifinder)
library(dplyr)
data(ovse)
ovse
## class: SummarizedExperiment
## dim: 1456 40
## metadata(0):
## assays(4): norm_expr TPM CPM FPKM
## rownames(1456): ACOT7 ADORA3 ... TMSB4Y USP9Y
## rowData names(0):
## colnames(40): sample1 sample2 ... sample39 sample40
## colData names(40): OV_subtype os ... DNArep_Kang IPSOV_Shen
We can check all the signatures available in the package with the function availableSignatures
.
availSigns <- availableSignatures()
The function returns a data frame with all the signatures included in the package and for each signature the following information:
knitr::kable(t(availSigns[1,]), caption = 'One signature fiels')
1 | |
---|---|
signature | EMT_Miow |
scoreLabel | EMT_Miow_Epithelial, EMT_Miow_Mesenchymal |
functionName | EMTSign |
topic | epithelial to mesenchymal |
tumor | ovarian cancer |
tissue | ovary |
requiredInput | microarray, rnaseq |
transformationStep | normArray, normCounts |
author | Miow |
reference | Miow Q. et al. Oncogene (2015) |
description | Double score obtained with ssGSEA to establish the epithelial- and the mesenchymal-like status in ovarian cancer patients. |
We can also interrogate the table asking which signatures are available for a specific tissue (e.g. ovary).
ovary_signatures <- availableSignatures(tissue = "ovary",
description = FALSE)
knitr::kable(ovary_signatures,
caption = 'Signatures developed for ovary.') %>%
kableExtra::kable_paper() %>%
kableExtra::scroll_box(width = "82%", height = "500px")
signature | scoreLabel | functionName | topic | tumor | tissue | requiredInput | transformationStep | author | reference | |
---|---|---|---|---|---|---|---|---|---|---|
1 | EMT_Miow | EMT_Miow_Epithelial, EMT_Miow_Mesenchymal | EMTSign | epithelial to mesenchymal | ovarian cancer | ovary | microarray, rnaseq | normArray, normCounts | Miow | Miow Q. et al. Oncogene (2015) |
4 | Pyroptosis_Ye | Pyroptosis_Ye | pyroptosisSign | pyroptosis | ovarian cancer | ovary | rnaseq | FPKM | Ye | Ye Y. et al. Cell Death Discov. (2021) |
8 | Ferroptosis_Ye | Ferroptosis_Ye | ferroptosisSign | ferroptosis | ovarian cancer | ovary | microarray, rnaseq | normArray, FPKM | Ye | Ye Y. et al. Front. Mol. Biosci. (2021) |
12 | LipidMetabolism_Zheng | LipidMetabolism_Zheng | lipidMetabolismSign | metabolism | epithelial ovarian cancer | ovary | rnaseq | normCounts | Zheng | Zheng M. et al. Int. J. Mol. Sci. (2020) |
14 | ImmunoScore_Hao | ImmunoScore_Hao | immunoScoreSign | immune system | epithelial ovarian cancer | ovary | microarray, rnaseq | normArray, log2(FPKM+0.01) | Hao | Hao D. et al. Clin Cancer Res (2018) |
16 | ConsensusOV_Chen | ConsensusOV_Chen_IMR, ConsensusOV_Chen_DIF, ConsensusOV_Chen_PRO, ConsensusOV_Chen_MES | consensusOVSign | ovarian subtypes | high-grade serous ovarian carcinoma | ovary | microarray, rnaseq | normArray, normCounts | Chen | Chen G.M. et al. Clin Cancer Res (2018) |
18 | Matrisome_Yuzhalin | Matrisome_Yuzhalin | matrisomeSign | extracellular matrix | ovarian cystadenocarcinoma, gastric adenocarcinoma, colorectal adenocarcinoma, lung adenocarcinoma | ovary, lung, stomach, colon | microarray, rnaseq | normArray, normCounts | Yuzhalin | Yuzhalin A. et al. Br J Cancer (2018) |
43 | HRDS_Lu | HRDS_Lu | HRDSSign | chromosomal instability | ovarian cancer, breast cancer | ovary, breast | microarray, rnaseq | normArray, normCounts | Lu | Lu J. et al. J Mol Med (2014) |
45 | DNArep_Kang | DNArep_Kang | DNArepSign | chromosomal instability | serous ovarian cystadenocarcinoma | ovary | microarray, rnaseq | normArray, log2(normCount+1) | Kang | Kang J. et al. JNCI (2012) |
46 | IPSOV_Shen | IPSOV_Shen | IPSOVSign | immune system | ovarian cancer | ovary | microarray, rnaseq | normArray, log2(normCount+1) | Shen | Shen S. et al. EBiomed (2019) |
Once we have found a signature of interest, we can compute it by using the corresponding function (indicated in the functionName
field of availableSignatures
table). All the signature functions require the expression data and to indicate the type of input data (inputType
equal to “rnaseq” or “microarray”). Data are supposed to be the normalized expression values in the form of a data frame or a matrix with genes in rows samples in columns. Alternatively, an SummarizedExperiment
object containing an assay called ‘norm_expr’ where rows correspond to genes and columns correspond to samples.
ovse <- ferroptosisSign(dataset = ovse,
inputType = "rnaseq")
## ferroptosisSignYe is using 100% of signature genes
Signatures are often grouped in the same function by cancer topic even if they deal with different cancer types and computation approaches. We can unequivocally choose the one we are interested in by stating the first author of the signature (indicated in the author
field of availableSignatures
table). E.g., currently, there are three different epithelial to mesenchymal transition (EMT) signatures implemented inside the EMTSign
function (“Miow”, “Mak” or “Cheng”). We can choose which one to compute stating the author
argument:
ovse <- EMTSign(dataset = ovse,
inputType = "rnaseq",
author = "Miow")
## EMTSignMiow is using 96% of epithelial signature genes
## EMTSignMiow is using 91% of mesenchymal signature genes
## Warning in .filterFeatures(expr, method): 1 genes with constant expression
## values throuhgout the samples.
## [1] "Calculating ranks..."
## [1] "Calculating absolute values from ranks..."
In this way, “EMT_Miow” is computed. Regardless of the expression input type, the output data of all the signature functions is a SummarizedExperiment
with the original expression data in the assay
and the computed signature scores in the colData
. Thus, the returned object can be resubmitted as input data to another signature function and will be returned as well with the addition of the new signature in the colData
.
We can also compute multiple signatures at once with the function multipleSign
. Supplying the expression dataset and the input type without any other argument, all the signatures will be computed. Otherwise, we can specify a sub-group of signatures through the use of the arguments tissue
, tumor
and/or topic
to define signature attributes that will additionally narrow the signature list. Alternatively, we can state exactly the signatures using the whichSign
argument. E.g. here below we computed all the available signature for ovary and pan-tissue:
ovse <- multipleSign(dataset = ovse,
inputType = "rnaseq",
tissue = c("ovary", "pan-tissue"))
## EMTSignMiow is using 96% of epithelial signature genes
## EMTSignMiow is using 91% of mesenchymal signature genes
## Warning in .filterFeatures(expr, method): 1 genes with constant expression
## values throuhgout the samples.
## [1] "Calculating ranks..."
## [1] "Calculating absolute values from ranks..."
## EMTSignMak is using 96% of epithelial signature genes
## EMTSignMak is using 100% of mesenchymal signature genes
## pyroptosisSignYe is using 86% of signature genes
## ferroptosisSignYe is using 100% of signature genes
## lipidMetabolismSign is using 100% of signature genes
## hypoxiaSign is using 92% of signature genes
## immunoScoreSignHao is using 100% of signature genes
## immunoScoreSignRoh is using 100% of signature genes
## 'select()' returned 1:1 mapping between keys and columns
## Loading training data
## Training Random Forest...
## IPSSign is using 98% of signature genes
## matrisomeSign is using 100% of signature genes
## mitoticIndexSign is using 100% of signature genes
## ImmuneCytSignRooney is using 100% of signature genes
## IFNSign is using 100% of signature genes
## expandedImmuneSign is using 100% of signature genes
## TinflamSign is using 100% of signature genes
## CINSign is using 96% of signature genes
## CINSign is using 94% of signature genes
## cellCycleSignLundberg is using 93% of signature genes
## cellCycleSignDavoli is using 100% of signature genes
## ASCSign is using 92% of signature genes
## ImmuneCytSignDavoli is using 100% of signature genes
## ChemokineSign is using 100% of signature genes
## ECMSign is using 100% of up signature genes
## ECMSign is using 93% of down signature genes
## Warning in .filterFeatures(expr, method): 1 genes with constant expression
## values throuhgout the samples.
## [1] "Calculating ranks..."
## [1] "Calculating absolute values from ranks..."
## HRDSSign is using 89% of signature genes
## VEGFSign is using 100% of signature genes
## DNArepSign is using 87% of signature genes
## IPSOVSign is using 100% of signature genes
## Warning in .gsva(expr, mapped.gset.idx.list, method, kcdf, rnaseq,
## abs.ranking, : Some gene sets have size one. Consider setting 'min.sz > 1'.
## [1] "Calculating ranks..."
## [1] "Calculating absolute values from ranks..."
Every single signature computed can be explored using the oneSignPlot
function to visualize both the score and the density distribution.
oneSignPlot(data = ovse,
whichSign = "Hypoxia_Buffa")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Users may be also interested in visually exploring the expression values of the genes involved in a signature. In this case, we can use geneHeatmapSignPlot
to visualize them. It generates a heatmap of the expression values with genes on the rows and samples on the columns. Further, the function is not restricted to the visualization of only one signature, and we can also plot the expression values of genes of multiple signatures also evaluating the gene list intersections.
geneHeatmapSignPlot(data = ovse,
whichSign = "LipidMetabolism_Zheng",
logCount = TRUE)
geneHeatmapSignPlot(data = ovse,
whichSign = c("IFN_Ayers", "Tinflam_Ayers"),
logCount = TRUE)
To easily investigate the relation across multiple signatures, signifinder
provides the function to easily show the pairwise correlations of the signatures (correlationSignPlot
). The whichSign
argument could be set to specify which signatures should be plotted. When it is not stated all signatures inside the SummarizedExperiment
data are used. Green-blue colors represent anticorrelations while orange-red scale is for positive correlations. Then, signatures are clustered to group together higher related ones.
sign_cor <- correlationSignPlot(data = ovse)
highest_correlated <- unique(unlist(
sign_cor$data[(sign_cor$data$cor>0.95 & sign_cor$data$cor<1),c(1,2)]
))
We can compare scores across different signatures with the hetmapSignPlot
function. Scores are scaled between zero and one to be comparable to each other. The whichSign
argument could be set to specify which signatures should be plotted. When it is not stated all signatures inside the SummarizedExperiment
data are used.
heatmapSignPlot(data = ovse)
heatmapSignPlot(data = ovse,
whichSign = highest_correlated)
Users may also be interested in seeing how signatures are sorted in relation to only one or few of them . In this case, we can pass one or few signatures to the clusterBySign
argument that will be used to cluster samples.
Furthermore, users can add to the plot external sample annotations or plot the internal signature annotations (“signature”, “topic”, “tumor” or “tissue”).
heatmapSignPlot(data = ovse,
clusterBySign = paste0("ConsensusOV_Chen_", c("IMR","DIF","PRO","MES")),
sampleAnnot = ovse$OV_subtype, signAnnot = "topic")
Using the function survivalSignPlot
we can test the association with survival of a signature. The function needs the summarizedExperiment
with the signature values in the colData
and the patient survival time data. survivalSignPlot
uses a Kaplan-Meier curve to test if patients with high or low values of the signature have differences in survival time. Different cut points of the signature score can be indicated through the argument cutpoint
to define the two patient groups.
mysurvData <- cbind(ovse$os, ovse$status)
rownames(mysurvData) <- rownames(colData(ovse))
head(mysurvData)
## [,1] [,2]
## sample1 NA 0
## sample2 1720 1
## sample3 887 1
## sample4 547 1
## sample5 260 0
## sample6 1069 1
survivalSignPlot(data = ovse,
survData = mysurvData,
whichSign = "Pyroptosis_Ye",
cutpoint = "optimal")
Finally, we can plot ridge lines with one or multiple signatures, also grouping samples by external annotations if needed.
ridgelineSignPlot(data = ovse,
whichSign = highest_correlated)
ridgelineSignPlot(data = ovse,
whichSign = highest_correlated,
groupByAnnot = ovse$OV_subtype)
## Warning: Removed 1 rows containing non-finite values (stat_density_ridges).
Please contact us if you have a gene expression cancer signature that you would like to see added to this package. The only requirement is that the signature has publicly available gene list and method to compute it. The more difficult/custom the implementation, the better, as its inclusion in this package will provide more value for other users in the R/Bioconductor community.
Here is the output of sessionInfo() on the system on which this document was compiled.
sessionInfo()
## R version 4.2.1 (2022-06-23)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.5 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack.so
##
## 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
##
## attached base packages:
## [1] stats4 stats graphics grDevices utils datasets methods
## [8] base
##
## other attached packages:
## [1] dplyr_1.0.10 signifinder_1.0.0
## [3] SummarizedExperiment_1.28.0 Biobase_2.58.0
## [5] GenomicRanges_1.50.0 GenomeInfoDb_1.34.0
## [7] IRanges_2.32.0 S4Vectors_0.36.0
## [9] BiocGenerics_0.44.0 MatrixGenerics_1.10.0
## [11] matrixStats_0.62.0 BiocStyle_2.26.0
##
## loaded via a namespace (and not attached):
## [1] openair_2.11
## [2] utf8_1.2.2
## [3] tidyselect_1.2.0
## [4] RSQLite_2.2.18
## [5] AnnotationDbi_1.60.0
## [6] grid_4.2.1
## [7] BiocParallel_1.32.0
## [8] maxstat_0.7-25
## [9] munsell_0.5.0
## [10] ScaledMatrix_1.6.0
## [11] codetools_0.2-18
## [12] interp_1.1-3
## [13] withr_2.5.0
## [14] colorspace_2.0-3
## [15] filelock_1.0.2
## [16] TxDb.Hsapiens.UCSC.hg38.knownGene_3.16.0
## [17] highr_0.9
## [18] knitr_1.40
## [19] rstudioapi_0.14
## [20] SingleCellExperiment_1.20.0
## [21] ggsignif_0.6.4
## [22] labeling_0.4.2
## [23] DGEobj.utils_1.0.6
## [24] GenomeInfoDbData_1.2.9
## [25] KMsurv_0.1-5
## [26] farver_2.1.1
## [27] bit64_4.0.5
## [28] rhdf5_2.42.0
## [29] vctrs_0.5.0
## [30] generics_0.1.3
## [31] xfun_0.34
## [32] BiocFileCache_2.6.0
## [33] randomForest_4.7-1.1
## [34] markdown_1.3
## [35] R6_2.5.1
## [36] doParallel_1.0.17
## [37] clue_0.3-62
## [38] rsvd_1.0.5
## [39] AnnotationFilter_1.22.0
## [40] bitops_1.0-7
## [41] rhdf5filters_1.10.0
## [42] cachem_1.0.6
## [43] DelayedArray_0.24.0
## [44] assertthat_0.2.1
## [45] BiocIO_1.8.0
## [46] scales_1.2.1
## [47] gtable_0.3.1
## [48] beachmat_2.14.0
## [49] Cairo_1.6-0
## [50] ensembldb_2.22.0
## [51] rlang_1.0.6
## [52] systemfonts_1.0.4
## [53] GlobalOptions_0.1.2
## [54] splines_4.2.1
## [55] rtracklayer_1.58.0
## [56] rstatix_0.7.0
## [57] lazyeval_0.2.2
## [58] hexbin_1.28.2
## [59] broom_1.0.1
## [60] BiocManager_1.30.19
## [61] yaml_2.3.6
## [62] abind_1.4-5
## [63] GenomicFeatures_1.50.0
## [64] backports_1.4.1
## [65] gridtext_0.1.5
## [66] tools_4.2.1
## [67] bookdown_0.29
## [68] DGEobj_1.1.2
## [69] ggplot2_3.3.6
## [70] kableExtra_1.3.4
## [71] ellipsis_0.3.2
## [72] jquerylib_0.1.4
## [73] RColorBrewer_1.1-3
## [74] ggridges_0.5.4
## [75] Rcpp_1.0.9
## [76] sparseMatrixStats_1.10.0
## [77] progress_1.2.2
## [78] zlibbioc_1.44.0
## [79] purrr_0.3.5
## [80] RCurl_1.98-1.9
## [81] prettyunits_1.1.1
## [82] ggpubr_0.4.0
## [83] deldir_1.0-6
## [84] viridis_0.6.2
## [85] GetoptLong_1.0.5
## [86] zoo_1.8-11
## [87] cluster_2.1.4
## [88] exactRankTests_0.8-35
## [89] magrittr_2.0.3
## [90] magick_2.7.3
## [91] data.table_1.14.4
## [92] circlize_0.4.15
## [93] survminer_0.4.9
## [94] mvtnorm_1.1-3
## [95] ProtGenerics_1.30.0
## [96] hms_1.1.2
## [97] patchwork_1.1.2
## [98] evaluate_0.17
## [99] GSVA_1.46.0
## [100] xtable_1.8-4
## [101] XML_3.99-0.12
## [102] jpeg_0.1-9
## [103] gridExtra_2.3
## [104] shape_1.4.6
## [105] compiler_4.2.1
## [106] biomaRt_2.54.0
## [107] tibble_3.1.8
## [108] maps_3.4.1
## [109] consensusOV_1.20.0
## [110] crayon_1.5.2
## [111] htmltools_0.5.3
## [112] mgcv_1.8-41
## [113] tzdb_0.3.0
## [114] ggtext_0.1.2
## [115] tidyr_1.2.1
## [116] lubridate_1.8.0
## [117] DBI_1.1.3
## [118] dbplyr_2.2.1
## [119] ComplexHeatmap_2.14.0
## [120] MASS_7.3-58.1
## [121] rappdirs_0.3.3
## [122] Matrix_1.5-1
## [123] car_3.1-1
## [124] readr_2.1.3
## [125] cli_3.4.1
## [126] parallel_4.2.1
## [127] km.ci_0.5-6
## [128] pkgconfig_2.0.3
## [129] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2
## [130] GenomicAlignments_1.34.0
## [131] xml2_1.3.3
## [132] foreach_1.5.2
## [133] svglite_2.1.0
## [134] annotate_1.76.0
## [135] bslib_0.4.0
## [136] webshot_0.5.4
## [137] XVector_0.38.0
## [138] rvest_1.0.3
## [139] stringr_1.4.1
## [140] digest_0.6.30
## [141] graph_1.76.0
## [142] Biostrings_2.66.0
## [143] rmarkdown_2.17
## [144] survMisc_0.5.6
## [145] DelayedMatrixStats_1.20.0
## [146] GSEABase_1.60.0
## [147] restfulr_0.0.15
## [148] curl_4.3.3
## [149] commonmark_1.8.1
## [150] Rsamtools_2.14.0
## [151] rjson_0.2.21
## [152] lifecycle_1.0.3
## [153] nlme_3.1-160
## [154] jsonlite_1.8.3
## [155] Rhdf5lib_1.20.0
## [156] carData_3.0-5
## [157] mapproj_1.2.9
## [158] viridisLite_0.4.1
## [159] limma_3.54.0
## [160] fansi_1.0.3
## [161] pillar_1.8.1
## [162] lattice_0.20-45
## [163] KEGGREST_1.38.0
## [164] fastmap_1.1.0
## [165] httr_1.4.4
## [166] survival_3.4-0
## [167] glue_1.6.2
## [168] png_0.1-7
## [169] iterators_1.0.14
## [170] bit_4.0.4
## [171] stringi_1.7.8
## [172] sass_0.4.2
## [173] HDF5Array_1.26.0
## [174] blob_1.2.3
## [175] org.Hs.eg.db_3.16.0
## [176] BiocSingular_1.14.0
## [177] latticeExtra_0.6-30
## [178] memoise_2.0.1
## [179] irlba_2.3.5.1