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
suppressPackageStartupMessages({
library(OmicsMLRepoR)
library(dplyr)
library(curatedMetagenomicData)
library(cBioPortalData)
})
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>, …
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"
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
tree_filter
is not case-sensitive.
nrow(cmd |> tree_filter(disease, "Colorectal Carcinoma"))
#> [1] 701
nrow(cmd |> tree_filter(disease, "colorectal carcinoma"))
#> [1] 701
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"
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"
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"))
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
cmd_dat <- cmd %>%
tree_filter(col = "disease", "Type 2 Diabetes Mellitus") %>%
filter(sex == "Female") %>%
filter(age_group == "Elderly") %>%
returnSamples("relative_abundance", rownames = "short")
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
}
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