SPAROscore: Data Structures

# load the necessary libraries
library(SPAROscore)
library(airway)
library(msigdbr)
library(dplyr)
library(Matrix)
library(DelayedArray)
library(GSEABase)
library(Seurat)
library(scater)

Supported input data structures

SPAROscore is designed to integrate seamlessly with data structures commonly used in bulk, single-cell, and spatial RNA-seq analysis workflows. Rather than requiring users to convert their data into a specific format, SPAROscore accepts a range of gene expression and gene signature data structures. This vignette demonstrates the supported input formats and illustrates how the output adapts to each input type.

  • For gene expression input, the following data structures are supported

    • Matrix-like objects: Dense matrices, Sparse Matrices, Delayed Arrays, and Data frames

    • Bioconductor data structures: SummarizedExperiment and its derived classes like SingleCellExperiment, SpatialExperiment, RangedSummarizedExperiment, tidySummarizedExperiment, etc.

    • Seurat objects: containing both single-cell and spatial datasets

Note: Matrix-like inputs return a score table, whereas container objects (e.g. SummarizedExperiment and Seurat) are returned with scores added to their metadata.

Input Accepted Output
matrix matrix
sparseMatrix matrix
DelayedArray matrix
data.frame matrix
SummarizedExperiment SummarizedExperiment
SingleCellExperiment SingleCellExperiment
SpatialExperiment SpatialExperiment
Seurat Seurat
  • For the gene signature input, the following formats are supported

    • For a single signature: A character vector, A GeneSet object

    • For multiple signatures: A named list of character vectors, GeneSetCollection objects.

Note: The Gene identifiers (gene names, ensembl ids, etc) in the signature must match those used in the expression data.

Example datasets

In this vignette, we will demonstrate the data structure handling capabilities of SPAROscore using the example dataset from the airway package. For the gene signatures, we will use the top differentially expressed genes reported in the original study, as well as the hallmark inflammatory response genes taken from the Molecular Signatures Database (MSigDB).

Load the gene expression dataset

# load the airway dataset
data(airway)

# extract the gene expression matrix
counts_data <- assay(airway)

# extract the metadata
metadata <- as.data.frame(colData(airway))

Load the gene signatures

# set the glucocorticoid response markers from the original study as a signature 
response_genes <- c("ENSG00000112936", "ENSG00000170606", "ENSG00000120129", 
                     "ENSG00000152795", "ENSG00000211445", "ENSG00000163884",
                     "ENSG00000189221", "ENSG00000101347", "ENSG00000196136", 
                     "ENSG00000152583", "ENSG00000120658", "ENSG00000157514",
                     "ENSG00000103196", "ENSG00000179094", "ENSG00000152763",
                     "ENSG00000103310", "ENSG00000127954")


# load the inflammatory response hallmark genes from msigdb
inflammation_genes <- msigdbr(species = "Homo sapiens", collection = "H") %>% 
  filter(gs_name == "HALLMARK_INFLAMMATORY_RESPONSE") %>%
    pull("ensembl_gene") %>%
    as.character()

Gene expression as matrix-like data structures

Dense matrix

# load gene expression data as dense matrix
counts_matrix <- as.matrix(counts_data)

# score for the dense matrix
scores_matrix <- sparoscore(data = counts_matrix, 
                                 signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view scores
scores_matrix
#>            SPAROscore
#> SRR1039508  0.3890656
#> SRR1039509  0.3769621
#> SRR1039512  0.3879705
#> SRR1039513  0.3645041
#> SRR1039516  0.3881300
#> SRR1039517  0.4005423
#> SRR1039520  0.3873233
#> SRR1039521  0.3836297

Note that one signature gene is absent from the input expression data, and SPAROscore reports this as a warning during scoring.

SparseMatrix

# load gene expression data as sparseMatrix
counts_sparse <- as(counts_matrix, "sparseMatrix")

# score for the sparseMatrix
scores_sparse <- sparoscore(data = counts_sparse, 
                                 signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view scores
scores_sparse
#>            SPAROscore
#> SRR1039508  0.3890656
#> SRR1039509  0.3769621
#> SRR1039512  0.3879705
#> SRR1039513  0.3645041
#> SRR1039516  0.3881300
#> SRR1039517  0.4005423
#> SRR1039520  0.3873233
#> SRR1039521  0.3836297

Gene ranking is performed directly on sparse matrices without first converting them to dense matrices, reducing memory usage and improving computational efficiency.

DelayedArrays

# load gene expression data as delayedArray
counts_delayed <- DelayedArray(counts_matrix)

# score for the DelayedArray
scores_delayed <- sparoscore(data = counts_delayed, 
                                 signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a DelayedMatrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view scores
scores_delayed
#>            SPAROscore
#> SRR1039508  0.3890656
#> SRR1039509  0.3769621
#> SRR1039512  0.3879705
#> SRR1039513  0.3645041
#> SRR1039516  0.3881300
#> SRR1039517  0.4005423
#> SRR1039520  0.3873233
#> SRR1039521  0.3836297

Note that the gene ranking is performed natively on the DelayedArray object, enabling improved computational efficiency.

Data frame

# load gene expression data as delayedArray
counts_df <- as.data.frame(counts_matrix)

# score for the DelayedArray
scores_df <- sparoscore(data = counts_df, 
                                 signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view scores
scores_df
#>            SPAROscore
#> SRR1039508  0.3890656
#> SRR1039509  0.3769621
#> SRR1039512  0.3879705
#> SRR1039513  0.3645041
#> SRR1039516  0.3881300
#> SRR1039517  0.4005423
#> SRR1039520  0.3873233
#> SRR1039521  0.3836297

Data frames are internally converted to matrices before ranking because matrix operations are more efficient for this step.

Verify if the output scores are the same with differing input formats

identical(scores_matrix, scores_sparse)
#> [1] TRUE
identical(scores_matrix, scores_delayed)
#> [1] TRUE
identical(scores_matrix, scores_df)
#> [1] TRUE

Gene signature representations

Single signature as a character vector

# compute scores from a character vector signature
scores_for_vector <- sparoscore(data = counts_matrix, 
                                 signatures = response_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object

# view scores
scores_for_vector
#>            SPAROscore
#> SRR1039508  0.5238153
#> SRR1039509  0.7654385
#> SRR1039512  0.5495932
#> SRR1039513  0.7473585
#> SRR1039516  0.5337068
#> SRR1039517  0.7162212
#> SRR1039520  0.5222398
#> SRR1039521  0.7593574

Single signature as a GeneSet object

# get a GeneSet object
response_geneset <- GeneSet(response_genes)

# compute scores from a GeneSet object
scores_for_geneset <- sparoscore(data = counts_sparse, 
                                 signatures = response_geneset, 
                                 prefix = "hello")
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object

# view scores
scores_for_geneset
#>              helloNA
#> SRR1039508 0.5238153
#> SRR1039509 0.7654385
#> SRR1039512 0.5495932
#> SRR1039513 0.7473585
#> SRR1039516 0.5337068
#> SRR1039517 0.7162212
#> SRR1039520 0.5222398
#> SRR1039521 0.7593574

Multiple signatures as a named list

# create a named list of vectors to score for both signatures simultaneously
gene_signatures <- list("glucocorticoid_response" = response_genes,
                        "inflammation_response" = inflammation_genes)

# compute scores from a list of signatures
scores_for_list <- sparoscore(data = counts_sparse, 
                                 signatures = gene_signatures)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view scores
scores_for_list
#>            glucocorticoid_response inflammation_response
#> SRR1039508               0.5238153             0.3890656
#> SRR1039509               0.7654385             0.3769621
#> SRR1039512               0.5495932             0.3879705
#> SRR1039513               0.7473585             0.3645041
#> SRR1039516               0.5337068             0.3881300
#> SRR1039517               0.7162212             0.4005423
#> SRR1039520               0.5222398             0.3873233
#> SRR1039521               0.7593574             0.3836297

Multiple signatures as a GeneSetCollection object

# create a GeneSetCollection object to score for both signatures simultaneously
gene_set_collection <- GeneSetCollection(
  mapply(function(g, n) GeneSet(unique(g), setName = n), 
         gene_signatures, names(gene_signatures))
)

# compute scores from a GeneSetCollection object
scores_for_gsc <- sparoscore(data = counts_matrix, 
                                 signatures = gene_set_collection)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view scores
scores_for_gsc
#>            glucocorticoid_response inflammation_response
#> SRR1039508               0.5238153             0.3890656
#> SRR1039509               0.7654385             0.3769621
#> SRR1039512               0.5495932             0.3879705
#> SRR1039513               0.7473585             0.3645041
#> SRR1039516               0.5337068             0.3881300
#> SRR1039517               0.7162212             0.4005423
#> SRR1039520               0.5222398             0.3873233
#> SRR1039521               0.7593574             0.3836297

SummarizedExperiment and derived objects

For SummarizedExperiment and its derived objects, after scoring, SPAROscore returns an object of the same class with the scores and the rank caps appended to the colData. The calculated gene ranks are added to a new assay named ranks.

In this example, let us work with a SingleCellExperiment object

# convert airways to a SingleCellExperiment object
airway_sce <- as(airway, "SingleCellExperiment")

# view the metadata of the object pre-scoring
colData(airway_sce)
#> DataFrame with 8 rows and 9 columns
#>            SampleName     cell      dex    albut        Run avgLength
#>              <factor> <factor> <factor> <factor>   <factor> <integer>
#> SRR1039508 GSM1275862  N61311     untrt    untrt SRR1039508       126
#> SRR1039509 GSM1275863  N61311     trt      untrt SRR1039509       126
#> SRR1039512 GSM1275866  N052611    untrt    untrt SRR1039512       126
#> SRR1039513 GSM1275867  N052611    trt      untrt SRR1039513        87
#> SRR1039516 GSM1275870  N080611    untrt    untrt SRR1039516       120
#> SRR1039517 GSM1275871  N080611    trt      untrt SRR1039517       126
#> SRR1039520 GSM1275874  N061011    untrt    untrt SRR1039520       101
#> SRR1039521 GSM1275875  N061011    trt      untrt SRR1039521        98
#>            Experiment    Sample    BioSample
#>              <factor>  <factor>     <factor>
#> SRR1039508  SRX384345 SRS508568 SAMN02422669
#> SRR1039509  SRX384346 SRS508567 SAMN02422675
#> SRR1039512  SRX384349 SRS508571 SAMN02422678
#> SRR1039513  SRX384350 SRS508572 SAMN02422670
#> SRR1039516  SRX384353 SRS508575 SAMN02422682
#> SRR1039517  SRX384354 SRS508576 SAMN02422673
#> SRR1039520  SRX384357 SRS508579 SAMN02422683
#> SRR1039521  SRX384358 SRS508580 SAMN02422677

# view the assays present in the object pre-scoring
assays(airway_sce)
#> List of length 1
#> names(1): counts

# compute scores for a SummarizedExperiment object
airway_sce <- sparoscore(data = airway_sce,
                        assay = "counts",
                        signatures = response_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object


# view the metadata of the object after-scoring
colData(airway_sce)
#> DataFrame with 8 rows and 11 columns
#>            SampleName     cell      dex    albut        Run avgLength
#>              <factor> <factor> <factor> <factor>   <factor> <integer>
#> SRR1039508 GSM1275862  N61311     untrt    untrt SRR1039508       126
#> SRR1039509 GSM1275863  N61311     trt      untrt SRR1039509       126
#> SRR1039512 GSM1275866  N052611    untrt    untrt SRR1039512       126
#> SRR1039513 GSM1275867  N052611    trt      untrt SRR1039513        87
#> SRR1039516 GSM1275870  N080611    untrt    untrt SRR1039516       120
#> SRR1039517 GSM1275871  N080611    trt      untrt SRR1039517       126
#> SRR1039520 GSM1275874  N061011    untrt    untrt SRR1039520       101
#> SRR1039521 GSM1275875  N061011    trt      untrt SRR1039521        98
#>            Experiment    Sample    BioSample rank_caps SPAROscore
#>              <factor>  <factor>     <factor> <integer>  <numeric>
#> SRR1039508  SRX384345 SRS508568 SAMN02422669     17909   0.523815
#> SRR1039509  SRX384346 SRS508567 SAMN02422675     17512   0.765439
#> SRR1039512  SRX384349 SRS508571 SAMN02422678     17955   0.549593
#> SRR1039513  SRX384350 SRS508572 SAMN02422670     16733   0.747358
#> SRR1039516  SRX384353 SRS508575 SAMN02422682     17841   0.533707
#> SRR1039517  SRX384354 SRS508576 SAMN02422673     18153   0.716221
#> SRR1039520  SRX384357 SRS508579 SAMN02422683     17807   0.522240
#> SRR1039521  SRX384358 SRS508580 SAMN02422677     17595   0.759357

# view the assays present in the object after-scoring
assays(airway_sce)
#> List of length 2
#> names(2): counts ranks


# the precomputed ranks can be reused for subsequent scoring runs
airway_sce <- sparoscore(data=airway_sce,
                         data_has_ranks = TRUE,
                         assay = "ranks",
                         signatures = inflammation_genes,
                         prefix = "run2_")
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view the metadata of the object after-scoring
colData(airway_sce)
#> DataFrame with 8 rows and 13 columns
#>            SampleName     cell      dex    albut        Run avgLength
#>              <factor> <factor> <factor> <factor>   <factor> <integer>
#> SRR1039508 GSM1275862  N61311     untrt    untrt SRR1039508       126
#> SRR1039509 GSM1275863  N61311     trt      untrt SRR1039509       126
#> SRR1039512 GSM1275866  N052611    untrt    untrt SRR1039512       126
#> SRR1039513 GSM1275867  N052611    trt      untrt SRR1039513        87
#> SRR1039516 GSM1275870  N080611    untrt    untrt SRR1039516       120
#> SRR1039517 GSM1275871  N080611    trt      untrt SRR1039517       126
#> SRR1039520 GSM1275874  N061011    untrt    untrt SRR1039520       101
#> SRR1039521 GSM1275875  N061011    trt      untrt SRR1039521        98
#>            Experiment    Sample    BioSample rank_caps SPAROscore rank_caps
#>              <factor>  <factor>     <factor> <integer>  <numeric> <numeric>
#> SRR1039508  SRX384345 SRS508568 SAMN02422669     17909   0.523815     17909
#> SRR1039509  SRX384346 SRS508567 SAMN02422675     17512   0.765439     17512
#> SRR1039512  SRX384349 SRS508571 SAMN02422678     17955   0.549593     17955
#> SRR1039513  SRX384350 SRS508572 SAMN02422670     16733   0.747358     16733
#> SRR1039516  SRX384353 SRS508575 SAMN02422682     17841   0.533707     17841
#> SRR1039517  SRX384354 SRS508576 SAMN02422673     18153   0.716221     18153
#> SRR1039520  SRX384357 SRS508579 SAMN02422683     17807   0.522240     17807
#> SRR1039521  SRX384358 SRS508580 SAMN02422677     17595   0.759357     17595
#>            run2_SPAROscore
#>                  <numeric>
#> SRR1039508        0.389066
#> SRR1039509        0.376962
#> SRR1039512        0.387971
#> SRR1039513        0.364504
#> SRR1039516        0.388130
#> SRR1039517        0.400542
#> SRR1039520        0.387323
#> SRR1039521        0.383630

Seurat objects

For Seurat objects, after scoring, SPAROscore returns a Seurat object with the scores and the rank caps appended to the metadata. The ranks are stored in a layer named ranks in the same assay as the counts.

# convert airway to a seurat object 
airway_seurat <- CreateSeuratObject(
  counts = assay(airway),
  meta.data = as.data.frame(colData(airway)),
  project = "Airway_Seurat"
)
#> Warning: Data is of class matrix. Coercing to dgCMatrix.

# view the metadata of the object pre-scoring
airway_seurat[[]]
#>               orig.ident nCount_RNA nFeature_RNA SampleName    cell   dex albut
#> SRR1039508 Airway_Seurat   20637971        24633 GSM1275862  N61311 untrt untrt
#> SRR1039509 Airway_Seurat   18809481        24527 GSM1275863  N61311   trt untrt
#> SRR1039512 Airway_Seurat   25348649        25699 GSM1275866 N052611 untrt untrt
#> SRR1039513 Airway_Seurat   15163415        23124 GSM1275867 N052611   trt untrt
#> SRR1039516 Airway_Seurat   24448408        25508 GSM1275870 N080611 untrt untrt
#> SRR1039517 Airway_Seurat   30818215        25998 GSM1275871 N080611   trt untrt
#> SRR1039520 Airway_Seurat   19126151        24662 GSM1275874 N061011 untrt untrt
#> SRR1039521 Airway_Seurat   21164133        23991 GSM1275875 N061011   trt untrt
#>                   Run avgLength Experiment    Sample    BioSample
#> SRR1039508 SRR1039508       126  SRX384345 SRS508568 SAMN02422669
#> SRR1039509 SRR1039509       126  SRX384346 SRS508567 SAMN02422675
#> SRR1039512 SRR1039512       126  SRX384349 SRS508571 SAMN02422678
#> SRR1039513 SRR1039513        87  SRX384350 SRS508572 SAMN02422670
#> SRR1039516 SRR1039516       120  SRX384353 SRS508575 SAMN02422682
#> SRR1039517 SRR1039517       126  SRX384354 SRS508576 SAMN02422673
#> SRR1039520 SRR1039520       101  SRX384357 SRS508579 SAMN02422683
#> SRR1039521 SRR1039521        98  SRX384358 SRS508580 SAMN02422677

# view all the layers in the object pre-scoring
Layers(airway_seurat[["RNA"]])
#> [1] "counts"

# compute scores for a Seurat object
airway_seurat <- sparoscore(data = airway_seurat,
                    assay = "RNA",
                    layer = "counts",
                    signatures = response_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object


# view the metadata of the object after-scoring
airway_seurat[[]]
#>               orig.ident nCount_RNA nFeature_RNA SampleName    cell   dex albut
#> SRR1039508 Airway_Seurat   20637971        24633 GSM1275862  N61311 untrt untrt
#> SRR1039509 Airway_Seurat   18809481        24527 GSM1275863  N61311   trt untrt
#> SRR1039512 Airway_Seurat   25348649        25699 GSM1275866 N052611 untrt untrt
#> SRR1039513 Airway_Seurat   15163415        23124 GSM1275867 N052611   trt untrt
#> SRR1039516 Airway_Seurat   24448408        25508 GSM1275870 N080611 untrt untrt
#> SRR1039517 Airway_Seurat   30818215        25998 GSM1275871 N080611   trt untrt
#> SRR1039520 Airway_Seurat   19126151        24662 GSM1275874 N061011 untrt untrt
#> SRR1039521 Airway_Seurat   21164133        23991 GSM1275875 N061011   trt untrt
#>                   Run avgLength Experiment    Sample    BioSample rank_caps
#> SRR1039508 SRR1039508       126  SRX384345 SRS508568 SAMN02422669     17909
#> SRR1039509 SRR1039509       126  SRX384346 SRS508567 SAMN02422675     17512
#> SRR1039512 SRR1039512       126  SRX384349 SRS508571 SAMN02422678     17955
#> SRR1039513 SRR1039513        87  SRX384350 SRS508572 SAMN02422670     16733
#> SRR1039516 SRR1039516       120  SRX384353 SRS508575 SAMN02422682     17841
#> SRR1039517 SRR1039517       126  SRX384354 SRS508576 SAMN02422673     18153
#> SRR1039520 SRR1039520       101  SRX384357 SRS508579 SAMN02422683     17807
#> SRR1039521 SRR1039521        98  SRX384358 SRS508580 SAMN02422677     17595
#>            SPAROscore
#> SRR1039508  0.5238153
#> SRR1039509  0.7654385
#> SRR1039512  0.5495932
#> SRR1039513  0.7473585
#> SRR1039516  0.5337068
#> SRR1039517  0.7162212
#> SRR1039520  0.5222398
#> SRR1039521  0.7593574

# view all the layers in the object after-scoring
Layers(airway_seurat[["RNA"]])
#> [1] "counts" "ranks"

# the precomputed ranks can be reused for subsequent scoring runs
airway_seurat <- sparoscore(data = airway_seurat,
                            data_has_ranks = TRUE,
                            assay = "RNA",
                            layer = "ranks",
                            signatures = inflammation_genes,
                            prefix = "run2_")
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163

# view the metadata of the object after-scoring
airway_seurat[[]]
#>               orig.ident nCount_RNA nFeature_RNA SampleName    cell   dex albut
#> SRR1039508 Airway_Seurat   20637971        24633 GSM1275862  N61311 untrt untrt
#> SRR1039509 Airway_Seurat   18809481        24527 GSM1275863  N61311   trt untrt
#> SRR1039512 Airway_Seurat   25348649        25699 GSM1275866 N052611 untrt untrt
#> SRR1039513 Airway_Seurat   15163415        23124 GSM1275867 N052611   trt untrt
#> SRR1039516 Airway_Seurat   24448408        25508 GSM1275870 N080611 untrt untrt
#> SRR1039517 Airway_Seurat   30818215        25998 GSM1275871 N080611   trt untrt
#> SRR1039520 Airway_Seurat   19126151        24662 GSM1275874 N061011 untrt untrt
#> SRR1039521 Airway_Seurat   21164133        23991 GSM1275875 N061011   trt untrt
#>                   Run avgLength Experiment    Sample    BioSample rank_caps
#> SRR1039508 SRR1039508       126  SRX384345 SRS508568 SAMN02422669     17909
#> SRR1039509 SRR1039509       126  SRX384346 SRS508567 SAMN02422675     17512
#> SRR1039512 SRR1039512       126  SRX384349 SRS508571 SAMN02422678     17955
#> SRR1039513 SRR1039513        87  SRX384350 SRS508572 SAMN02422670     16733
#> SRR1039516 SRR1039516       120  SRX384353 SRS508575 SAMN02422682     17841
#> SRR1039517 SRR1039517       126  SRX384354 SRS508576 SAMN02422673     18153
#> SRR1039520 SRR1039520       101  SRX384357 SRS508579 SAMN02422683     17807
#> SRR1039521 SRR1039521        98  SRX384358 SRS508580 SAMN02422677     17595
#>            SPAROscore run2_SPAROscore
#> SRR1039508  0.5238153       0.3890656
#> SRR1039509  0.7654385       0.3769621
#> SRR1039512  0.5495932       0.3879705
#> SRR1039513  0.7473585       0.3645041
#> SRR1039516  0.5337068       0.3881300
#> SRR1039517  0.7162212       0.4005423
#> SRR1039520  0.5222398       0.3873233
#> SRR1039521  0.7593574       0.3836297

This vignette demonstrated the range of expression data containers and gene signature representations accepted by SPAROscore. Matrix-like inputs return score tables, while container objects such as SummarizedExperiment and Seurat are returned with scores and precomputed ranks integrated into the original object. This design allows SPAROscore to fit naturally into existing bulk RNA-seq, ingle-cell RNA-seq, and spatial transcriptomics workflows with minimal data conversion.

For examples of in-depth transcriptomics analyses using SPAROscore, refer here: Transcriptomics technologies

For examples of additional options and advanced usage, see: Advanced options

sessionInfo()
#> R version 4.6.1 (2026-06-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 26.04 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.32.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=en_US.UTF-8    
#>  [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] scater_1.41.2               ggplot2_4.0.3              
#>  [3] scuttle_1.23.1              SingleCellExperiment_1.35.2
#>  [5] Seurat_5.5.1                SeuratObject_5.4.0         
#>  [7] sp_2.2-3                    GSEABase_1.75.0            
#>  [9] graph_1.91.0                annotate_1.91.0            
#> [11] XML_3.99-0.23               AnnotationDbi_1.75.2       
#> [13] DelayedArray_0.39.3         SparseArray_1.13.2         
#> [15] S4Arrays_1.13.0             abind_1.4-8                
#> [17] Matrix_1.7-5                dplyr_1.2.1                
#> [19] msigdbr_26.1.0              airway_1.33.2              
#> [21] SummarizedExperiment_1.43.0 Biobase_2.73.1             
#> [23] GenomicRanges_1.65.1        Seqinfo_1.3.0              
#> [25] IRanges_2.47.2              S4Vectors_0.51.5           
#> [27] BiocGenerics_0.59.10        generics_0.1.4             
#> [29] MatrixGenerics_1.25.0       matrixStats_1.5.0          
#> [31] SPAROscore_0.99.3           rmarkdown_2.31             
#> 
#> loaded via a namespace (and not attached):
#>   [1] RcppAnnoy_0.0.23          splines_4.6.1            
#>   [3] later_1.4.8               tibble_3.3.1             
#>   [5] polyclip_1.10-7           fastDummies_1.7.6        
#>   [7] lifecycle_1.0.5           globals_0.19.1           
#>   [9] lattice_0.22-9            MASS_7.3-66              
#>  [11] magrittr_2.0.5            plotly_4.12.0            
#>  [13] sass_0.4.10               jquerylib_0.1.4          
#>  [15] yaml_2.3.12               httpuv_1.6.17            
#>  [17] otel_0.2.0                sctransform_0.4.3        
#>  [19] spam_2.11-4               spatstat.sparse_3.2-0    
#>  [21] reticulate_1.46.0         cowplot_1.2.0            
#>  [23] pbapply_1.7-4             DBI_1.3.0                
#>  [25] buildtools_1.0.0          RColorBrewer_1.1-3       
#>  [27] Rtsne_0.17                purrr_1.2.2              
#>  [29] ggrepel_0.9.8             irlba_2.3.7              
#>  [31] listenv_1.0.0             spatstat.utils_3.2-4     
#>  [33] maketools_1.3.2           goftest_1.2-3            
#>  [35] RSpectra_0.16-2           spatstat.random_3.5-0    
#>  [37] fitdistrplus_1.2-6        parallelly_1.48.0        
#>  [39] DelayedMatrixStats_1.35.0 codetools_0.2-20         
#>  [41] tidyselect_1.2.1          farver_2.1.2             
#>  [43] viridis_0.6.5             ScaledMatrix_1.21.0      
#>  [45] spatstat.explore_3.8-1    jsonlite_2.0.0           
#>  [47] BiocNeighbors_2.7.2       progressr_1.0.0          
#>  [49] ggridges_0.5.7            survival_3.8-9           
#>  [51] tools_4.6.1               ica_1.0-3                
#>  [53] Rcpp_1.1.2                glue_1.8.1               
#>  [55] gridExtra_2.3.1           BiocBaseUtils_1.15.1     
#>  [57] xfun_0.60                 withr_3.0.3              
#>  [59] fastmap_1.2.0             rsvd_1.0.5               
#>  [61] digest_0.6.39             R6_2.6.1                 
#>  [63] mime_0.13                 scattermore_1.2          
#>  [65] tensor_1.5.1              spatstat.data_3.1-9      
#>  [67] RSQLite_3.53.3            tidyr_1.3.2              
#>  [69] data.table_1.18.4         httr_1.4.8               
#>  [71] htmlwidgets_1.6.4         uwot_0.2.4               
#>  [73] pkgconfig_2.0.3           gtable_0.3.6             
#>  [75] blob_1.3.0                lmtest_0.9-40            
#>  [77] S7_0.2.2                  XVector_0.53.0           
#>  [79] sys_3.4.3                 htmltools_0.5.9          
#>  [81] dotCall64_1.2             scales_1.4.0             
#>  [83] png_0.1-9                 spatstat.univar_3.2-0    
#>  [85] knitr_1.51                reshape2_1.4.5           
#>  [87] nlme_3.1-170              curl_7.1.0               
#>  [89] cachem_1.1.0              zoo_1.8-15               
#>  [91] stringr_1.6.0             KernSmooth_2.23-26       
#>  [93] vipor_0.4.7               parallel_4.6.1           
#>  [95] miniUI_0.1.2              pillar_1.11.1            
#>  [97] grid_4.6.1                vctrs_0.7.3              
#>  [99] RANN_2.6.2                promises_1.5.0           
#> [101] BiocSingular_1.29.0       beachmat_2.29.0          
#> [103] xtable_1.8-8              cluster_2.1.8.2          
#> [105] beeswarm_0.4.0            evaluate_1.0.5           
#> [107] cli_3.6.6                 compiler_4.6.1           
#> [109] rlang_1.3.0               crayon_1.5.3             
#> [111] future.apply_1.20.2       ggbeeswarm_0.7.3         
#> [113] plyr_1.8.9                stringi_1.8.7            
#> [115] viridisLite_0.4.3         deldir_2.0-4             
#> [117] BiocParallel_1.47.0       assertthat_0.2.1         
#> [119] babelgene_22.9            Biostrings_2.81.5        
#> [121] lazyeval_0.2.3            spatstat.geom_3.8-1      
#> [123] RcppHNSW_0.7.0            patchwork_1.3.2          
#> [125] sparseMatrixStats_1.25.0  bit64_4.8.2              
#> [127] future_1.75.0             KEGGREST_1.53.5          
#> [129] shiny_1.14.0              ROCR_1.0-12              
#> [131] igraph_2.3.3              memoise_2.0.1            
#> [133] bslib_0.11.0              bit_4.6.0