# gINTomics vignette

Angelo Velle1*, Francesco Patanè1** and Chiara Romualdi1***

1Biology Department, University of Padova, Italy

*angelo.velle@unipd.it
**francesco.patane@unipd.it
***chiara.romualdi@unipd.it

#### 29 October 2024

#### Abstract

gINTomics is an R package for Multi-Omics data integration and visualization. gINTomics is designed to detect the association between the expression of a target and of its regulators, taking into account also their genomics modifications such as Copy Number Variations (CNV) and methylation. For RNA sequencing data, the counts will be fitted using a negative binomial model, while in the case of microarray or other types of data, a linear model will be applied. In some cases the number of regulators for a given target could be very high, in order to handle this eventuality, we provide a random forest selection that will automatically keep only the most important regulators. All the models are gene-specific, so each gene/miRNA will have its own model with its covariates. The package will automatically download information about TF-target couples (OmnipathR), miRNA-target couples (OmnipathR) and TF-miRNA couples (TransmiR). The couples will be used to define the covariates used in the integration models.

# 1 Introduction

The rapid advancement of new technologies for omics data acquisition has resulted in the production of massive amounts of data that combine different omics types, such as gene expression, methylation and copy number variation data. These technologies enable the generation of large-scale, high-resolution and multidimensional data that can reveal the molecular mechanisms and interactions underlying biological phenomena. For instance, The Cancer Genome Atlas (TCGA), a landmark cancer genomics program, molecularly characterized over 20,000 primary cancers and matched normal samples spanning 33 cancer types. These data offer a rich source of information, but they are still underutilized because the new techniques and statistical models for data analysis have not kept up with the pace of data acquisition technologies. Indeed, most of the conventional approaches for omics data modeling depend on the comparison of only one data type across different groups of samples. Moreover, the analysis and integration of omics data pose significant challenges in terms of data interpretation. Therefore, new technologies for omics data acquisition require the development of novel methods and models for data processing and mining that can cope with the volume, variety and complexity of omics data.

In this work, we present gINTomics, our new Multi Omics integration R package, approaching Multi-Omics integration from a new perspective, with the goal to assess the impact of different omics on the final outcome of regulatory networks, that is gene expression. Therefore, for each gene/miRNA, we try to determine the association between its expression and that of its regulators, taking into account also genomic modifications such as copy number variations (CNV) and methylation.

# 2 Installation

To install this package:

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

    #devtools::install_github("angelovelle96/gINTomics")

# 3 How to use gINTomics

## 3.1 Structure of the package

gINTomics is designed to perform both two-Omics and Multi Omics integrations. There are four different functions for the two-omics integration. The `run_cnv_integration` function can be used to integrate Gene or miRNA Expression data with Copy Number Variation data. The `run_met_integration` is designed for the integration between Gene Expression data with methylation data. When both gene CNV and methylation data are available, the `run_genomic_integration` function can be used to integrate them together with gene expression. Finally, the `run_tf_integration` function can be used for the integration between the Expression of a target gene or miRNA and every kind of regulator, such as Transcription Factors or miRNAs expression. The package also gives the possibility to perform Multi Omics integration. The `run_multiomics` function takes as input a MultiAssayExperiment, that can be generated with the help of the `create_multiassay` function, and will perform all the possible integration available for the omics provided by the user. All the integration functions exploit different statistical models depending on the input data type, the available models are negative binomial and linear regression. When the number of covariates is too high, a random forest model will select only the most importants which will be included in the integration models. In order to make the results more interpretable, gINTomics provides a comprehensive and interactive shiny app for the graphical representation of the results, the shiny app can be called with the `run_shiny` function, which takes as input the output of the `run_multiomics` function. Moreover additional functions are available to build single plots to visualize the results of the integration outside of the shiny app. In the following sections, we use an example MultiAssayExperiment of ovarian cancer to show how to use `gINTomics` with the different available integrations. The object contains all the available input data types: Gene expression data, miRNA expression data, gene methylation data, gene Copy Number Variations and miRNA Copy Number Variations.

## 3.2 Generate a MultiAssayExperiment

The package contains a pre built MultiAssayExperiment, anyway in this section we will divide it in signle omics matrices and see how to build a proper MultiAssayExperiment from zero.

    # loading packages
    library(gINTomics)
    library(MultiAssayExperiment)
    library(shiny)
    data("mmultiassay_ov")
    mmultiassay_ov

    ## A MultiAssayExperiment object of 5 listed
    ##  experiments with user-defined names and respective classes.
    ##  Containing an ExperimentList class object of length 5:
    ##  [1] gene_exp: RangedSummarizedExperiment with 1000 rows and 20 columns
    ##  [2] methylation: SummarizedExperiment with 1000 rows and 20 columns
    ##  [3] cnv_data: SummarizedExperiment with 1000 rows and 20 columns
    ##  [4] miRNA_exp: SummarizedExperiment with 1000 rows and 20 columns
    ##  [5] miRNA_cnv_data: SummarizedExperiment with 1000 rows and 20 columns
    ## Functionality:
    ##  experiments() - obtain the ExperimentList instance
    ##  colData() - the primary/phenotype DataFrame
    ##  sampleMap() - the sample coordination DataFrame
    ##  `$`, `[`, `[[` - extract colData columns, subset, or experiment
    ##  *Format() - convert into a long or wide DataFrame
    ##  assays() - convert ExperimentList to a SimpleList of matrices
    ##  exportClass() - save data to flat files

Here we will extract the single omics from the MultiAssayExperiment

    ## Here we just select part of the data o speed up the process
    tmp <- lapply(experiments(mmultiassay_ov), function(x) x[1:400,])
    mmultiassay_ov <- MultiAssayExperiment(experiments = tmp)

    gene_exp_matrix <- as.matrix(assay(mmultiassay_ov[["gene_exp"]]))
    miRNA_exp_matrix <- as.matrix(assay(mmultiassay_ov[["miRNA_exp"]]))
    meth_matrix <- as.matrix(assay(mmultiassay_ov[["methylation"]]))
    gene_cnv_matrix <- as.matrix(assay(mmultiassay_ov[["cnv_data"]]))
    miRNA_cnv_matrix <- as.matrix(assay(mmultiassay_ov[["miRNA_cnv_data"]]))

Now let’s build a proper MultiAssayExperiment starting from single matrices

    new_multiassay <- create_multiassay(methylation = meth_matrix,
                                        gene_exp = gene_exp_matrix,
                                        cnv_data = gene_cnv_matrix,
                                        miRNA_exp = miRNA_exp_matrix,
                                        miRNA_cnv_data = miRNA_cnv_matrix)

    new_multiassay

    ## A MultiAssayExperiment object of 5 listed
    ##  experiments with user-defined names and respective classes.
    ##  Containing an ExperimentList class object of length 5:
    ##  [1] gene_exp: matrix with 400 rows and 20 columns
    ##  [2] methylation: matrix with 400 rows and 20 columns
    ##  [3] cnv_data: matrix with 400 rows and 20 columns
    ##  [4] miRNA_exp: matrix with 400 rows and 20 columns
    ##  [5] miRNA_cnv_data: matrix with 400 rows and 20 columns
    ## Functionality:
    ##  experiments() - obtain the ExperimentList instance
    ##  colData() - the primary/phenotype DataFrame
    ##  sampleMap() - the sample coordination DataFrame
    ##  `$`, `[`, `[[` - extract colData columns, subset, or experiment
    ##  *Format() - convert into a long or wide DataFrame
    ##  assays() - convert ExperimentList to a SimpleList of matrices
    ##  exportClass() - save data to flat files

## 3.3 Run Genomic integration

In this section we will see how to perform a gene_expression~CNV+met integration. The input data should be provided as matrices or data.frames. Rows represent samples, while each column represents the different response variables/covariates of the models. By default all the integration functions will assume that expression data are obtained through sequencing, you should set the `sequencing_data` argument to FALSE if they are not. Expression data could be both normalized or not normalized, the function is able to normalize data by setting the `normalize` argument to TRUE (default). If you want you can specify custom interaction through the `interactions` argument otherwise the function will automatically look for the genes of `expression` in `cnv_data`. NOTE: if you customize genomics interactions, linking more covariates to a single response, the output may be not more compatible with the shiny visualization.

    gene_genomic_integration <- run_genomic_integration(expression = t(gene_exp_matrix),
                                                        cnv_data = t(gene_cnv_matrix),
                                                        methylation = t(meth_matrix))
    summary(gene_genomic_integration)

    ##           Length Class      Mode
    ## coef_data  3     data.frame list
    ## pval_data  3     data.frame list
    ## fdr_data   3     data.frame list
    ## residuals 20     data.frame list
    ## data       3     -none-     list

## 3.4 Run CNV integration

In this section we will see how to perform an expression~CNV integration. The input data (for both expression and CNV) should be provided as matrices or data.frames. Rows represent samples, while each column represents the different response variables/covariates of the models. By default all the integration functions will assume that expression data are obtained through sequencing, you should set the `sequencing_data` argument to FALSE if they are not. Expression data could be both normalized or not normalized, the function is able to normalize data by setting the `normalize` argument to TRUE (default). If you want you can specify custom interaction through the `interactions` argument otherwise the function will automatically look for the genes of `expression` in `cnv_data`.

    gene_cnv_integration <- run_cnv_integration(expression = t(gene_exp_matrix),
                                                cnv_data = t(gene_cnv_matrix))
    summary(gene_cnv_integration)

    ##           Length Class      Mode
    ## coef_data  2     data.frame list
    ## pval_data  2     data.frame list
    ## fdr_data   2     data.frame list
    ## residuals 20     data.frame list
    ## data       3     -none-     list

## 3.5 Run methylation integration

In this section we will see how to perform an expression~methylation integration. The input data should be the same of `run_cnv_integration`, but the covariates matrix will contain methylation data instead of Copy Number Variations data. Expression data could be both normalized or not normalized, the function is able to normalize data by setting the `normalize` argument to TRUE (default). If you want you can specify custom interaction through the `interactions` argument otherwise the function will automatically look for the genes of `expression` in `methylation`.

    gene_met_integration <- run_met_integration(expression = t(gene_exp_matrix),
                                                methylation = t(meth_matrix))
    summary(gene_met_integration)

    ##           Length Class      Mode
    ## coef_data  2     data.frame list
    ## pval_data  2     data.frame list
    ## fdr_data   2     data.frame list
    ## residuals 20     data.frame list
    ## data       3     -none-     list

## 3.6 Run TF-target integration

In this section we will see how to perform an expression~TF integration. In this case you can use as input data a single gene expression matrix if both your TF and targets are genes and are contained in the gene expression matrix. If you want the package to automatically download the interactions between TFs and targets you have to set the argument `type` to “tf”. Otherwise you can also specify your custom interactions providing them with the `interactions` argument. You can handle data normalization as in the previous functions through the `normalize` argument. This function is designed to integrate TF expression data but it can handle every type of numerical data representing a gene expression regulator. So you can pass the regulators matrix to the `tf_expression` argument and specify your custom `interactions`. If expression data are not obtained through sequencing, remember to set `sequencing data` to FALSE.

    tf_target_integration <- run_tf_integration(expression = t(gene_exp_matrix),
                                                type = "tf")

    ## Warning in import_tf_target_interactions(organism = org[species]): 'import_tf_target_interactions' is deprecated.
    ## Use 'tf_target' instead.
    ## See help("Deprecated")

    summary(tf_target_integration)

    ##           Length Class      Mode
    ## coef_data  2     data.frame list
    ## pval_data  2     data.frame list
    ## fdr_data   2     data.frame list
    ## residuals 20     data.frame list
    ## data       3     -none-     list

## 3.7 Run miRNA-target integration

In this section we will see how to perform an expression~miRNA integration. Gene expression data will be provided through the `expression` argument while miRNA expression data through the `tf_expression` argument. Input matrices should follow the same rules of the previous functions. If you want the package to automatically download the interactions between miRNA and targets you have to set the argument `type` to “miRNA_target”. Otherwise you can also specify your custom interactions providing them with the `interactions` argument. You can handle data normalization as in the previous functions through the `normalize` argument.

    miRNA_target_integration <- run_tf_integration(expression = t(gene_exp_matrix),
                                                   tf_expression = t(miRNA_exp_matrix),
                                                   type = "miRNA_target")

    ## Warning in import_mirnatarget_interactions(organism = org[species]): 'import_mirnatarget_interactions' is deprecated.
    ## Use 'mirna_target' instead.
    ## See help("Deprecated")

    summary(miRNA_target_integration)

    ##           Length Class      Mode
    ## coef_data  4     data.frame list
    ## pval_data  4     data.frame list
    ## fdr_data   4     data.frame list
    ## residuals 20     data.frame list
    ## data       3     -none-     list

## 3.8 Run TF-miRNA integration

In this section we will see how to perform an miRNA~TF integration. miRNA expression data will be provided through the `expression` argument while gene expression data through the `tf_expression` argument. Input matrices should follow the same rules of the previous functions. If you want the package to automatically download the interactions between TF and miRNA you have to set the argument `type` to “tf_miRNA”. Otherwise you can also specify your custom interactions providing them with the `interactions` argument. You can handle data normalization as in the previous functions through the `normalize` argument.

    tf_miRNA_integration <- run_tf_integration(expression = t(miRNA_exp_matrix),
                                                   tf_expression = t(gene_exp_matrix),
                                                   type = "tf_miRNA")

    ## Warning in import_tf_mirna_interactions(organism = org[species], resources = "TransmiR"): 'import_tf_mirna_interactions' is deprecated.
    ## Use 'tf_mirna' instead.
    ## See help("Deprecated")

    summary(tf_miRNA_integration)

    ##           Length Class      Mode
    ## coef_data  7     data.frame list
    ## pval_data  7     data.frame list
    ## fdr_data   7     data.frame list
    ## residuals 20     data.frame list
    ## data       3     -none-     list

## 3.9 Run complete Multi-Omics integration

Finally we will see how to perform a complete integration using all the available omics. In order to run this function you need to generate a MultiAssayExperiment as showed at the beginning of this vignette. The function will automatically use all the omics contained in the MultiAssayExperiment to perform all the possible integrations showed before. Moreover, if genomic data are available (CNV and/or Methylation), the first step will be the genomic integration and all the following integrations that contain gene expression data as response variable will use instead the residuals of the genomic model in order to filter out the effect of CNV and/or methylation. This framework is used also for miRNA, but in this case only CNV data are supported.

    ## Here we run the model
    multiomics_integration <- run_multiomics(data = new_multiassay)

    ## Warning in import_tf_target_interactions(organism = org[species]): 'import_tf_target_interactions' is deprecated.
    ## Use 'tf_target' instead.
    ## See help("Deprecated")

    ## Warning in import_tf_mirna_interactions(organism = org[species], resources = "TransmiR"): 'import_tf_mirna_interactions' is deprecated.
    ## Use 'tf_mirna' instead.
    ## See help("Deprecated")

    ## Warning in import_mirnatarget_interactions(organism = org[species]): 'import_mirnatarget_interactions' is deprecated.
    ## Use 'mirna_target' instead.
    ## See help("Deprecated")

    summary(multiomics_integration)

    ##                  Length Class  Mode
    ## gene_genomic_res 5      -none- list
    ## mirna_cnv_res    5      -none- list
    ## tf_res           5      -none- list
    ## tf_mirna_res     5      -none- list
    ## mirna_target_res 5      -none- list

# 4 Visualization

Now let’s see how you can visualize the results of your integration models.

## 4.1 Shiny app

gINTomics provides an interactive environment, based on Shiny, that allows the user to easily visualize output results from integration models and to save them for downstream tasks and reports creation. Once multiomics integration has been performed users can provide the results to the `run_shiny` function. NOTE: Only the output of the `run_multiomics` function is compatible with `run_shiny`

    run_shiny(multiomics_integration)

## 4.2 plots

### 4.2.1 network plot

Network plot shows the significant interactions between transcriptional regulators (TFs and miRNAs, if present) and their targets genes/miRNA. Nodes and edges are selected ordering them by the most high coefficient values (absolute value) and by default the top 200 interactions are showed. You can change the number of interactions with the `num_interactions` argument. Here you can see the code to generate a network from a multiomics integration

    data_table <- extract_model_res(multiomics_integration)

    ##   2162 genes were dropped because they have exons located on both strands
    ##   of the same reference sequence or on more than one reference sequence,
    ##   so cannot be represented by a single genomic range.
    ##   Use 'single.strand.genes.only=FALSE' to get all the genes in a
    ##   GRangesList object, or use suppressMessages() to suppress this message.

    ## 'select()' returned 1:many mapping between keys and columns

    data_table <- data_table[data_table$cov!="(Intercept)",]
    # plot_network(data_table, num_interactions = 200)

### 4.2.2 Venn Diagram

The Venn Diagram is designed for the genomic integration. It can help to identify genes which are significantly regulated by both CNV and methylation. Here you can see the code to generate a Venn Diagram from a multiomics integration

    # plot_venn(data_table)

### 4.2.3 Volcano plot

The Volcano Plot shows the distribution of integration coefficients for every integration type associated with a genomic class (cnv, met, cnv-mirna). For each integration coefficient, on the y axis you have the -log10 of Pvalue/FDR and on the x axis the value of the coefficient. Here you can see the code to generate a Volcano plot for CNV and one for methylation from a multiomics integration

    # plot_volcano(data_table, omics = "gene_genomic_res", cnv_met = "cnv")
    # plot_volcano(data_table, omics = "gene_genomic_res", cnv_met = "met")

### 4.2.4 Ridgeline plot

The ridgeline plot is designed to compare different distributions, it has been integrated in the package with the aim to compare the distribution of significant and non significant coefficients returned by our integration models. For each distribution, on the y axis you have the frequencies and on the x axis the values of the coefficients. Here you can see the code to generate a Ridgeline plot for CNV and one for methylation from a multiomics integration

    # plot_ridge(data_table, omics = "gene_genomic_res", cnv_met = "cnv")
    # plot_ridge(data_table, omics = "gene_genomic_res", cnv_met = "met")

### 4.2.5 Chromosome distribution plot

This barplot highlights the distribution of significant and non significant covariates among chromosomes. This kind of visualization will identify chromosomes in which the type of regulation under analysis is particularly active. Here you can see the code to generate a chromosome distribution plot specif for the genomic integration, starting from the results of the multiomics integration.

    # plot_chr_distribution(data_table = data_table,
    #                     omics = "gene_genomic_res")

### 4.2.6 TF distribution plot

This barplot highlights the number of significant tragets for each TFs. Here you can see the code to generate a TF distribution plot starting from the results of the multiomics integration.

    # plot_tf_distribution(data_table = data_table)

### 4.2.7 Enrichment plot

The enrichment plot shows the enrichment results obtained with enrichGO and enrichKEGG (clusterProfiler). The genomic enrichment is performed providing the list of genes significantly regulated by methylation or CNV, while the transcriptional one with the list of genes significantly regulated by each transcription factor (we run an enrichment for each TF that significantly regulates at least 12 targets) Here you can see the code to run a genomic enrichment starting from the results of the multiomics integration and to visualize the top results with a DotPlot

    #gen_enr <- run_genomic_enrich(multiomics_integration, qvalueCutoff = 1, pvalueCutoff = 0.05, pAdjustMethod = "none")
    #dot_plotly(gen_enr$cnv[[1]]$go)

# 5 Session info

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

    sessionInfo()

    ## R version 4.4.1 (2024-06-14 ucrt)
    ## Platform: x86_64-w64-mingw32/x64
    ## Running under: Windows Server 2022 x64 (build 20348)
    ##
    ## Matrix products: default
    ##
    ##
    ## locale:
    ## [1] LC_COLLATE=C
    ## [2] LC_CTYPE=English_United States.utf8
    ## [3] LC_MONETARY=English_United States.utf8
    ## [4] LC_NUMERIC=C
    ## [5] LC_TIME=English_United States.utf8
    ##
    ## time zone: America/New_York
    ## tzcode source: internal
    ##
    ## attached base packages:
    ## [1] stats4    stats     graphics  grDevices utils     datasets  methods
    ## [8] base
    ##
    ## other attached packages:
    ##  [1] shiny_1.9.1                 MultiAssayExperiment_1.32.0
    ##  [3] SummarizedExperiment_1.36.0 Biobase_2.66.0
    ##  [5] GenomicRanges_1.58.0        GenomeInfoDb_1.42.0
    ##  [7] IRanges_2.40.0              S4Vectors_0.44.0
    ##  [9] BiocGenerics_0.52.0         MatrixGenerics_1.18.0
    ## [11] matrixStats_1.4.1           gINTomics_1.2.0
    ## [13] BiocStyle_2.34.0
    ##
    ## loaded via a namespace (and not attached):
    ##   [1] fs_1.6.4
    ##   [2] bitops_1.0-9
    ##   [3] enrichplot_1.26.0
    ##   [4] fontawesome_0.5.2
    ##   [5] lubridate_1.9.3
    ##   [6] httr_1.4.7
    ##   [7] RColorBrewer_1.1-3
    ##   [8] doParallel_1.0.17
    ##   [9] tools_4.4.1
    ##  [10] backports_1.5.0
    ##  [11] utf8_1.2.4
    ##  [12] R6_2.5.1
    ##  [13] DT_0.33
    ##  [14] lazyeval_0.2.2
    ##  [15] GetoptLong_1.0.5
    ##  [16] withr_3.0.2
    ##  [17] graphite_1.52.0
    ##  [18] prettyunits_1.2.0
    ##  [19] gridExtra_2.3
    ##  [20] cli_3.6.3
    ##  [21] sass_0.4.9
    ##  [22] randomForest_4.7-1.2
    ##  [23] readr_2.1.5
    ##  [24] ggridges_0.5.6
    ##  [25] Rsamtools_2.22.0
    ##  [26] systemfonts_1.1.0
    ##  [27] yulab.utils_0.1.7
    ##  [28] gson_0.1.0
    ##  [29] DOSE_4.0.0
    ##  [30] svglite_2.1.3
    ##  [31] R.utils_2.12.3
    ##  [32] InteractiveComplexHeatmap_1.14.0
    ##  [33] limma_3.62.0
    ##  [34] readxl_1.4.3
    ##  [35] rstudioapi_0.17.1
    ##  [36] RSQLite_2.3.7
    ##  [37] visNetwork_2.1.2
    ##  [38] generics_0.1.3
    ##  [39] gridGraphics_0.5-1
    ##  [40] shape_1.4.6.1
    ##  [41] BiocIO_1.16.0
    ##  [42] vroom_1.6.5
    ##  [43] gtools_3.9.5
    ##  [44] dplyr_1.1.4
    ##  [45] zip_2.3.1
    ##  [46] GO.db_3.20.0
    ##  [47] Matrix_1.7-1
    ##  [48] fansi_1.0.6
    ##  [49] logger_0.4.0
    ##  [50] abind_1.4-8
    ##  [51] R.methodsS3_1.8.2
    ##  [52] lifecycle_1.0.4
    ##  [53] edgeR_4.4.0
    ##  [54] yaml_2.3.10
    ##  [55] qvalue_2.38.0
    ##  [56] SparseArray_1.6.0
    ##  [57] BiocFileCache_2.14.0
    ##  [58] grid_4.4.1
    ##  [59] blob_1.2.4
    ##  [60] promises_1.3.0
    ##  [61] shinydashboard_0.7.2
    ##  [62] crayon_1.5.3
    ##  [63] ggtangle_0.0.3
    ##  [64] lattice_0.22-6
    ##  [65] cowplot_1.1.3
    ##  [66] GenomicFeatures_1.58.0
    ##  [67] chromote_0.3.1
    ##  [68] KEGGREST_1.46.0
    ##  [69] pillar_1.9.0
    ##  [70] knitr_1.48
    ##  [71] ComplexHeatmap_2.22.0
    ##  [72] fgsea_1.32.0
    ##  [73] rjson_0.2.23
    ##  [74] clisymbols_1.2.0
    ##  [75] codetools_0.2-20
    ##  [76] fastmatch_1.1-4
    ##  [77] glue_1.8.0
    ##  [78] ggvenn_0.1.10
    ##  [79] ggfun_0.1.7
    ##  [80] data.table_1.16.2
    ##  [81] vctrs_0.6.5
    ##  [82] png_0.1-8
    ##  [83] treeio_1.30.0
    ##  [84] org.Mm.eg.db_3.20.0
    ##  [85] cellranger_1.1.0
    ##  [86] gtable_0.3.6
    ##  [87] cachem_1.1.0
    ##  [88] OmnipathR_3.14.0
    ##  [89] xfun_0.48
    ##  [90] S4Arrays_1.6.0
    ##  [91] mime_0.12
    ##  [92] tidygraph_1.3.1
    ##  [93] iterators_1.0.14
    ##  [94] statmod_1.5.0
    ##  [95] nlme_3.1-166
    ##  [96] ggtree_3.14.0
    ##  [97] bit64_4.5.2
    ##  [98] filelock_1.0.3
    ##  [99] progress_1.2.3
    ## [100] bslib_0.8.0
    ## [101] colorspace_2.1-1
    ## [102] DBI_1.2.3
    ## [103] tidyselect_1.2.1
    ## [104] processx_3.8.4
    ## [105] bit_4.5.0
    ## [106] compiler_4.4.1
    ## [107] curl_5.2.3
    ## [108] shiny.gosling_1.2.0
    ## [109] rvest_1.0.4
    ## [110] httr2_1.0.5
    ## [111] graph_1.84.0
    ## [112] xml2_1.3.6
    ## [113] plotly_4.10.4
    ## [114] TxDb.Mmusculus.UCSC.mm10.knownGene_3.10.0
    ## [115] DelayedArray_0.32.0
    ## [116] bookdown_0.41
    ## [117] rtracklayer_1.66.0
    ## [118] checkmate_2.3.2
    ## [119] scales_1.3.0
    ## [120] callr_3.7.6
    ## [121] rappdirs_0.3.3
    ## [122] stringr_1.5.1
    ## [123] digest_0.6.37
    ## [124] rmarkdown_2.28
    ## [125] XVector_0.46.0
    ## [126] htmltools_0.5.8.1
    ## [127] pkgconfig_2.0.3
    ## [128] dbplyr_2.5.0
    ## [129] highr_0.11
    ## [130] fastmap_1.2.0
    ## [131] rlang_1.1.4
    ## [132] GlobalOptions_0.1.2
    ## [133] htmlwidgets_1.6.4
    ## [134] UCSC.utils_1.2.0
    ## [135] farver_2.1.2
    ## [136] jquerylib_0.1.4
    ## [137] jsonlite_1.8.9
    ## [138] BiocParallel_1.40.0
    ## [139] GOSemSim_2.32.0
    ## [140] R.oo_1.26.0
    ## [141] RCurl_1.98-1.16
    ## [142] magrittr_2.0.3
    ## [143] kableExtra_1.4.0
    ## [144] GenomeInfoDbData_1.2.13
    ## [145] ggplotify_0.1.2
    ## [146] patchwork_1.3.0
    ## [147] munsell_0.5.1
    ## [148] Rcpp_1.0.13
    ## [149] ape_5.8
    ## [150] viridis_0.6.5
    ## [151] stringi_1.8.4
    ## [152] ggraph_2.2.1
    ## [153] zlibbioc_1.52.0
    ## [154] MASS_7.3-61
    ## [155] org.Hs.eg.db_3.20.0
    ## [156] plyr_1.8.9
    ## [157] parallel_4.4.1
    ## [158] ggrepel_0.9.6
    ## [159] Biostrings_2.74.0
    ## [160] graphlayouts_1.2.0
    ## [161] splines_4.4.1
    ## [162] hms_1.1.3
    ## [163] circlize_0.4.16
    ## [164] locfit_1.5-9.10
    ## [165] ps_1.8.1
    ## [166] igraph_2.1.1
    ## [167] reshape2_1.4.4
    ## [168] biomaRt_2.62.0
    ## [169] XML_3.99-0.17
    ## [170] evaluate_1.0.1
    ## [171] BiocManager_1.30.25
    ## [172] selectr_0.4-2
    ## [173] tzdb_0.4.0
    ## [174] foreach_1.5.2
    ## [175] tweenr_2.0.3
    ## [176] httpuv_1.6.15
    ## [177] tidyr_1.3.1
    ## [178] purrr_1.0.2
    ## [179] polyclip_1.10-7
    ## [180] clue_0.3-65
    ## [181] ggplot2_3.5.1
    ## [182] BiocBaseUtils_1.8.0
    ## [183] ReactomePA_1.50.0
    ## [184] ggforce_0.4.2
    ## [185] xtable_1.8-4
    ## [186] restfulr_0.0.15
    ## [187] reactome.db_1.89.0
    ## [188] tidytree_0.4.6
    ## [189] later_1.3.2
    ## [190] viridisLite_0.4.2
    ## [191] TxDb.Hsapiens.UCSC.hg38.knownGene_3.20.0
    ## [192] tibble_3.2.1
    ## [193] clusterProfiler_4.14.0
    ## [194] websocket_1.4.2
    ## [195] aplot_0.2.3
    ## [196] memoise_2.0.1
    ## [197] AnnotationDbi_1.68.0
    ## [198] GenomicAlignments_1.42.0
    ## [199] cluster_2.1.6
    ## [200] timechange_0.3.0