Contents

1 Introduction

Our OmicsMLRepo project aims to improve the AI/ML-readiness of Omics datasets available through Bioconductor. One of the main activities under this project is metadata harmonization (e.g., remove redundant information) and standardization (i.e., incorporate ontology).

Currently, we released the harmonized version of metadata for two Bioconductor data packages - curatedMetagenomicDatacontaining human microbiome data and cBioPortalData package on cancer genomics data. OmicsMLRepoR is a software package allowing users to easily access the harmonized metadata and to leverage ontology in metadata search.

OmicsMLRepoR package provides the three major functions:
1. Download the harmonized metadata
2. Browse the harmonized metadata using ontology
3. Manipulate the ‘shape’ of the harmonized metadata

1.1 Load package

suppressPackageStartupMessages({
    library(OmicsMLRepoR)
    library(dplyr)
    library(curatedMetagenomicData)
    library(cBioPortalData)
})

1.2 Load the metadata

You can download the harmonized version of metadata using the getMetadata function. Currently, two options are available - cMD and cBioPortalData.

cmd <- getMetadata("cMD")
cmd
#> # A tibble: 22,668 × 87
#>    study_name    subject_id sample_id     curation_id           target_condition
#>  * <chr>         <chr>      <chr>         <chr>                 <chr>           
#>  1 AsnicarF_2017 MV_FEI1    MV_FEI1_t1Q14 AsnicarF_2017:MV_FEI… human gut micro…
#>  2 AsnicarF_2017 MV_FEI2    MV_FEI2_t1Q14 AsnicarF_2017:MV_FEI… human gut micro…
#>  3 AsnicarF_2017 MV_FEI3    MV_FEI3_t1Q14 AsnicarF_2017:MV_FEI… human gut micro…
#>  4 AsnicarF_2017 MV_FEI4    MV_FEI4_t1Q14 AsnicarF_2017:MV_FEI… human gut micro…
#>  5 AsnicarF_2017 MV_FEI4    MV_FEI4_t2Q15 AsnicarF_2017:MV_FEI… human gut micro…
#>  6 AsnicarF_2017 MV_FEI5    MV_FEI5_t1Q14 AsnicarF_2017:MV_FEI… human gut micro…
#>  7 AsnicarF_2017 MV_FEI5    MV_FEI5_t2Q14 AsnicarF_2017:MV_FEI… human gut micro…
#>  8 AsnicarF_2017 MV_FEI5    MV_FEI5_t3Q15 AsnicarF_2017:MV_FEI… human gut micro…
#>  9 AsnicarF_2017 MV_FEM1    MV_FEM1_t1Q14 AsnicarF_2017:MV_FEM… human gut micro…
#> 10 AsnicarF_2017 MV_FEM2    MV_FEM2_t1Q14 AsnicarF_2017:MV_FEM… human gut micro…
#> # ℹ 22,658 more rows
#> # ℹ 82 more variables: target_condition_ontology_term_id <chr>, control <chr>,
#> #   control_ontology_term_id <chr>, country <chr>,
#> #   country_ontology_term_id <chr>, body_site <chr>,
#> #   body_site_ontology_term_id <chr>, body_site_details <chr>,
#> #   body_site_details_ontology_term_id <chr>, age_group <chr>,
#> #   age_group_ontology_term_id <chr>, age_max <dbl>, age_min <dbl>, …
cbio <- getMetadata("cBioPortal")
cbio
#> # A tibble: 189,439 × 79
#>    studyId  patientId    sampleId        curation_id        SAMPLE_COUNT acronym
#>  * <chr>    <chr>        <chr>           <chr>                     <dbl> <chr>  
#>  1 acc_tcga TCGA-OR-A5J1 TCGA-OR-A5J1-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  2 acc_tcga TCGA-OR-A5J2 TCGA-OR-A5J2-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  3 acc_tcga TCGA-OR-A5J3 TCGA-OR-A5J3-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  4 acc_tcga TCGA-OR-A5J4 TCGA-OR-A5J4-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  5 acc_tcga TCGA-OR-A5J5 TCGA-OR-A5J5-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  6 acc_tcga TCGA-OR-A5J6 TCGA-OR-A5J6-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  7 acc_tcga TCGA-OR-A5J7 TCGA-OR-A5J7-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  8 acc_tcga TCGA-OR-A5J8 TCGA-OR-A5J8-01 acc_tcga:TCGA-OR-…            1 <NA>   
#>  9 acc_tcga TCGA-OR-A5J9 TCGA-OR-A5J9-01 acc_tcga:TCGA-OR-…            1 <NA>   
#> 10 acc_tcga TCGA-OR-A5JA TCGA-OR-A5JA-01 acc_tcga:TCGA-OR-…            1 <NA>   
#> # ℹ 189,429 more rows
#> # ℹ 73 more variables: acronym_ontology_term_id <chr>, age_at_death <dbl>,
#> #   age_at_death_max <dbl>, age_at_death_min <dbl>, age_at_diagnosis <chr>,
#> #   age_at_diagnosis_max <chr>, age_at_diagnosis_min <chr>,
#> #   age_at_metastasis <dbl>, age_at_metastasis_max <dbl>,
#> #   age_at_metastasis_min <dbl>, age_at_procurement <dbl>,
#> #   age_at_procurement_max <dbl>, age_at_procurement_min <dbl>, …

2 Access metadata

Harmonized metadata can be easily searched by dplyr functions. To fully leverage ontologies incorporated in harmonized metadata and provide more robust data browsing experience, the package provides the tree_filter function. Note, that tree_filter can be used on the attributes mapped to the ontology terms:

#>  [1] "target_condition"            "control"                    
#>  [3] "country"                     "body_site"                  
#>  [5] "body_site_details"           "age_group"                  
#>  [7] "ancestry_details"            "ancestry"                   
#>  [9] "disease_details"             "disease"                    
#> [11] "disease_response_recist"     "feces_phenotype"            
#> [13] "hla"                         "neonatal_delivery_procedure"
#> [15] "neonatal_preterm_birth"      "obgyn_menopause"            
#> [17] "obgyn_pregnancy"             "probing_pocket_depth"       
#> [19] "sex"                         "smoker"                     
#> [21] "treatment"

2.1 Robust search using ontology

Compared to the typical searching in the original metadata from the curatedMetagenomicData, OmicsMLRepoR enables more robust data browsing, including case-insensitive, synonyms and descendant searching capabilities.

Searching the same information in the original, unharmonized metadata (sampleMetadata) from the curatedMetagenomicData package is much less robust:

## Information spread out in two different columns
nrow(sampleMetadata |> filter(study_condition == "CRC"))
#> [1] 701
nrow(sampleMetadata |> filter(disease == "CRC"))
#> [1] 625

## Case sensitive
nrow(sampleMetadata |> filter(study_condition == "CRC"))
#> [1] 701
nrow(sampleMetadata |> filter(study_condition == "crc"))
#> [1] 0

## Synonyms not covered
nrow(sampleMetadata |> filter(study_condition == "Colorectal Carcinoma"))
#> [1] 0
nrow(sampleMetadata |> filter(study_condition == "Colorectal Cancer"))
#> [1] 0

2.1.1 Not case-sensitive

tree_filter is not case-sensitive.

nrow(cmd |> tree_filter(disease, "Colorectal Carcinoma"))
#> [1] 701
nrow(cmd |> tree_filter(disease, "colorectal carcinoma"))
#> [1] 701

2.1.2 Include synonyms

tree_filter includes the synonyms of the queried terms in its searching.

syn_res1 <- cmd |> tree_filter(disease, "CRC")
syn_res2 <- cmd |> tree_filter(disease, "Colorectal Cancer")
syn_res3 <- cmd |> tree_filter(disease, "Colorectal Carcinoma")

nrow(syn_res1)
#> [1] 701
nrow(syn_res2)
#> [1] 701
nrow(syn_res3)
#> [1] 701

Check that the returned results are identical.

unique(syn_res1$disease)
#>  [1] "Colorectal Carcinoma;Hepatic Steatosis;Hypertension;Carcinoma"                         
#>  [2] "Colorectal Carcinoma;Carcinoma"                                                        
#>  [3] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hepatic Steatosis;Hypertension;Carcinoma"
#>  [4] "Colorectal Carcinoma;Hypertension;Carcinoma"                                           
#>  [5] "Colorectal Carcinoma;Hepatic Steatosis;Carcinoma"                                      
#>  [6] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hypertension;Carcinoma"                  
#>  [7] "Colorectal Carcinoma;Adenocarcinoma"                                                   
#>  [8] "Colorectal Carcinoma"                                                                  
#>  [9] "Colorectal Carcinoma;Hypercholesterolemia;Adenocarcinoma"                              
#> [10] "Colorectal Carcinoma;Hypertension;Adenocarcinoma"                                      
#> [11] "Colorectal Carcinoma;Hypercholesterolemia;Hypertension;Adenocarcinoma"                 
#> [12] "Colorectal Carcinoma;Metastatic Malignant Neoplasm;Adenocarcinoma"                     
#> [13] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Carcinoma"
unique(syn_res2$disease)
#>  [1] "Colorectal Carcinoma;Hepatic Steatosis;Hypertension;Carcinoma"                         
#>  [2] "Colorectal Carcinoma;Carcinoma"                                                        
#>  [3] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hepatic Steatosis;Hypertension;Carcinoma"
#>  [4] "Colorectal Carcinoma;Hypertension;Carcinoma"                                           
#>  [5] "Colorectal Carcinoma;Hepatic Steatosis;Carcinoma"                                      
#>  [6] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hypertension;Carcinoma"                  
#>  [7] "Colorectal Carcinoma;Adenocarcinoma"                                                   
#>  [8] "Colorectal Carcinoma"                                                                  
#>  [9] "Colorectal Carcinoma;Hypercholesterolemia;Adenocarcinoma"                              
#> [10] "Colorectal Carcinoma;Hypertension;Adenocarcinoma"                                      
#> [11] "Colorectal Carcinoma;Hypercholesterolemia;Hypertension;Adenocarcinoma"                 
#> [12] "Colorectal Carcinoma;Metastatic Malignant Neoplasm;Adenocarcinoma"                     
#> [13] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Carcinoma"
unique(syn_res3$disease)
#>  [1] "Colorectal Carcinoma;Hepatic Steatosis;Hypertension;Carcinoma"                         
#>  [2] "Colorectal Carcinoma;Carcinoma"                                                        
#>  [3] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hepatic Steatosis;Hypertension;Carcinoma"
#>  [4] "Colorectal Carcinoma;Hypertension;Carcinoma"                                           
#>  [5] "Colorectal Carcinoma;Hepatic Steatosis;Carcinoma"                                      
#>  [6] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hypertension;Carcinoma"                  
#>  [7] "Colorectal Carcinoma;Adenocarcinoma"                                                   
#>  [8] "Colorectal Carcinoma"                                                                  
#>  [9] "Colorectal Carcinoma;Hypercholesterolemia;Adenocarcinoma"                              
#> [10] "Colorectal Carcinoma;Hypertension;Adenocarcinoma"                                      
#> [11] "Colorectal Carcinoma;Hypercholesterolemia;Hypertension;Adenocarcinoma"                 
#> [12] "Colorectal Carcinoma;Metastatic Malignant Neoplasm;Adenocarcinoma"                     
#> [13] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Carcinoma"

2.1.3 Search descendants in ontology tree

tree_filter includes all the descendants of the queried term in its searching.

onto_res <- cmd |> tree_filter(disease, "Intestinal Disorder")
unique(onto_res$disease)
#>  [1] "Crohn Disease;Schizophrenia"                                                           
#>  [2] "Colorectal Carcinoma;Hepatic Steatosis;Hypertension;Carcinoma"                         
#>  [3] "Colorectal Carcinoma;Carcinoma"                                                        
#>  [4] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hepatic Steatosis;Hypertension;Carcinoma"
#>  [5] "Colorectal Carcinoma;Hypertension;Carcinoma"                                           
#>  [6] "Colorectal Carcinoma;Hepatic Steatosis;Carcinoma"                                      
#>  [7] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Hypertension;Carcinoma"                  
#>  [8] "Colorectal Carcinoma;Adenocarcinoma"                                                   
#>  [9] "Inflammatory Bowel Disease;Crohn Disease"                                              
#> [10] "Inflammatory Bowel Disease;Ulcerative Colitis"                                         
#> [11] "Colorectal Carcinoma"                                                                  
#> [12] "Cytomegaloviral Infection;Celiac Disease;Gestational Diabetes"                         
#> [13] "Type 1 Diabetes Mellitus;Celiac Disease;Irritable Bowel Syndrome"                      
#> [14] "Inflammatory Bowel Disease"                                                            
#> [15] "Inflammatory Bowel Disease;Fecal Microbiota Transplantation"                           
#> [16] "Melanoma;Colitis"                                                                      
#> [17] "Inflammatory Bowel Disease;Anorectal Fistula;Crohn Disease"                            
#> [18] "Colorectal Carcinoma;Hypercholesterolemia;Adenocarcinoma"                              
#> [19] "Colorectal Carcinoma;Hypertension;Adenocarcinoma"                                      
#> [20] "Colorectal Carcinoma;Hypercholesterolemia;Hypertension;Adenocarcinoma"                 
#> [21] "Colorectal Carcinoma;Metastatic Malignant Neoplasm;Adenocarcinoma"                     
#> [22] "Inflammatory Bowel Disease;Colitis"                                                    
#> [23] "Colorectal Carcinoma;Type 2 Diabetes Mellitus;Carcinoma"                               
#> [24] "Adenoma;Small Intestinal Adenoma"                                                      
#> [25] "Adenoma;Colorectal Adenoma"

2.2 Multiple searching terms

For example, you can search for any row including a disease related to either “migraine” or “diabetes.”

res_or <- cmd %>% tree_filter(disease, c("migraine", "diabetes"), "OR")

We can also change the “OR” argument (default) to either “AND” or “NOT” and change the filtering action. “AND” will return any rows including a disease value that is related to both “migraine” and “diabetes,” and “NOT” will return any rows including a disease value that is not related to either “migraine” or “diabetes.”

res_and <- cmd %>% tree_filter(disease, c("migraine", "diabetes"), "AND")
res_not <- cmd %>% tree_filter(disease, c("migraine", "diabetes"), "NOT")

You can combine tree_filter and dplyr functions. For example, if you want all rows with a disease value related to either “migraine” or “diabetes,” as well as with an age_years value under 30,

res_or_below30 <- cmd %>% 
    filter(age_years < 30) %>%
    tree_filter(disease, c("migraine", "diabetes"))

2.3 Collapse/Expand metadata

Some metadata columns (e.g., biomarker) contain multiple, similar attributes separated with a specific delimiter (i.e., <;>). Our harmonization use this structure because they are related information often looked up together.

cmd_biomarker <- cmd %>% 
    filter(!is.na(biomarker)) %>% 
    select(curation_id, biomarker)
wtb <- getWideMetaTb(cmd_biomarker, "biomarker")
head(wtb)
#> # A tibble: 6 × 36
#>   curation_id    `Adiponectin_in_ug/mL` Alanine_Aminotransfe…¹ `Albumin_in_g/dL`
#>   <chr>          <chr>                  <chr>                  <chr>            
#> 1 ChengpingW_20… <NA>                   23                     57               
#> 2 ChengpingW_20… <NA>                   13                     49.4             
#> 3 ChengpingW_20… <NA>                   19                     50.8             
#> 4 ChengpingW_20… <NA>                   29                     52               
#> 5 ChengpingW_20… <NA>                   14                     47.1             
#> 6 ChengpingW_20… <NA>                   5                      46.1             
#> # ℹ abbreviated name: ¹​`Alanine_Aminotransferase_in_U/L`
#> # ℹ 32 more variables: `Aspartate_Aminotransferase_in_U/L` <chr>,
#> #   `Autoantibody_titer_positive_(finding)` <chr>, `C-peptide_in_ng/ml` <chr>,
#> #   `Cholesterol_in_mg/dL` <chr>, `Creatine_in_umol/L` <chr>,
#> #   `Creatinine_in_umol/L` <chr>, `Diastolic_Blood_Pressure_in_mm/Hg` <chr>,
#> #   `Direct_Bilirubin_in_umol/L` <chr>,
#> #   `Erythrocyte_Sedimentation_Rate_in_mm/hr` <chr>, …
ltb <- getLongMetaTb(cmd, targetCols = "target_condition")
dim(cmd)
#> [1] 22668    87
dim(ltb)
#> [1] 46007    87

3 Download omics data

3.1 curatedMetagenomicData

cmd_dat <- cmd %>%
    tree_filter(col = "disease", "Type 2 Diabetes Mellitus") %>%
    filter(sex == "Female") %>%
    filter(age_group == "Elderly") %>%
    returnSamples("relative_abundance", rownames = "short")

3.2 cBioPortalData

cbio_sub <- cbio %>%
    getLongMetaTb("treatment_name", "<;>") %>%
    filter(treatment_name == "Fluorouracil") %>%
    filter(age_at_diagnosis > 50) %>%
    filter(sex == "Female") %>%
    getShortMetaTb(idCols = "curation_id", targetCols = "treatment_name")

dim(cbio_sub)
#> [1] 56 79
studies <- unique(cbio_sub$studyId)
studies
#> [1] "aml_ohsu_2018" "aml_ohsu_2022" "egc_msk_2017"

A simple for loop can collect samples from multiple studies.

cbio_api <- cBioPortal()
resAll <- as.list(vector(length = length(studies)))

for (i in seq_along(studies)) {
    study <- studies[i]
    samples <- cbio_sub %>%
        filter(studyId == study) %>%
        pull(sampleId)

    res <- cBioPortalData(
        api = cbio_api,
        by = "hugoGeneSymbol",
        studyId = study,
        sampleIds = samples,
        genePanelId = "IMPACT341"
    )
    
    resAll[[i]] <- res
}

4 Session Info

sessionInfo()
#> R version 4.4.1 (2024-06-14)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.1 LTS
#> 
#> Matrix products: default
#> BLAS:   /home/biocbuild/bbs-3.20-bioc/R/lib/libRblas.so 
#> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_GB              LC_COLLATE=C              
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: America/New_York
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats4    stats     graphics  grDevices utils     datasets  methods  
#> [8] base     
#> 
#> other attached packages:
#>  [1] cBioPortalData_2.18.0           MultiAssayExperiment_1.32.0    
#>  [3] AnVIL_1.18.0                    AnVILBase_1.0.0                
#>  [5] curatedMetagenomicData_3.13.0   TreeSummarizedExperiment_2.14.0
#>  [7] Biostrings_2.74.0               XVector_0.46.0                 
#>  [9] SingleCellExperiment_1.28.0     SummarizedExperiment_1.36.0    
#> [11] Biobase_2.66.0                  GenomicRanges_1.58.0           
#> [13] GenomeInfoDb_1.42.0             IRanges_2.40.0                 
#> [15] S4Vectors_0.44.0                BiocGenerics_0.52.0            
#> [17] MatrixGenerics_1.18.0           matrixStats_1.4.1              
#> [19] dplyr_1.1.4                     OmicsMLRepoR_1.0.0             
#> [21] BiocStyle_2.34.0               
#> 
#> loaded via a namespace (and not attached):
#>   [1] fs_1.6.4                    bitops_1.0-9               
#>   [3] DirichletMultinomial_1.48.0 lubridate_1.9.3            
#>   [5] httr_1.4.7                  RColorBrewer_1.1-3         
#>   [7] GenomicDataCommons_1.30.0   tools_4.4.1                
#>   [9] backports_1.5.0             utf8_1.2.4                 
#>  [11] R6_2.5.1                    DT_0.33                    
#>  [13] vegan_2.6-8                 lazyeval_0.2.2             
#>  [15] mgcv_1.9-1                  permute_0.9-7              
#>  [17] withr_3.0.2                 TCGAutils_1.26.0           
#>  [19] gridExtra_2.3               archive_1.1.9              
#>  [21] cli_3.6.3                   formatR_1.14               
#>  [23] sandwich_3.1-1              slam_0.1-54                
#>  [25] sass_0.4.9                  mvtnorm_1.3-1              
#>  [27] readr_2.1.5                 rapiclient_0.1.8           
#>  [29] Rsamtools_2.22.0            yulab.utils_0.1.7          
#>  [31] foreign_0.8-87              scater_1.34.0              
#>  [33] decontam_1.26.0             rstudioapi_0.17.1          
#>  [35] RSQLite_2.3.7               visNetwork_2.1.2           
#>  [37] generics_0.1.3              BiocIO_1.16.0              
#>  [39] vroom_1.6.5                 rbiom_1.0.3                
#>  [41] Matrix_1.7-1                futile.logger_1.4.3        
#>  [43] ggbeeswarm_0.7.2            fansi_1.0.6                
#>  [45] DECIPHER_3.2.0              abind_1.4-8                
#>  [47] lifecycle_1.0.4             yaml_2.3.10                
#>  [49] RaggedExperiment_1.30.0     SparseArray_1.6.0          
#>  [51] BiocFileCache_2.14.0        grid_4.4.1                 
#>  [53] blob_1.2.4                  promises_1.3.0             
#>  [55] ExperimentHub_2.14.0        crayon_1.5.3               
#>  [57] miniUI_0.1.1.1              lattice_0.22-6             
#>  [59] beachmat_2.22.0             chromote_0.3.1             
#>  [61] GenomicFeatures_1.58.0      KEGGREST_1.46.0            
#>  [63] pillar_1.9.0                knitr_1.48                 
#>  [65] rjson_0.2.23                boot_1.3-31                
#>  [67] lpSolve_5.6.21              codetools_0.2-20           
#>  [69] glue_1.8.0                  data.table_1.16.2          
#>  [71] vctrs_0.6.5                 png_0.1-8                  
#>  [73] treeio_1.30.0               gtable_0.3.6               
#>  [75] cachem_1.1.0                xfun_0.48                  
#>  [77] S4Arrays_1.6.0              mime_0.12                  
#>  [79] RTCGAToolbox_2.36.0         DiagrammeR_1.0.11          
#>  [81] bluster_1.16.0              nlme_3.1-166               
#>  [83] bit64_4.5.2                 filelock_1.0.3             
#>  [85] data.tree_1.1.0             bslib_0.8.0                
#>  [87] irlba_2.3.5.1               vipor_0.4.7                
#>  [89] rpart_4.1.23                colorspace_2.1-1           
#>  [91] DBI_1.2.3                   Hmisc_5.2-0                
#>  [93] nnet_7.3-19                 processx_3.8.4             
#>  [95] tidyselect_1.2.1            bit_4.5.0                  
#>  [97] compiler_4.4.1              curl_5.2.3                 
#>  [99] rvest_1.0.4                 httr2_1.0.5                
#> [101] htmlTable_2.4.3             BiocNeighbors_2.0.0        
#> [103] xml2_1.3.6                  DelayedArray_0.32.0        
#> [105] bookdown_0.41               rtracklayer_1.66.0         
#> [107] checkmate_2.3.2             scales_1.3.0               
#> [109] rappdirs_0.3.3              stringr_1.5.1              
#> [111] digest_0.6.37               minqa_1.2.8                
#> [113] rmarkdown_2.28              htmltools_0.5.8.1          
#> [115] pkgconfig_2.0.3             base64enc_0.1-3            
#> [117] lme4_1.1-35.5               sparseMatrixStats_1.18.0   
#> [119] dbplyr_2.5.0                fastmap_1.2.0              
#> [121] rlang_1.1.4                 htmlwidgets_1.6.4          
#> [123] UCSC.utils_1.2.0            shiny_1.9.1                
#> [125] DelayedMatrixStats_1.28.0   jquerylib_0.1.4            
#> [127] zoo_1.8-12                  jsonlite_1.8.9             
#> [129] BiocParallel_1.40.0         BiocSingular_1.22.0        
#> [131] RCurl_1.98-1.16             magrittr_2.0.3             
#> [133] Formula_1.2-5               scuttle_1.16.0             
#> [135] GenomeInfoDbData_1.2.13     munsell_0.5.1              
#> [137] Rcpp_1.0.13                 ape_5.8                    
#> [139] viridis_0.6.5               stringi_1.8.4              
#> [141] RJSONIO_1.3-1.9             zlibbioc_1.52.0            
#> [143] MASS_7.3-61                 AnnotationHub_3.14.0       
#> [145] plyr_1.8.9                  mediation_4.5.0            
#> [147] parallel_4.4.1              ggrepel_0.9.6              
#> [149] splines_4.4.1               hms_1.1.3                  
#> [151] ps_1.8.1                    igraph_2.1.1               
#> [153] reshape2_1.4.4              ScaledMatrix_1.14.0        
#> [155] futile.options_1.0.1        BiocVersion_3.20.0         
#> [157] XML_3.99-0.17               evaluate_1.0.1             
#> [159] RcppParallel_5.1.9          lambda.r_1.2.4             
#> [161] BiocManager_1.30.25         nloptr_2.1.1               
#> [163] tzdb_0.4.0                  httpuv_1.6.15              
#> [165] rols_3.2.0                  tidyr_1.3.1                
#> [167] purrr_1.0.2                 ggplot2_3.5.1              
#> [169] BiocBaseUtils_1.8.0         rsvd_1.0.5                 
#> [171] xtable_1.8-4                restfulr_0.0.15            
#> [173] tidytree_0.4.6              later_1.3.2                
#> [175] viridisLite_0.4.2           tibble_3.2.1               
#> [177] websocket_1.4.2             GenomicAlignments_1.42.0   
#> [179] memoise_2.0.1               beeswarm_0.4.0             
#> [181] AnnotationDbi_1.68.0        cluster_2.1.6              
#> [183] timechange_0.3.0            mia_1.14.0