1 Introduction

In cancer studies, transcriptional signatures are studied as good indicators of cancer phenotypes, for their potential to show cancer ongoing activities and can be used for patient stratification. For these reasons, they are considered potentially useful to guide therapeutic decisions and monitoring interventions. Moreover, transcriptional signatures of RNA-seq experiments are also used to assess the complex relations between the tumor and its microenvironment. In recent years, the new technologies for transcriptome detection (single-cell RNA-seq and spatial transcriptomics) highlighted the highly heterogeneous behaviour of this disease and, as a result, the need to dissect its complexity. To better achieve this result, the combined analysis of multiple signatures may reveal possible correlations between different tumor processes and allow patients (or cells or spots) to be stratified at a broader level of information.

Transcriptional signatures are based upon a specific gene set - and eventually a set of coefficients to differently weight the gene contributions - whose expression levels are combined in a score designed to provide a single-sample (-cell, -spot) prediction. Hence, signatures consist not only of a list of genes but also of an algorithm that defines the computation of the single-sample prediction score. 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 easily integrate the most popular expression data analysis packages to complement the results and improve data interpretations.

Also, 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.

2 Installation

To install this package:

if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("signifinder")

3 Criteria for signature inclusion

Stringent criteria for the inclusion of the signatures were established: (i) signatures should rely on cancer topics, and be developed and used on cancer samples; (ii) signatures should exclusively use transcriptomic data, though exceptions have been made in case of combination of gene expression and signature-related gene weights; (iii) signatures must release a clear gene list used for the signature definition, where all genes have an official gene symbol (Hugo consortium) or an unambiguous translation (genes without an official gene symbol are removed); (iv) the method to calculate expression-based scores should be unambiguously described; (v) additional clarity about the type of expression in the input (e.g., counts, log counts, FPKM, or others) may also be required. In the current release of signifinder, all the included signatures rely on bulk tumor expression experiments, even if the package infrastructure could potentially store and manage signatures derived by single-cell and spatial transcriptomics. Further, while it may not ever be possible to include all cancer signatures proposed in the literature, our package makes easy the addition of new signatures (by us or by others via “pull requests”, see Adding new signatures).

4 How to use signifinder

4.1 Input expression data

The input expression dataset must be normalized RNA-Seq counts (or normalized data matrix from microarrays) of bulk transcriptomics data, single-cell transcriptomics data or spatial transcriptomics data. They should be provided in the form of a matrix, a data frame or a SummarizedExperiment (and respectively SingleCellExperiment/SpatialExperiment). In the last case, the name of the assay containing the normalized values must be “norm_expr”. Regardless of the input type, the output data is a SummarizedExperiment (SingleCellExperiment/SpatialExperiment) where the scores computed are put in the colData section.

Gene lists of signatures reported in literature are typically in symbol IDs, 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, the original works, that provide the signatures, 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”). Alternatively, if the input data is a SummarizedExperiment object that already 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”. Finally, included signatures have been developed both from array and RNA-seq data, therefore it is crucially important for users to specify the type of data used: “microarray” or “rnaseq” (inputType argument inside the signature functions). In signifinder, signatures for microarray can be applied to RNA-seq data but not vice versa due to input type conversions.

4.2 Computation of scores

In the following section, we use an example bulk 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:

  • signature: name of the signature
  • scoreLabel: label of the signature when computed and inserted inside results
  • functionName: name of the function to use to compute the signature
  • topic: general cancer topic
  • tumor: tumor type for which the signature was developed
  • tissue: tumor tissue for which the signature was developed
  • cellType: cell type for which the signature was developed
  • requiredInput: tumor data with which the signature was developed
  • transformationStep: data transformation step performed inside the function starting from the user’s ‘normArray’ or ‘normCounts’ data
  • author: first author of the work in which the signature is described
  • reference: reference of the work
  • description: brief description of the signature and how to evaluate its score
1
signature EMT_Miow
scoreLabel EMT_Miow_Epithelial, EMT_Miow_Mesenchymal
functionName EMTSign
topic epithelial to mesenchymal
tumor ovarian cancer
tissue ovary
cellType bulk
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)
Table 1: Signatures developed for ovary collected in signifinder.
signature scoreLabel functionName topic tumor tissue cellType requiredInput transformationStep author reference
1 EMT_Miow EMT_Miow_Epithelial, EMT_Miow_Mesenchymal EMTSign epithelial to mesenchymal ovarian cancer ovary bulk microarray, rnaseq normArray, normCounts Miow Miow Q. et al. Oncogene (2015)
4 Pyroptosis_Ye Pyroptosis_Ye pyroptosisSign pyroptosis ovarian cancer ovary bulk rnaseq FPKM Ye Ye Y. et al. Cell Death Discov. (2021)
8 Ferroptosis_Ye Ferroptosis_Ye ferroptosisSign ferroptosis ovarian cancer ovary bulk microarray, rnaseq normArray, FPKM Ye Ye Y. et al. Front. Mol. Biosci. (2021)
12 LipidMetabolism_Zheng LipidMetabolism_Zheng lipidMetabolismSign metabolism epithelial ovarian cancer ovary bulk rnaseq normCounts Zheng Zheng M. et al. Int. J. Mol. Sci. (2020)
14 ImmunoScore_Hao ImmunoScore_Hao immunoScoreSign immune system epithelial ovarian cancer ovary bulk 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 bulk 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 bulk 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 bulk 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 bulk microarray, rnaseq normArray, log2(normCount+1) Kang Kang J. et al. JNCI (2012)
46 IPSOV_Shen IPSOV_Shen IPSOVSign immune system ovarian cancer ovary bulk 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 and samples in columns. Alternatively, a 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: Calling gsva(expr=., gset.idx.list=., method=., ...) is deprecated;
## use a method-specific parameter object (see '?gsva').
## Warning in .filterFeatures(expr, method): 1 genes with constant expression
## values throughout 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: Calling gsva(expr=., gset.idx.list=., method=., ...) is deprecated;
## use a method-specific parameter object (see '?gsva').
## Warning in .filterFeatures(expr, method): 1 genes with constant expression
## values throughout 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: Calling gsva(expr=., gset.idx.list=., method=., ...) is deprecated;
## use a method-specific parameter object (see '?gsva').

## Warning: 1 genes with constant expression values throughout 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: Calling gsva(expr=., gset.idx.list=., method=., ...) is deprecated;
## use a method-specific parameter object (see '?gsva').
## 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..."

4.3 Visualization

4.3.1 Evaluation plot

As a first step, we can visualize some signature’s technical parameters to evaluate their reliability for our analysis. Thus, the evaluationSignPlot function returns a multipanel plot that shows for each signature: (i) the percentage of genes from the signature gene list that are actually available in the dataset; (ii) the log2 average expressions of these genes (iii) the percentage of zero values in them; (iv) the correlation between scores and total read counts; (v) the correlation between scores and the percentage of total zero values.

evaluationSignPlot(data = ovse)

4.3.2 Score distribution plot

Each 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`.

4.3.3 Gene expression heatmap

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 from 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)

4.3.4 Score correlation plot

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)]
    ))

4.3.5 Score heatmap

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")

4.3.6 Survival plot

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")

4.3.7 Score ridgeline plot

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()`).

4.4 Other examples

Here, we present the results obtained with other two example datasets; one for single-cell transcriptomics and one for spatial transcriptomics.

4.4.1 Single-cell transcriptomics

We report here the results obtained using the single-cell transcriptomics dataset coming from a glioblastoma tissue of Darmanis et al. (GEO ID: GSE84465, Darmanis, S. et al. Single-Cell RNA-Seq Analysis of Infiltrating Neoplastic Cells at the Migrating Front of Human Glioblastoma. Cell Rep 21, 1399–1410 (2017)). We focused on the cells coming from the BT_S2 patient, that were labeled as immune cells, neoplastic or oligodendrocyte precursor cells (OPC) and that come from both the core and the periphery of the tumor.

We computed all the signatures for “brain” and “pan-tissue” that are available in signifinder running the command multipleSign setting inputType = "rnaseq" and tissue = c("brain", "pan-tissue"). Then, we performed a t-SNE and plotted the signature scores. Here, we can see the ridge plot and the t-SNE colored by some of the signatures computed, all cells or separately for different cell types.

4.4.2 Spatial transcriptomics

We used the spatial transcriptomic dataset “Human Breast Cancer: Ductal Carcinoma In Situ, Invasive Carcinoma (FFPE)”, included in the 10x Genomics Visium Spatial Gene Expression data, from the 10x website (https://www.10xgenomics.com). A manual annotation of the tissue area was performed and used to annotate the spots. We computed all the signatures for “breast” and “pan-tissue” cancers available in signifinder running the command multipleSign setting inputType = "rnaseq" and tissue = c("breast", "pan-tissue"). Here, we show the ridge plot and the spatial distribution of scores obtained for the Hipoxia_Buffa signature.

5 Adding new signatures

Please contact us if you have a gene expression signature that you would like to see added to the signifinder package. You can write us an email or open an issue in https://github.com/CaluraLab/signifinder/issues. We only have few criteria for the inclusion of the signatures: (i) they should rely on cancer topics, and be developed and used on cancer samples; (ii) signatures should exclusively use transcriptomic data, or combination of gene expression and signature-related gene weights; (iii) authors of the signature must release a clear gene list used for the signature definition, where all genes have an official gene symbol (Hugo consortium) or an unambiguous translation (genes without an official gene symbol are removed); (iv) the method to calculate expression-based scores should be unambiguously described in the paper; (v) additional clarity about the type of expression in the input (e.g., counts, log counts, FPKM, or others) is also required. 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.

6 Session info

Here is the output of sessionInfo() on the system on which this document was compiled.

sessionInfo()
## R version 4.3.1 (2023-06-16)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.3 LTS
## 
## Matrix products: default
## BLAS:   /home/biocbuild/bbs-3.18-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] dplyr_1.1.3                 signifinder_1.4.0          
##  [3] SummarizedExperiment_1.32.0 Biobase_2.62.0             
##  [5] GenomicRanges_1.54.0        GenomeInfoDb_1.38.0        
##  [7] IRanges_2.36.0              S4Vectors_0.40.0           
##  [9] BiocGenerics_0.48.0         MatrixGenerics_1.14.0      
## [11] matrixStats_1.0.0           BiocStyle_2.30.0           
## 
## loaded via a namespace (and not attached):
##   [1] ggtext_0.1.2                            
##   [2] ProtGenerics_1.34.0                     
##   [3] GSVA_1.50.0                             
##   [4] bitops_1.0-7                            
##   [5] lubridate_1.9.3                         
##   [6] httr_1.4.7                              
##   [7] webshot_0.5.5                           
##   [8] RColorBrewer_1.1-3                      
##   [9] doParallel_1.0.17                       
##  [10] tools_4.3.1                             
##  [11] backports_1.4.1                         
##  [12] utf8_1.2.4                              
##  [13] R6_2.5.1                                
##  [14] HDF5Array_1.30.0                        
##  [15] lazyeval_0.2.2                          
##  [16] mgcv_1.9-0                              
##  [17] rhdf5filters_1.14.0                     
##  [18] GetoptLong_1.0.5                        
##  [19] withr_2.5.1                             
##  [20] prettyunits_1.2.0                       
##  [21] gridExtra_2.3                           
##  [22] cli_3.6.1                               
##  [23] exactRankTests_0.8-35                   
##  [24] Cairo_1.6-1                             
##  [25] labeling_0.4.3                          
##  [26] sass_0.4.7                              
##  [27] mvtnorm_1.2-3                           
##  [28] survMisc_0.5.6                          
##  [29] readr_2.1.4                             
##  [30] randomForest_4.7-1.1                    
##  [31] ggridges_0.5.4                          
##  [32] commonmark_1.9.0                        
##  [33] Rsamtools_2.18.0                        
##  [34] systemfonts_1.0.5                       
##  [35] svglite_2.1.2                           
##  [36] maps_3.4.1                              
##  [37] limma_3.58.0                            
##  [38] rstudioapi_0.15.0                       
##  [39] RSQLite_2.3.1                           
##  [40] generics_0.1.3                          
##  [41] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2 
##  [42] shape_1.4.6                             
##  [43] BiocIO_1.12.0                           
##  [44] consensusOV_1.24.0                      
##  [45] car_3.1-2                               
##  [46] Matrix_1.6-1.1                          
##  [47] interp_1.1-4                            
##  [48] fansi_1.0.5                             
##  [49] abind_1.4-5                             
##  [50] lifecycle_1.0.3                         
##  [51] yaml_2.3.7                              
##  [52] carData_3.0-5                           
##  [53] rhdf5_2.46.0                            
##  [54] SparseArray_1.2.0                       
##  [55] BiocFileCache_2.10.0                    
##  [56] grid_4.3.1                              
##  [57] blob_1.2.4                              
##  [58] crayon_1.5.2                            
##  [59] lattice_0.22-5                          
##  [60] beachmat_2.18.0                         
##  [61] cowplot_1.1.1                           
##  [62] GenomicFeatures_1.54.0                  
##  [63] annotate_1.80.0                         
##  [64] KEGGREST_1.42.0                         
##  [65] mapproj_1.2.11                          
##  [66] magick_2.8.1                            
##  [67] pillar_1.9.0                            
##  [68] knitr_1.44                              
##  [69] ComplexHeatmap_2.18.0                   
##  [70] rjson_0.2.21                            
##  [71] codetools_0.2-19                        
##  [72] glue_1.6.2                              
##  [73] data.table_1.14.8                       
##  [74] vctrs_0.6.4                             
##  [75] png_0.1-8                               
##  [76] gtable_0.3.4                            
##  [77] assertthat_0.2.1                        
##  [78] cachem_1.0.8                            
##  [79] xfun_0.40                               
##  [80] S4Arrays_1.2.0                          
##  [81] survival_3.5-7                          
##  [82] SingleCellExperiment_1.24.0             
##  [83] iterators_1.0.14                        
##  [84] KMsurv_0.1-5                            
##  [85] statmod_1.5.0                           
##  [86] nlme_3.1-163                            
##  [87] bit64_4.0.5                             
##  [88] progress_1.2.2                          
##  [89] filelock_1.0.2                          
##  [90] openair_2.18-0                          
##  [91] bslib_0.5.1                             
##  [92] maxstat_0.7-25                          
##  [93] irlba_2.3.5.1                           
##  [94] colorspace_2.1-0                        
##  [95] DBI_1.1.3                               
##  [96] tidyselect_1.2.0                        
##  [97] bit_4.0.5                               
##  [98] compiler_4.3.1                          
##  [99] curl_5.1.0                              
## [100] rvest_1.0.3                             
## [101] graph_1.80.0                            
## [102] xml2_1.3.5                              
## [103] DelayedArray_0.28.0                     
## [104] bookdown_0.36                           
## [105] rtracklayer_1.62.0                      
## [106] scales_1.2.1                            
## [107] hexbin_1.28.3                           
## [108] rappdirs_0.3.3                          
## [109] stringr_1.5.0                           
## [110] SpatialExperiment_1.12.0                
## [111] digest_0.6.33                           
## [112] rmarkdown_2.25                          
## [113] XVector_0.42.0                          
## [114] htmltools_0.5.6.1                       
## [115] pkgconfig_2.0.3                         
## [116] jpeg_0.1-10                             
## [117] DGEobj.utils_1.0.6                      
## [118] sparseMatrixStats_1.14.0                
## [119] highr_0.10                              
## [120] dbplyr_2.3.4                            
## [121] fastmap_1.1.1                           
## [122] ensembldb_2.26.0                        
## [123] rlang_1.1.1                             
## [124] GlobalOptions_0.1.2                     
## [125] DelayedMatrixStats_1.24.0               
## [126] farver_2.1.1                            
## [127] jquerylib_0.1.4                         
## [128] zoo_1.8-12                              
## [129] jsonlite_1.8.7                          
## [130] BiocParallel_1.36.0                     
## [131] BiocSingular_1.18.0                     
## [132] RCurl_1.98-1.12                         
## [133] magrittr_2.0.3                          
## [134] kableExtra_1.3.4                        
## [135] GenomeInfoDbData_1.2.11                 
## [136] patchwork_1.1.3                         
## [137] Rhdf5lib_1.24.0                         
## [138] munsell_0.5.0                           
## [139] Rcpp_1.0.11                             
## [140] viridis_0.6.4                           
## [141] stringi_1.7.12                          
## [142] zlibbioc_1.48.0                         
## [143] MASS_7.3-60                             
## [144] org.Hs.eg.db_3.18.0                     
## [145] parallel_4.3.1                          
## [146] deldir_1.0-9                            
## [147] survminer_0.4.9                         
## [148] Biostrings_2.70.0                       
## [149] splines_4.3.1                           
## [150] gridtext_0.1.5                          
## [151] hms_1.1.3                               
## [152] circlize_0.4.15                         
## [153] ggpubr_0.6.0                            
## [154] ggsignif_0.6.4                          
## [155] markdown_1.11                           
## [156] biomaRt_2.58.0                          
## [157] ScaledMatrix_1.10.0                     
## [158] DGEobj_1.1.2                            
## [159] XML_3.99-0.14                           
## [160] evaluate_0.22                           
## [161] latticeExtra_0.6-30                     
## [162] BiocManager_1.30.22                     
## [163] tzdb_0.4.0                              
## [164] foreach_1.5.2                           
## [165] tidyr_1.3.0                             
## [166] purrr_1.0.2                             
## [167] km.ci_0.5-6                             
## [168] clue_0.3-65                             
## [169] ggplot2_3.4.4                           
## [170] rsvd_1.0.5                              
## [171] broom_1.0.5                             
## [172] xtable_1.8-4                            
## [173] restfulr_0.0.15                         
## [174] AnnotationFilter_1.26.0                 
## [175] rstatix_0.7.2                           
## [176] viridisLite_0.4.2                       
## [177] TxDb.Hsapiens.UCSC.hg38.knownGene_3.18.0
## [178] tibble_3.2.1                            
## [179] memoise_2.0.1                           
## [180] AnnotationDbi_1.64.0                    
## [181] GenomicAlignments_1.38.0                
## [182] cluster_2.1.4                           
## [183] timechange_0.2.0                        
## [184] GSEABase_1.64.0