Date: 2023-04-25

# ODER: Optimising the Definition of Expressed Regions

Emmanuel Olagbaju1*

1UCL

*e.olagbaju@ucl.ac.uk

#### 25 April 2023

#### Package

ODER 1.6.0

# 1 Basics

## 1.1 Install `ODER`

`R` is an open-source statistical environment which can be easily modified to enhance its functionality via packages. ODER is a `R` package available via the Bioconductor repository for packages. `R` can be installed on any operating system from CRAN after which you can install ODER by using the following commands in your `R` session:

    if (!requireNamespace("BiocManager", quietly = TRUE)) {
        install.packages("BiocManager")
    }

    BiocManager::install("eolagbaju/ODER")

    ## Check that you have a valid Bioconductor installation
    BiocManager::valid()

## 1.2 Required knowledge

The expected input of ODER is coverage in the form of BigWig files as well as, depending on the functionalility required by a specific user, junctions in form of a `RangedSummarizedExperiments`.

ODER is based on many other packages and in particular in those that have implemented the infrastructure needed for dealing with RNA-seq data. The GenomicRanges package is heavily used in ODER while other packages like SummarizedExperiment and derfinder. Previous experience with these packages will help in the comprehension and use of ODER.

If you are asking yourself the question “Where do I start using Bioconductor?” you might be interested in this blog post. If you find the structure of a SummarizedExperiment unclear, you might consider checking out this manual.

## 1.3 Asking for help

As package developers, we try to explain clearly how to use our packages and in which order to use the functions. But `R` and `Bioconductor` have a steep learning curve so it is critical to learn where to ask for help. The blog post quoted above mentions some but we would like to highlight the Bioconductor support site as the main resource for getting help: remember to use the `ODER` tag and check the older posts. Other alternatives are available such as creating GitHub issues and tweeting. However, please note that if you want to receive help you should adhere to the posting guidelines. It is particularly critical that you provide a small reproducible example and your session information so package developers can track down the source of the error.

## 1.4 Citing `ODER`

We hope that ODER will be useful for your research. Please use the following information to cite the package and the overall approach. Thank you!

    ## Citation info
    citation("ODER")
    #> To cite package 'ODER' in publications use:
    #>
    #>   eolagbaju (2023). _Optimising the Definition of Expressed Regions_.
    #>   doi:10.18129/B9.bioc.ODER <https://doi.org/10.18129/B9.bioc.ODER>,
    #>   https://github.com/eolagbaju/ODER/ODER - R package version 1.6.0,
    #>   <http://www.bioconductor.org/packages/ODER>.
    #>
    #>   eolagbaju (2023). "Optimising the Definition of Expressed Regions."
    #>   _bioRxiv_. doi:10.1101/TODO <https://doi.org/10.1101/TODO>,
    #>   <https://www.biorxiv.org/content/10.1101/TODO>.
    #>
    #> To see these entries in BibTeX format, use 'print(<citation>,
    #> bibtex=TRUE)', 'toBibtex(.)', or set
    #> 'options(citation.bibtex.max=999)'.

# 2 Background

`ODER` is a packaged form of the method developed in the Zhang et al. 2020 publication: Incomplete annotation has a disproportionate impact on our understanding of Mendelian and complex neurogenetic disorders. The overarching aim of `ODER` is use RNA-sequencing data to define regions of unannotated expression (ERs) in the genome, optimise their definition, then link them to known genes.

`ODER` builds upon the method defined in derfinder by improving the definition of ERs in a few ways. Firstly, rather than being a fixed value, the coverage cut off is optimised based on a set of user-inputted, gold-standard exons for a given set of samples. Secondly, `ODER` introduces a second optimisation parameter, the max region gap, which determines the number of base-pairs of gap between which ERs are merged. Thirdly, ERs can be connected to known genes through junction reads. This aids the interpretation of ERs and also allows their definition to be refined further using the intersection between ERs and junctions. For more detailed methods, please see the methods section of the original publication.

Unannotated ERs can provide evidence for the existence and location of novel exons, which are yet to be added within reference annotation. Improving the completeness of reference annotation can aid the interpretation of genetic variation. For example, the output of `ODER` can help to better interpret non-coding genetics variants that are found in the genome of Mendelian disease patients, poetentially leading to improvements in diagnosis rates.

# 3 Quick start to using to `ODER`

From the top-level ODER consists of 4 core functions, which are broken down internally into several smaller helper functions. These functions are expected to be run sequentially in the order presented below:

1. `ODER()` - Takes as input coverage in the form of BigWig files. Uses derfinder to call contigous blocks of expression that we term expressed regions or ERs. ER definitions are optimised across a pair of parameters the mean coverage cut-off (MCC) and the max region gap (MRG) with respect to a user-inputted set of gold standard exons. The set of ERs for the optimised MCC and MRG are returned.
2. `annotatER()` - Takes as input the optimised set of ERs and a set of junctions. Finds overlaps between the ERs and junctions, thereby annotating ERs with the gene associated with it’s corresponding junction. Also categorises ERs into “exon”, “intron”, “intergenic” or any combination of these three categories depending on the ERs overlap with existing annotation.
3. `refine_ers()` - Takes as input the optimised set of ERs annotated with junctions. Refines the ER definition based on the intersection between the ER and it’s overlapping junction.
4. `get_count_matrix()` - Takes as input any set of `GenomicRanges` and a set of `BigWig` files. Returns a `RangedSummarizedExperiment` with `assays` containing the average coverage across each range. This function is intended to obtain the coverage across ERs to allow usage in downstream analyses such as differential expression.

## 3.1 Example

This is a basic example to show how you can use ODER. First, we need to download the example `BigWig` data required as input for `ODER`.

    library("ODER")
    #> Warning: Package 'ODER' is deprecated and will be removed from Bioconductor
    #>   version 3.18
    library("magrittr")

    # Download recount data in the form of BigWigs
    gtex_metadata <- recount::all_metadata("gtex")
    #> Setting options('download.file.method.GEOquery'='auto')
    #> Setting options('GEOquery.inmemory.gpl'=FALSE)
    #> Warning: replacing previous import 'utils::findMatches' by
    #> 'S4Vectors::findMatches' when loading 'AnnotationDbi'
    #> 2023-04-25 17:58:04.324172 downloading the metadata to /tmp/Rtmpe700jE/metadata_clean_gtex.Rdata

    gtex_metadata <- gtex_metadata %>%
        as.data.frame() %>%
        dplyr::filter(project == "SRP012682")

    url <- recount::download_study(
        project = "SRP012682",
        type = "samples",
        download = FALSE
    )

    # file_cache is an internal ODER function to cache files for
    # faster repeated loading
    bw_path <- file_cache(url[1])

    bw_path
    #>                                                                                              BFC13
    #> "/home/biocbuild/.cache/R/BiocFileCache/3768704b46bc0b_SRR660824_SRS389722_SRX222703_male_lung.bw"

To get the optimum set of ERs from a BigWig file we can use the `ODER()` function.This will obtain the optimally defined ERs by finding the combination of MCC and MRG parameters that gives the lowest exon delta between the ERs and the inputted gold-standard exons. The MCC is minimum read depth that a base pair needs to have to be considered expressed. The MRG is the maximum number of base pairs between reads that fall below the MCC before you would not include it as part of the expressed region. Internally, gold-standard exons are obtained by finding the non-overlapping exons from the inputted reference annotation.

In this example, we demonstrate `ODER()` on a single unstranded `Bigwig`. However, in reality, it is likely that you will want to optimise the ER definitions across multiple `BigWigs`. It is worth noting that the arguments `bw_pos` and `bw_neg` in `ODER()` allow for the input of stranded `BigWigs`.

    # load reference annotation from Ensembl
    gtf_url <- paste0(
        "http://ftp.ensembl.org/pub/release-103/gtf/homo_sapiens",
        "/Homo_sapiens.GRCh38.103.chr.gtf.gz"
    )
    gtf_path <- file_cache(gtf_url)
    gtf_gr <- rtracklayer::import(gtf_path)
    # As of rtracklayer 1.25.16, BigWig is not supported on Windows.
    if (!xfun::is_windows()) {
        opt_ers <- ODER(
            bw_paths = bw_path, auc_raw = gtex_metadata[["auc"]][1],
            auc_target = 40e6 * 100, chrs = c("chr21"),
            genome = "hg38", mccs = c(2, 4, 6, 8, 10), mrgs = c(10, 20, 30),
            gtf = gtf_gr, ucsc_chr = TRUE, ignore.strand = TRUE,
            exons_no_overlap = NULL, bw_chr = "chr"
        )
    }
    #> Loading required package: BiocGenerics
    #>
    #> Attaching package: 'BiocGenerics'
    #> The following objects are masked from 'package:stats':
    #>
    #>     IQR, mad, sd, var, xtabs
    #> The following objects are masked from 'package:base':
    #>
    #>     Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
    #>     as.data.frame, basename, cbind, colnames, dirname, do.call,
    #>     duplicated, eval, evalq, get, grep, grepl, intersect, is.unsorted,
    #>     lapply, mapply, match, mget, order, paste, pmax, pmax.int, pmin,
    #>     pmin.int, rank, rbind, rownames, sapply, setdiff, sort, table,
    #>     tapply, union, unique, unsplit, which.max, which.min
    #> Loading required package: S4Vectors
    #> Loading required package: stats4
    #>
    #> Attaching package: 'S4Vectors'
    #> The following object is masked from 'package:utils':
    #>
    #>     findMatches
    #> The following objects are masked from 'package:base':
    #>
    #>     I, expand.grid, unname
    #> 2023-04-25 17:59:23.867569 - Obtaining mean coverage across 1 samples
    #> 2023-04-25 17:59:23.86846 - chr21
    #> 2023-04-25 17:59:24.296033 - Generating ERs for chr21
    #> 2023-04-25 17:59:28.278122 - Obtaining non-overlapping exons
    #> 2023-04-25 17:59:30.976073 - Calculating delta for ERs...
    #> 2023-04-25 17:59:32.945512 - Obtaining optimal set of ERs...

Once we have the obtained the optimised set of ERs, we may consider plotting the exon delta across the various MCCs and MRGs. This can be useful to check the error associated with the definition of the set of optimised ERs. This error is measured through two metrics; the median exon delta and the number of ERs with exon delta equal to 0. The median exon delta represents the overall accuracy of all ER definitions, whereas the number of ERs with exon delta equal to 0 indicates the extent to which ER definitions precisely match overlapping gold-standard exon boundaries.

    # visualise the spread of mccs and mrgs
    if (!xfun::is_windows()) { # uses product of ODER
        plot_ers(opt_ers[["deltas"]], opt_ers[["opt_mcc_mrg"]])
    }

Next, we will use `annotatERs()` to find the overlap between the ERs and junctions. Furthermore, `annotatERs()` will also classify ERs by their overlap with existing reference annotation into the categories; “exon”, “intron” and “intergenic”. This can be helpful for two reasons. Primarily, junctions can be used to inform which gene the ER is associated to. This gene-level association can be useful multiple downstream applications, such as novel exon discovery. Furthermore, the category of ER, in terms of whether it overlaps a exonic, intronic or intergenic region, can help determine whether the ER represents novel expression. For example, ERs solely overlapping intronic or intergenic regions and associated with a gene can be the indication of the expression of an unannotated exon.

To note, it is recommended that the inputted junctions are derived from the same samples or tissue as the `BigWig` files used to define ERs.

    library(utils)
    # running only chr21 to reduce runtime
    chrs_to_keep <- c("21")

    # prepare the txdb object to create a genomic state
    # based on https://support.bioconductor.org/p/93235/
    hg38_chrominfo <- GenomeInfoDb::getChromInfoFromUCSC("hg38")

    new_info <- hg38_chrominfo$size[match(
        chrs_to_keep,
        GenomeInfoDb::mapSeqlevels(hg38_chrominfo$chrom, "Ensembl")
    )]

    names(new_info) <- chrs_to_keep
    gtf_gr_tx <- GenomeInfoDb::keepSeqlevels(gtf_gr,
        chrs_to_keep,
        pruning.mode = "tidy"
    )

    GenomeInfoDb::seqlengths(gtf_gr_tx) <- new_info
    GenomeInfoDb::seqlevelsStyle(gtf_gr_tx) <- "UCSC"
    GenomeInfoDb::genome(gtf_gr_tx) <- "hg38"

    ucsc_txdb <- GenomicFeatures::makeTxDbFromGRanges(gtf_gr_tx)
    #> Warning in .get_cds_IDX(mcols0$type, mcols0$phase): The "phase" metadata column contains non-NA values for features of type
    #>   stop_codon. This information was ignored.
    genom_state <- derfinder::makeGenomicState(txdb = ucsc_txdb)
    #> extendedMapSeqlevels: sequence names mapped from NCBI to UCSC for species homo_sapiens
    #> 'select()' returned 1:1 mapping between keys and columns

    # convert UCSC chrs format to Ensembl to match the ERs
    ens_txdb <- ucsc_txdb
    GenomeInfoDb::seqlevelsStyle(ens_txdb) <- "Ensembl"

    # lung_junc_21_22 is an example data set of junctions
    # obtained from recount3, derived from the lung tissue
    # run annotatERs()
    data(lung_junc_21_22, package = "ODER")
    if (!xfun::is_windows()) { # uses product of ODER
        annot_ers <- annotatERs(
            opt_ers = head(opt_ers[["opt_ers"]], 100),
            junc_data = lung_junc_21_22,
            genom_state = genom_state,
            gtf = gtf_gr,
            txdb = ens_txdb
        )

        # print first 5 ERs
        annot_ers[1:5]
    }
    #> [1] "2023-04-25 17:59:52.757799 - Obtaining co-ordinates of annotated exons and junctions..."
    #> [1] "2023-04-25 17:59:53.160991 - Getting junction annotation using overlapping exons..."
    #> [1] "2023-04-25 17:59:53.754102 - Tidying junction annotation..."
    #> [1] "2023-04-25 17:59:53.901944 - Deriving junction categories..."
    #> [1] "2023-04-25 17:59:54.354624 - done!"
    #> 2023-04-25 17:59:54.395866 - Finding junctions overlapping ers...
    #> 2023-04-25 17:59:55.427989 - Annotating the Expressed regions...
    #> 2023-04-25 17:59:55.524111 annotateRegions: counting
    #> 2023-04-25 17:59:55.607725 annotateRegions: annotating
    #> 2023-04-25 17:59:57.949711 - done!
    #> GRanges object with 5 ranges and 5 metadata columns:
    #>       seqnames          ranges strand |           grl           genes
    #>          <Rle>       <IRanges>  <Rle> | <GRangesList> <CharacterList>
    #>   [1]    chr21 5032176-5032217      * |               ENSG00000277117
    #>   [2]    chr21 5033408-5033425      * |               ENSG00000277117
    #>   [3]    chr21 5034717-5034756      * |               ENSG00000277117
    #>   [4]    chr21 5035188-5035189      * |               ENSG00000277117
    #>   [5]    chr21 5036577-5036581      * |               ENSG00000277117
    #>        annotation  og_index       gene_source
    #>       <character> <integer>       <character>
    #>   [1]        exon         1 nearest gtf genes
    #>   [2]        exon         2 nearest gtf genes
    #>   [3]        exon         3 nearest gtf genes
    #>   [4]        exon         4 nearest gtf genes
    #>   [5]        exon         5 nearest gtf genes
    #>   -------
    #>   seqinfo: 1 sequence from an unspecified genome; no seqlengths

After we have annotated ERs with the overlapping junctions, optionally we can use `refine_ers()` to refine the starts and ends of the ERs based on the overlapping junctions. This will filter ERs for those which have either a single or two non-intersecting junctions overlapping. For the remaining ERs, `refine_ers()` will shave the ER definitions to the exon boundaries matching the overlapping junctions. This can be useful for downstream applications whereby the accuracy of the ER definition is extremely important. For example, the interpretion of variants in diagnostic setting.

    if (!xfun::is_windows()) { # uses product of ODER
        refined_ers <- refine_ERs(annot_ers)

        refined_ers
    }
    #> 2023-04-25 17:59:58.321717 - Refining the Expressed regions...
    #> GRanges object with 2 ranges and 5 metadata columns:
    #>       seqnames          ranges strand |                     grl           genes
    #>          <Rle>       <IRanges>  <Rle> |           <GRangesList> <CharacterList>
    #>   [1]    chr21 5093713-5093743      * | chr21:5093712-5093744:+ ENSG00000280071
    #>   [2]    chr21 5162182-5162248      * | chr21:5162249-5162287:+ ENSG00000280433
    #>        annotation  og_index       gene_source
    #>       <character> <integer>       <character>
    #>   [1]      intron        15 nearest gtf genes
    #>   [2]      intron        71 nearest gtf genes
    #>   -------
    #>   seqinfo: 1 sequence from an unspecified genome; no seqlengths

Finally, we can generate an ER count matrix with `get_count_matrix()`. This function can flexibly be run at any stage of the `ODER` pipeline and it requires a set of `GenomicRanges` and `BigWig` paths as input. `get_count_matrix()` will return a `RangedSummarizedExperiment` which has `assays` filled with the mean coverage across each inputted range. Internally, `get_count_matrix()` relies on megadepth to obtain coverage from `BigWigs` therefore `megadepth::install_megadepth()` must be executed at least once on the user’s system before `get_count_matrix()`.

    # create sample metadata containing identifiers for each BigWig
    run <- gtex_metadata[["run"]][[1]]
    col_info <- as.data.frame(run)

    # install megadepth
    megadepth::install_megadepth()
    #> The latest megadepth version is 1.2.0
    #> This is not an interactive session, therefore megadepth has been installed temporarily to
    #> /tmp/Rtmpe700jE/megadepth
    if (!xfun::is_windows()) { # uses product of ODER
        er_count_matrix <- get_count_matrix(
            bw_paths = bw_path, annot_ers = annot_ers,
            cols = col_info
        )

        er_count_matrix
    }
    #> Warning in is.na(.x): is.na() applied to non-(list or vector) of type 'S4'
    #> class: RangedSummarizedExperiment
    #> dim: 100 1
    #> metadata(0):
    #> assays(1): ''
    #> rownames: NULL
    #> rowData names(5): grl genes annotation og_index gene_source
    #> colnames: NULL
    #> colData names(1): run

# 4 Reproducibility

The ODER package (eolagbaju, 2023) was made possible thanks to:

- R (R Core Team, 2023)
- BiocStyle (Oleś, 2023)
- RefManageR (McLean, 2017)
- knitr (Xie, 2023)
- rmarkdown (Allaire, Xie, Dervieux, McPherson, Luraschi, Ushey, Atkins, Wickham, Cheng, Chang, and Iannone, 2023)
- sessioninfo (Wickham, Chang, Flight, Müller, and Hester, 2021)
- testthat (Wickham, 2011)

This package was developed using biocthis.

Date the vignette was generated.

    #> [1] "2023-04-25 18:00:20 EDT"

Wallclock time spent generating the vignette.

    #> Time difference of 2.605 mins

`R` session information.

    #> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
    #>  setting  value
    #>  version  R version 4.3.0 RC (2023-04-13 r84269)
    #>  os       Ubuntu 22.04.2 LTS
    #>  system   x86_64, linux-gnu
    #>  ui       X11
    #>  language (EN)
    #>  collate  C
    #>  ctype    en_US.UTF-8
    #>  tz       America/New_York
    #>  date     2023-04-25
    #>  pandoc   2.7.3 @ /usr/bin/ (via rmarkdown)
    #>
    #> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
    #>  package              * version   date (UTC) lib source
    #>  abind                  1.4-5     2016-07-21 [2] CRAN (R 4.3.0)
    #>  AnnotationDbi          1.62.0    2023-04-25 [2] Bioconductor
    #>  archive                1.1.5     2022-05-06 [2] CRAN (R 4.3.0)
    #>  backports              1.4.1     2021-12-13 [2] CRAN (R 4.3.0)
    #>  base64enc              0.1-3     2015-07-28 [2] CRAN (R 4.3.0)
    #>  basilisk               1.12.0    2023-04-25 [2] Bioconductor
    #>  basilisk.utils         1.12.0    2023-04-25 [2] Bioconductor
    #>  bibtex                 0.5.1     2023-01-26 [2] CRAN (R 4.3.0)
    #>  Biobase                2.60.0    2023-04-25 [2] Bioconductor
    #>  BiocFileCache          2.8.0     2023-04-25 [2] Bioconductor
    #>  BiocGenerics         * 0.46.0    2023-04-25 [2] Bioconductor
    #>  BiocIO                 1.10.0    2023-04-25 [2] Bioconductor
    #>  BiocManager            1.30.20   2023-02-24 [2] CRAN (R 4.3.0)
    #>  BiocParallel           1.34.0    2023-04-25 [2] Bioconductor
    #>  BiocStyle            * 2.28.0    2023-04-25 [2] Bioconductor
    #>  biomaRt                2.56.0    2023-04-25 [2] Bioconductor
    #>  Biostrings             2.68.0    2023-04-25 [2] Bioconductor
    #>  bit                    4.0.5     2022-11-15 [2] CRAN (R 4.3.0)
    #>  bit64                  4.0.5     2020-08-30 [2] CRAN (R 4.3.0)
    #>  bitops                 1.0-7     2021-04-24 [2] CRAN (R 4.3.0)
    #>  blob                   1.2.4     2023-03-17 [2] CRAN (R 4.3.0)
    #>  bookdown               0.33      2023-03-06 [2] CRAN (R 4.3.0)
    #>  brio                   1.1.3     2021-11-30 [2] CRAN (R 4.3.0)
    #>  broom                  1.0.4     2023-03-11 [2] CRAN (R 4.3.0)
    #>  BSgenome               1.68.0    2023-04-25 [2] Bioconductor
    #>  bslib                  0.4.2     2022-12-16 [2] CRAN (R 4.3.0)
    #>  bumphunter             1.42.0    2023-04-25 [2] Bioconductor
    #>  cachem                 1.0.7     2023-02-24 [2] CRAN (R 4.3.0)
    #>  car                    3.1-2     2023-03-30 [2] CRAN (R 4.3.0)
    #>  carData                3.0-5     2022-01-06 [2] CRAN (R 4.3.0)
    #>  checkmate              2.1.0     2022-04-21 [2] CRAN (R 4.3.0)
    #>  cli                    3.6.1     2023-03-23 [2] CRAN (R 4.3.0)
    #>  cluster                2.1.4     2022-08-22 [3] CRAN (R 4.3.0)
    #>  cmdfun                 1.0.2     2020-10-10 [2] CRAN (R 4.3.0)
    #>  codetools              0.2-19    2023-02-01 [3] CRAN (R 4.3.0)
    #>  colorspace             2.1-0     2023-01-23 [2] CRAN (R 4.3.0)
    #>  cowplot                1.1.1     2020-12-30 [2] CRAN (R 4.3.0)
    #>  crayon                 1.5.2     2022-09-29 [2] CRAN (R 4.3.0)
    #>  curl                   5.0.0     2023-01-12 [2] CRAN (R 4.3.0)
    #>  dasper                 1.10.0    2023-04-25 [2] Bioconductor
    #>  data.table             1.14.8    2023-02-17 [2] CRAN (R 4.3.0)
    #>  DBI                    1.1.3     2022-06-18 [2] CRAN (R 4.3.0)
    #>  dbplyr                 2.3.2     2023-03-21 [2] CRAN (R 4.3.0)
    #>  DelayedArray           0.26.0    2023-04-25 [2] Bioconductor
    #>  derfinder              1.34.0    2023-04-25 [2] Bioconductor
    #>  derfinderHelper        1.34.0    2023-04-25 [2] Bioconductor
    #>  desc                   1.4.2     2022-09-08 [2] CRAN (R 4.3.0)
    #>  digest                 0.6.31    2022-12-11 [2] CRAN (R 4.3.0)
    #>  dir.expiry             1.8.0     2023-04-25 [2] Bioconductor
    #>  doRNG                  1.8.6     2023-01-16 [2] CRAN (R 4.3.0)
    #>  downloader             0.4       2015-07-09 [2] CRAN (R 4.3.0)
    #>  dplyr                  1.1.2     2023-04-20 [2] CRAN (R 4.3.0)
    #>  evaluate               0.20      2023-01-17 [2] CRAN (R 4.3.0)
    #>  fansi                  1.0.4     2023-01-22 [2] CRAN (R 4.3.0)
    #>  farver                 2.1.1     2022-07-06 [2] CRAN (R 4.3.0)
    #>  fastmap                1.1.1     2023-02-24 [2] CRAN (R 4.3.0)
    #>  filelock               1.0.2     2018-10-05 [2] CRAN (R 4.3.0)
    #>  foreach                1.5.2     2022-02-02 [2] CRAN (R 4.3.0)
    #>  foreign                0.8-84    2022-12-06 [3] CRAN (R 4.3.0)
    #>  Formula                1.2-5     2023-02-24 [2] CRAN (R 4.3.0)
    #>  fs                     1.6.2     2023-04-25 [2] CRAN (R 4.3.0)
    #>  generics               0.1.3     2022-07-05 [2] CRAN (R 4.3.0)
    #>  GenomeInfoDb         * 1.36.0    2023-04-25 [2] Bioconductor
    #>  GenomeInfoDbData       1.2.10    2023-04-17 [2] Bioconductor
    #>  GenomicAlignments      1.36.0    2023-04-25 [2] Bioconductor
    #>  GenomicFeatures        1.52.0    2023-04-25 [2] Bioconductor
    #>  GenomicFiles           1.36.0    2023-04-25 [2] Bioconductor
    #>  GenomicRanges          1.52.0    2023-04-25 [2] Bioconductor
    #>  GEOquery               2.68.0    2023-04-25 [2] Bioconductor
    #>  ggplot2                3.4.2     2023-04-03 [2] CRAN (R 4.3.0)
    #>  ggpubr                 0.6.0     2023-02-10 [2] CRAN (R 4.3.0)
    #>  ggrepel                0.9.3     2023-02-03 [2] CRAN (R 4.3.0)
    #>  ggsignif               0.6.4     2022-10-13 [2] CRAN (R 4.3.0)
    #>  glue                   1.6.2     2022-02-24 [2] CRAN (R 4.3.0)
    #>  gridExtra              2.3       2017-09-09 [2] CRAN (R 4.3.0)
    #>  gtable                 0.3.3     2023-03-21 [2] CRAN (R 4.3.0)
    #>  highr                  0.10      2022-12-22 [2] CRAN (R 4.3.0)
    #>  Hmisc                  5.0-1     2023-03-08 [2] CRAN (R 4.3.0)
    #>  hms                    1.1.3     2023-03-21 [2] CRAN (R 4.3.0)
    #>  htmlTable              2.4.1     2022-07-07 [2] CRAN (R 4.3.0)
    #>  htmltools              0.5.5     2023-03-23 [2] CRAN (R 4.3.0)
    #>  htmlwidgets            1.6.2     2023-03-17 [2] CRAN (R 4.3.0)
    #>  httr                   1.4.5     2023-02-24 [2] CRAN (R 4.3.0)
    #>  IRanges              * 2.34.0    2023-04-25 [2] Bioconductor
    #>  iterators              1.0.14    2022-02-05 [2] CRAN (R 4.3.0)
    #>  jquerylib              0.1.4     2021-04-26 [2] CRAN (R 4.3.0)
    #>  jsonlite               1.8.4     2022-12-06 [2] CRAN (R 4.3.0)
    #>  KEGGREST               1.40.0    2023-04-25 [2] Bioconductor
    #>  knitr                  1.42      2023-01-25 [2] CRAN (R 4.3.0)
    #>  labeling               0.4.2     2020-10-20 [2] CRAN (R 4.3.0)
    #>  lattice                0.21-8    2023-04-05 [3] CRAN (R 4.3.0)
    #>  lifecycle              1.0.3     2022-10-07 [2] CRAN (R 4.3.0)
    #>  limma                  3.56.0    2023-04-25 [2] Bioconductor
    #>  locfit                 1.5-9.7   2023-01-02 [2] CRAN (R 4.3.0)
    #>  lubridate              1.9.2     2023-02-10 [2] CRAN (R 4.3.0)
    #>  magrittr             * 2.0.3     2022-03-30 [2] CRAN (R 4.3.0)
    #>  Matrix                 1.5-4     2023-04-04 [3] CRAN (R 4.3.0)
    #>  MatrixGenerics         1.12.0    2023-04-25 [2] Bioconductor
    #>  matrixStats            0.63.0    2022-11-18 [2] CRAN (R 4.3.0)
    #>  megadepth              1.10.0    2023-04-25 [2] Bioconductor
    #>  memoise                2.0.1     2021-11-26 [2] CRAN (R 4.3.0)
    #>  munsell                0.5.0     2018-06-12 [2] CRAN (R 4.3.0)
    #>  nnet                   7.3-18    2022-09-28 [3] CRAN (R 4.3.0)
    #>  ODER                 * 1.6.0     2023-04-25 [1] Bioconductor
    #>  pillar                 1.9.0     2023-03-22 [2] CRAN (R 4.3.0)
    #>  pkgconfig              2.0.3     2019-09-22 [2] CRAN (R 4.3.0)
    #>  pkgload                1.3.2     2022-11-16 [2] CRAN (R 4.3.0)
    #>  plyr                   1.8.8     2022-11-11 [2] CRAN (R 4.3.0)
    #>  png                    0.1-8     2022-11-29 [2] CRAN (R 4.3.0)
    #>  prettyunits            1.1.1     2020-01-24 [2] CRAN (R 4.3.0)
    #>  progress               1.2.2     2019-05-16 [2] CRAN (R 4.3.0)
    #>  purrr                  1.0.1     2023-01-10 [2] CRAN (R 4.3.0)
    #>  qvalue                 2.32.0    2023-04-25 [2] Bioconductor
    #>  R6                     2.5.1     2021-08-19 [2] CRAN (R 4.3.0)
    #>  rappdirs               0.3.3     2021-01-31 [2] CRAN (R 4.3.0)
    #>  RColorBrewer           1.1-3     2022-04-03 [2] CRAN (R 4.3.0)
    #>  Rcpp                   1.0.10    2023-01-22 [2] CRAN (R 4.3.0)
    #>  RCurl                  1.98-1.12 2023-03-27 [2] CRAN (R 4.3.0)
    #>  readr                  2.1.4     2023-02-10 [2] CRAN (R 4.3.0)
    #>  recount                1.26.0    2023-04-25 [2] Bioconductor
    #>  RefManageR           * 1.4.0     2022-09-30 [2] CRAN (R 4.3.0)
    #>  rentrez                1.2.3     2020-11-10 [2] CRAN (R 4.3.0)
    #>  reshape2               1.4.4     2020-04-09 [2] CRAN (R 4.3.0)
    #>  restfulr               0.0.15    2022-06-16 [2] CRAN (R 4.3.0)
    #>  reticulate             1.28      2023-01-27 [2] CRAN (R 4.3.0)
    #>  rjson                  0.2.21    2022-01-09 [2] CRAN (R 4.3.0)
    #>  rlang                  1.1.0     2023-03-14 [2] CRAN (R 4.3.0)
    #>  rmarkdown              2.21      2023-03-26 [2] CRAN (R 4.3.0)
    #>  rngtools               1.5.2     2021-09-20 [2] CRAN (R 4.3.0)
    #>  rpart                  4.1.19    2022-10-21 [3] CRAN (R 4.3.0)
    #>  rprojroot              2.0.3     2022-04-02 [2] CRAN (R 4.3.0)
    #>  Rsamtools              2.16.0    2023-04-25 [2] Bioconductor
    #>  RSQLite                2.3.1     2023-04-03 [2] CRAN (R 4.3.0)
    #>  rstatix                0.7.2     2023-02-01 [2] CRAN (R 4.3.0)
    #>  rstudioapi             0.14      2022-08-22 [2] CRAN (R 4.3.0)
    #>  rtracklayer            1.60.0    2023-04-25 [2] Bioconductor
    #>  S4Vectors            * 0.38.0    2023-04-25 [2] Bioconductor
    #>  sass                   0.4.5     2023-01-24 [2] CRAN (R 4.3.0)
    #>  scales                 1.2.1     2022-08-20 [2] CRAN (R 4.3.0)
    #>  sessioninfo          * 1.2.2     2021-12-06 [2] CRAN (R 4.3.0)
    #>  stringi                1.7.12    2023-01-11 [2] CRAN (R 4.3.0)
    #>  stringr                1.5.0     2022-12-02 [2] CRAN (R 4.3.0)
    #>  SummarizedExperiment   1.30.0    2023-04-25 [2] Bioconductor
    #>  testthat               3.1.7     2023-03-12 [2] CRAN (R 4.3.0)
    #>  tibble                 3.2.1     2023-03-20 [2] CRAN (R 4.3.0)
    #>  tidyr                  1.3.0     2023-01-24 [2] CRAN (R 4.3.0)
    #>  tidyselect             1.2.0     2022-10-10 [2] CRAN (R 4.3.0)
    #>  timechange             0.2.0     2023-01-11 [2] CRAN (R 4.3.0)
    #>  tzdb                   0.3.0     2022-03-28 [2] CRAN (R 4.3.0)
    #>  utf8                   1.2.3     2023-01-31 [2] CRAN (R 4.3.0)
    #>  VariantAnnotation      1.46.0    2023-04-25 [2] Bioconductor
    #>  vctrs                  0.6.2     2023-04-19 [2] CRAN (R 4.3.0)
    #>  vroom                  1.6.1     2023-01-22 [2] CRAN (R 4.3.0)
    #>  waldo                  0.4.0     2022-03-16 [2] CRAN (R 4.3.0)
    #>  withr                  2.5.0     2022-03-03 [2] CRAN (R 4.3.0)
    #>  xfun                   0.39      2023-04-20 [2] CRAN (R 4.3.0)
    #>  XML                    3.99-0.14 2023-03-19 [2] CRAN (R 4.3.0)
    #>  xml2                   1.3.3     2021-11-30 [2] CRAN (R 4.3.0)
    #>  XVector                0.40.0    2023-04-25 [2] Bioconductor
    #>  yaml                   2.3.7     2023-01-23 [2] CRAN (R 4.3.0)
    #>  zlibbioc               1.46.0    2023-04-25 [2] Bioconductor
    #>
    #>  [1] /tmp/Rtmp9JmeMF/Rinst19c5f3703d2a59
    #>  [2] /home/biocbuild/bbs-3.17-bioc/R/site-library
    #>  [3] /home/biocbuild/bbs-3.17-bioc/R/library
    #>
    #> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────