The curatedMetagenomicData package provides standardized, curated human microbiome data for novel analyses. It includes gene families, marker abundance, marker presence, pathway abundance, pathway coverage, and relative abundance for samples collected from different body sites. The bacterial, fungal, and archaeal taxonomic abundances for each sample were calculated with MetaPhlAn3, and metabolic functional potential was calculated with HUMAnN3. The manually curated sample metadata and standardized metagenomic data are available as (Tree)SummarizedExperiment objects.
curatedMetagenomicData 3.17.4
curatedMetagenomicData providescuratedMetagenomicData provides processed data from whole-metagenome shotgun metagenomics, with manually-curated metadata, as integrated and documented Bioconductor TreeSummarizedExperiment objects or TSV flat text exports. It provides 6 types of data for each dataset:
relative_abundance)marker_presence)marker_abundance)gene_families)pathway_coverage)pathway_abundance)Types 1-3 are generated by MetaPhlAn3; 4-6 are generated by HUMAnN3 using the UniRef90 database.
Currently there are:
See:
To install curatedMetagenomicData from Bioconductor, use BiocManager as follows.
if (!require("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("curatedMetagenomicData")
Most users should simply install
curatedMetagenomicData from Bioconductor. Developers
may install the GitHub repository with remotes::install_github and the latest
Bioconductor development version.
To demonstrate the functionality of curatedMetagenomicData, the dplyr and DT packages are needed.
library(dplyr)
library(DT)
The curatedMetagenomicData package contains a data.frame,
sampleMetadata, of manually curated sample metadata to help users understand
the nature of studies and samples available prior to returning resources.
Beyond this, it serves two purposes: 1) to define study_name, which is used
with the curatedMetagenomicData() function to query and return resources, and
2) to define sample_id, which is used with the returnSamples() function to
return samples across studies.
To demonstrate, the first ten rows and columns (without any NA values) of
sampleMetadata for the AsnicarF_2017 study are shown in the table below.
sampleMetadata |>
filter(study_name == "AsnicarF_2017") |>
select(where(~ !any(is.na(.x)))) |>
slice(1:10) |>
select(1:10) |>
datatable(options = list(dom = "t"), extensions = "Responsive")
There are three main ways to access data resources in curatedMetagenomicData.
curatedMetagenomicData() function to search for and return resources.returnSamples() function to return samples across studies.curatedMetagenomicData()To access curated metagenomic data, users will use the curatedMetagenomicData() function both to query and return resources. The first argument pattern is a regular expression pattern to look for in the titles of resources available in curatedMetagenomicData; "" will return all resources. The title of each resource is a three part string with “.” as a delimiter – the fields are runDate, studyName, and dataType. The runDate is the date we created the resource and can mostly be ignored by users because if there is more than one date corresponding to a resource, the most recent one is selected automatically – it would be used if a specific runDate was needed.
Multiple resources can be queried or returned with a single call to curatedMetagenomicData(), but only the titles of resources are returned by default.
curatedMetagenomicData("AsnicarF_20.+")
## 2021-03-31.AsnicarF_2017.gene_families
## 2021-03-31.AsnicarF_2017.marker_abundance
## 2021-03-31.AsnicarF_2017.marker_presence
## 2021-03-31.AsnicarF_2017.pathway_abundance
## 2021-03-31.AsnicarF_2017.pathway_coverage
## 2021-03-31.AsnicarF_2017.relative_abundance
## 2021-10-14.AsnicarF_2017.gene_families
## 2021-10-14.AsnicarF_2017.marker_abundance
## 2021-10-14.AsnicarF_2017.marker_presence
## 2021-10-14.AsnicarF_2017.pathway_abundance
## 2021-10-14.AsnicarF_2017.pathway_coverage
## 2021-10-14.AsnicarF_2017.relative_abundance
## 2021-03-31.AsnicarF_2021.gene_families
## 2021-03-31.AsnicarF_2021.marker_abundance
## 2021-03-31.AsnicarF_2021.marker_presence
## 2021-03-31.AsnicarF_2021.pathway_abundance
## 2021-03-31.AsnicarF_2021.pathway_coverage
## 2021-03-31.AsnicarF_2021.relative_abundance
When the dryrun argument is set to FALSE, a list of SummarizedExperiment and/or TreeSummarizedExperiment objects is returned. The rownames argument determines the type of rownames to use for relative_abundance resources: either "long" (the default), "short" (species name), or "NCBI" (NCBI Taxonomy ID). When a single resource is requested, a single element list is returned.
curatedMetagenomicData("AsnicarF_2017.relative_abundance", dryrun = FALSE, rownames = "short")
## $`2021-10-14.AsnicarF_2017.relative_abundance`
## class: TreeSummarizedExperiment
## dim: 298 24
## metadata(0):
## assays(1): relative_abundance
## rownames(298): species:Escherichia coli species:Bifidobacterium bifidum
## ... species:Streptococcus gordonii species:Abiotrophia sp. HMSC24B09
## rowData names(7): superkingdom phylum ... genus species
## colnames(24): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... MV_MIM5_t2M14
## MV_MIM5_t3F15
## colData names(22): study_name subject_id ... pregnant lactating
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (298 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL
When the counts argument is set to TRUE, relative abundance proportions are multiplied by read depth and rounded to the nearest integer prior to being returned. Also, when multiple resources are requested, the list will contain named elements corresponding to each SummarizedExperiment and/or TreeSummarizedExperiment object.
curatedMetagenomicData("AsnicarF_20.+.relative_abundance", dryrun = FALSE, counts = TRUE, rownames = "short")
## $`2021-10-14.AsnicarF_2017.relative_abundance`
## class: TreeSummarizedExperiment
## dim: 298 24
## metadata(0):
## assays(1): relative_abundance
## rownames(298): species:Escherichia coli species:Bifidobacterium bifidum
## ... species:Streptococcus gordonii species:Abiotrophia sp. HMSC24B09
## rowData names(7): superkingdom phylum ... genus species
## colnames(24): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... MV_MIM5_t2M14
## MV_MIM5_t3F15
## colData names(22): study_name subject_id ... pregnant lactating
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (298 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL
##
## $`2021-03-31.AsnicarF_2021.relative_abundance`
## class: TreeSummarizedExperiment
## dim: 639 1098
## metadata(0):
## assays(1): relative_abundance
## rownames(639): species:Phocaeicola vulgatus species:Bacteroides
## stercoris ... species:Pyramidobacter sp. C12-8 species:Brevibacterium
## aurantiacum
## rowData names(7): superkingdom phylum ... genus species
## colnames(1098): SAMEA7041133 SAMEA7041134 ... SAMEA7045952 SAMEA7045953
## colData names(24): study_name subject_id ... BMI family
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (639 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL
mergeData()To merge the list elements returned from the curatedMetagenomicData() function into a single SummarizedExperiment or TreeSummarizedExperiment object, users will use the mergeData() function, provided elements are of the same dataType.
curatedMetagenomicData("AsnicarF_20.+.marker_abundance", dryrun = FALSE) |>
mergeData()
## class: SummarizedExperiment
## dim: 76639 1122
## metadata(0):
## assays(1): marker_abundance
## rownames(76639): 39491__A0A395UYA6__EUBREC_0408
## 39491__C4Z9E9__T1815_12341 ... 78448__A0A087CC86__BPULL_0419
## 356829__A0A087E8C8__BITS_5024
## rowData names(0):
## colnames(1122): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... SAMEA7045952
## SAMEA7045953
## colData names(26): study_name subject_id ... BMI family
The mergeData() function works for every dataType and will always return the appropriate data structure (a single SummarizedExperiment or TreeSummarizedExperiment object).
curatedMetagenomicData("AsnicarF_20.+.pathway_abundance", dryrun = FALSE) |>
mergeData()
## class: SummarizedExperiment
## dim: 16913 1122
## metadata(0):
## assays(1): pathway_abundance
## rownames(16913): UNMAPPED UNINTEGRATED ... PWY-6277: superpathway of
## 5-aminoimidazole ribonucleotide
## biosynthesis|g__Massiliomicrobiota.s__Massiliomicrobiota_timonensis
## PWY-6151: S-adenosyl-L-methionine cycle
## I|g__Massiliomicrobiota.s__Massiliomicrobiota_timonensis
## rowData names(0):
## colnames(1122): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... SAMEA7045952
## SAMEA7045953
## colData names(26): study_name subject_id ... BMI family
This is useful for analysis across entire studies (e.g. meta-analysis); however, when doing analysis across individual samples (e.g. mega-analysis) the returnSamples() function is preferable.
curatedMetagenomicData("AsnicarF_20.+.relative_abundance", dryrun = FALSE, rownames = "short") |>
mergeData()
## class: TreeSummarizedExperiment
## dim: 679 1122
## metadata(0):
## assays(1): relative_abundance
## rownames(679): species:Escherichia coli species:Bifidobacterium bifidum
## ... species:Pyramidobacter sp. C12-8 species:Brevibacterium
## aurantiacum
## rowData names(7): superkingdom phylum ... genus species
## colnames(1122): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... SAMEA7045952
## SAMEA7045953
## colData names(26): study_name subject_id ... BMI family
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (679 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL
returnSamples()The returnSamples() function takes the sampleMetadata data.frame subset to include only desired samples and metadata as input, and returns a single SummarizedExperiment or TreeSummarizedExperiment object that includes only desired samples and metadata. To use this function, filter rows and/or select columns of interest from the sampleMetadata data.frame, maintaining at least one row, and the sample_id and study_name columns. Then provide the subset data.frame as the first argument to the returnSamples() function.
The returnSamples() function requires a second argument dataType (either "gene_families", "marker_abundance", "marker_presence", "pathway_abundance", "pathway_coverage", or "relative_abundance") to be specified. It is often most convenient to subset the sampleMetadata data.frame using dplyr syntax.
sampleMetadata |>
filter(age >= 18) |>
filter(!is.na(alcohol)) |>
filter(body_site == "stool") |>
select(where(~ !all(is.na(.x)))) |>
returnSamples("relative_abundance", rownames = "short")
## class: TreeSummarizedExperiment
## dim: 832 702
## metadata(0):
## assays(1): relative_abundance
## rownames(832): species:Prevotella copri species:Prevotella sp. CAG:520
## ... species:Corynebacterium aurimucosum species:Corynebacterium
## coyleae
## rowData names(7): superkingdom phylum ... genus species
## colnames(702): JAS_1 JAS_10 ... YSZC12003_37879 YSZC12003_37880
## colData names(48): study_name subject_id ...
## age_twins_started_to_live_apart zigosity
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (832 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL
The counts and rownames arguments apply to returnSamples() as well, and can be passed the function. Finally, users should know that any arbitrary columns added to sampleMetadata will be present in the colData of the SummarizedExperiment or TreeSummarizedExperiment object that is returned.
To demonstrate the utility of curatedMetagenomicData, an example analysis is presented below. However, readers should know analysis is generally beyond the scope of curatedMetagenomicData and the analysis presented here is for demonstration alone. It is best to consider the output of curatedMetagenomicData as the input of analysis more than anything else.
library(OmicsMLRepoR)
library(mia)
library(scater)
library(vegan)
library(stringr)
library(lefser)
curatedMetagenomicData loads the metadata table, sampleMetadata. For further harmonized version of the sample-level metadata will be available in the future release of this package, and currently available through OmicsMLRepoR package.
cmd <- OmicsMLRepoR::getMetadata("cMD")
In this example, we will examine the association between current smoking status and fecal microbial composition across all relevant samples from curatedMetagenomicData. We will examine the alpha diversity (within subject diversity), beta diversity (between subject diversity), and differential abundant taxa.
First, as above, we use the returnSamples() function to return the relevant samples across all studies available in curatedMetagenomicData. We want healthy adults, whose smoking history is known, and only fecal samples. The select(where... line below removes metadata columns which are all NA values – they exist in another study but are all NA once subsetting has been done.
smoke <- cmd |>
filter(disease == "Healthy") |>
filter(age_group == "Adult") |>
filter(!is.na(smoker)) |>
filter(body_site == "feces") |>
select(where(~ !all(is.na(.x)))) # remove metadata columns which are all `NA` values
table(smoke$smoker, useNA = "ifany")
##
## Non-smoker (finding)
## 332
## Non-smoker (finding);Ex-smoker (finding)
## 94
## Non-smoker (finding);Never smoked tobacco (finding)
## 460
## Smoker (finding)
## 172
A new binary variable for smoking status, with levels Smoker and Never Smoker, is created to facilitate downstream analysis. The names of attributes are updated, so they will look nice in plots.
smoke <- smoke %>%
mutate(
smoker_bin = as.factor(
case_when(smoker == "Smoker (finding)" ~ "Smoker",
smoker != "Non-smoker (finding);Never smoked tobacco (finding)" ~ "Never Smoker",
)))
table(smoke$smoker_bin, useNA = "ifany")
##
## Never Smoker Smoker <NA>
## 426 172 460
Lastly, the "relative_abundance" dataType is requested because it contains the relevant information about microbial composition.
smoke_tse <- smoke %>% returnSamples("relative_abundance", rownames = "short")
## Removing samples with NA values for smoker_bin
smoke_tse <- smoke_tse[,!is.na(smoke_tse$smoker_bin)]
The agglomerateByRank unction from mia is used to sum up data based on associations with certain taxonomic ranks, as defined in rowData.
smoke_tse_genus <- agglomerateByRank(smoke_tse, rank = "genus")
Alpha diversity is a measure of the within sample diversity of features
(relative abundance proportions here) and seeks to quantify the evenness
(i.e. are the amounts of different microbes the same) and richness (i.e.
are they are large variety of microbial taxa present). The Shannon index
(H’) is a commonly used measure of alpha diversity, it’s estimated here
using the addAlpha() function from the mia package.
## Adding Shannon diversity values to colData
smoke_shannon <- smoke_tse_genus |>
addAlpha(assay.type = "relative_abundance", index = "shannon_diversity")
## Violin plots
title <- "Alpha Diversity by Smoking Status"
smoke_shannon |>
plotColData(x = "smoker_bin", y = "shannon_diversity", colour_by = "smoker_bin", shape_by = "smoker_bin") +
labs(x = "Smoking Status", y = "Alpha Diversity (H')") +
guides(colour = guide_legend(title = "Smoking Status"), shape = guide_legend(title = title)) +
theme(legend.position = "none")
Figure 1: Alpha Diversity - Shannon Index (H’)
A p-value < 0.01 and a W value > 0 indicate that the Never Smoker group
has higher alpha diversity compared to the Smoker group. This may serve
as basis for further investigation as to whether smoking can lead to gut
microbiome dysbiosis.
## Test if alpha diversity between smokers and non-smokers is significantly different
wilcox.test(shannon_diversity ~ smoker_bin, data = colData(smoke_shannon))
##
## Wilcoxon rank sum test with continuity correction
##
## data: shannon_diversity by smoker_bin
## W = 26768, p-value = 2.475e-07
## alternative hypothesis: true location shift is not equal to 0
Beta diversity is a measure of the between sample diversity of features (relative abundance proportions here) and seeks to quantify the magnitude of differences (or similarity) between every given pair of samples. Below it is assessed by Bray–Curtis Principal Coordinates Analysis (PCoA) and Uniform Manifold Approximation and Projection (UMAP).
To calculate pairwise Bray–Curtis distance for every sample in our study
we will use the runMDS() function from the scater package
along with the vegdist() function from the vegan package.
To quickly plot the results of beta diversity analysis,
the plotReducedDim() function from the scater package is
used along with ggplot2 syntax.
smoke_tse %>%
agglomerateByRanks() |>
runMDS(FUN = vegdist, method = "bray", exprs_values = "relative_abundance", altexp = "genus", name = "BrayCurtis") |>
plotReducedDim("BrayCurtis", colour_by = "smoker_bin", shape_by = "smoker_bin") +
labs(x = "PCo 1", y = "PCo 2") +
guides(colour = guide_legend(title = "Smoking Status"), shape = guide_legend(title = "Smoking Status")) +
theme(legend.position = c(0.80, 0.25))
Figure 2: Beta Diversity – Bray–Curtis PCoA
To calculate the UMAP coordinates of every sample in our study we will use
therunUMAP() function from the scater package package, as
it handles the task in a single line.
To quickly plot the results of beta diversity analysis, the plotReducedDim()
function from the scater package is used along with
ggplot2 syntax again.
smoke_tse %>%
agglomerateByRanks() |>
runUMAP(exprs_values = "relative_abundance", altexp = "genus", name = "UMAP") |>
plotReducedDim("UMAP", colour_by = "smoker_bin", shape_by = "smoker_bin") +
labs(x = "UMAP 1", y = "UMAP 2") +
guides(colour = guide_legend(title = "Smoking Status"), shape = guide_legend(title = "Smoking Status")) +
theme(legend.position = c(0.80, 0.55))
Next, we can identify taxa enriched in either the Smoker or Never Smoker
groups. An example approach for differential abundance is the LEfSe analysis,
which can be accomplished using lefser() and lefserPlot() from the
lefser package.
lefser(
relativeAb(smoke_tse_genus),
kruskal.threshold = 0.05,
wilcox.threshold = 0.05,
lda.threshold = 2,
classCol = "smoker_bin",
subclassCol = NULL,
assay = 1L,
trim.names = FALSE,
checkAbundances = TRUE
) %>%
lefserPlot()
## The outcome variable is specified as 'smoker_bin' and the reference category is 'Never Smoker'.
## See `?factor` or `?relevel` to change the reference category.
## Using palette: colorblind
## Warning in geom_bar(stat = "identity", aes(fill = class), color = "black", :
## Ignoring unknown parameters: `size`
Finally, the curatedMetagenomicData package previously had functions for conversion to phyloseq class objects, and they have been removed. It is likely that some users will still want to do analysis using phyloseq, and we would like to help them do so – it is just easier if we don’t have to maintain the conversion function ourselves. As such, the mia package has a function, makePhyloseqFromTreeSummarizedExperiment, that will readily do the conversion – users needing this functionality are advised to use it.
convertToPhyloseq(alcoholStudy, assay.type = "relative_abundance")
## R version 4.5.1 Patched (2025-08-23 r88802)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.3 LTS
##
## Matrix products: default
## BLAS: /home/biocbuild/bbs-3.22-bioc/R/lib/libRblas.so
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0 LAPACK version 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] lefser_1.19.1 stringr_1.5.2
## [3] vegan_2.7-1 permute_0.9-8
## [5] scater_1.37.0 ggplot2_4.0.0
## [7] scuttle_1.19.0 mia_1.17.9
## [9] MultiAssayExperiment_1.35.9 OmicsMLRepoR_1.3.3
## [11] DT_0.34.0 dplyr_1.1.4
## [13] curatedMetagenomicData_3.17.4 TreeSummarizedExperiment_2.17.1
## [15] Biostrings_2.77.2 XVector_0.49.1
## [17] SingleCellExperiment_1.31.1 SummarizedExperiment_1.39.2
## [19] Biobase_2.69.1 GenomicRanges_1.61.5
## [21] Seqinfo_0.99.2 IRanges_2.43.5
## [23] S4Vectors_0.47.4 BiocGenerics_0.55.1
## [25] generics_0.1.4 MatrixGenerics_1.21.0
## [27] matrixStats_1.5.0 BiocStyle_2.37.1
##
## loaded via a namespace (and not attached):
## [1] splines_4.5.1 ggplotify_0.1.3
## [3] filelock_1.0.3 tibble_3.3.0
## [5] cellranger_1.1.0 DirichletMultinomial_1.51.0
## [7] lifecycle_1.0.4 httr2_1.2.1
## [9] vroom_1.6.6 lattice_0.22-7
## [11] MASS_7.3-65 crosstalk_1.2.2
## [13] magrittr_2.0.4 sass_0.4.10
## [15] rmarkdown_2.30 jquerylib_0.1.4
## [17] yaml_2.3.10 cowplot_1.2.0
## [19] DBI_1.2.3 RColorBrewer_1.1-3
## [21] multcomp_1.4-28 abind_1.4-8
## [23] purrr_1.1.0 fillpattern_1.0.2
## [25] yulab.utils_0.2.1 TH.data_1.1-4
## [27] rappdirs_0.3.3 sandwich_3.1-1
## [29] data.tree_1.2.0 ggrepel_0.9.6
## [31] irlba_2.3.5.1 rols_3.5.0
## [33] tidytree_0.4.6 testthat_3.2.3
## [35] rbiom_2.2.1 parallelly_1.45.1
## [37] DelayedMatrixStats_1.31.0 coin_1.4-3
## [39] codetools_0.2-20 DelayedArray_0.35.3
## [41] ggtext_0.1.2 xml2_1.4.0
## [43] tidyselect_1.2.1 aplot_0.2.9
## [45] farver_2.1.2 ScaledMatrix_1.17.0
## [47] viridis_0.6.5 BiocFileCache_2.99.6
## [49] jsonlite_2.0.0 BiocNeighbors_2.3.1
## [51] decontam_1.29.0 survival_3.8-3
## [53] emmeans_1.11.2-8 systemfonts_1.3.1
## [55] tools_4.5.1 ggnewscale_0.5.2
## [57] treeio_1.33.0 ragg_1.5.0
## [59] Rcpp_1.1.0 glue_1.8.0
## [61] gridExtra_2.3 SparseArray_1.9.1
## [63] BiocBaseUtils_1.11.2 xfun_0.53
## [65] mgcv_1.9-3 withr_3.0.2
## [67] BiocManager_1.30.26 fastmap_1.2.0
## [69] bluster_1.19.0 digest_0.6.37
## [71] rsvd_1.0.5 gridGraphics_0.5-1
## [73] R6_2.6.1 estimability_1.5.1
## [75] textshaping_1.0.3 dichromat_2.0-0.1
## [77] RSQLite_2.4.3 DiagrammeR_1.0.11
## [79] tidyr_1.3.1 DECIPHER_3.5.0
## [81] FNN_1.1.4.1 httr_1.4.7
## [83] htmlwidgets_1.6.4 S4Arrays_1.9.1
## [85] uwot_0.2.3 pkgconfig_2.0.3
## [87] gtable_0.3.6 modeltools_0.2-24
## [89] blob_1.2.4 S7_0.2.0
## [91] brio_1.1.5 htmltools_0.5.8.1
## [93] bookdown_0.44 scales_1.4.0
## [95] png_0.1-8 ggfun_0.2.0
## [97] knitr_1.50 uuid_1.2-1
## [99] tzdb_0.5.0 reshape2_1.4.4
## [101] coda_0.19-4.1 visNetwork_2.1.4
## [103] nlme_3.1-168 curl_7.0.0
## [105] cachem_1.1.0 zoo_1.8-14
## [107] BiocVersion_3.22.0 libcoin_1.0-10
## [109] parallel_4.5.1 vipor_0.4.7
## [111] AnnotationDbi_1.71.1 pillar_1.11.1
## [113] grid_4.5.1 vctrs_0.6.5
## [115] slam_0.1-55 BiocSingular_1.25.0
## [117] dbplyr_2.5.1 beachmat_2.25.5
## [119] xtable_1.8-4 cluster_2.1.8.1
## [121] archive_1.1.12 beeswarm_0.4.0
## [123] evaluate_1.0.5 magick_2.9.0
## [125] tinytex_0.57 readr_2.1.5
## [127] mvtnorm_1.3-3 cli_3.6.5
## [129] compiler_4.5.1 rlang_1.1.6
## [131] crayon_1.5.3 labeling_0.4.3
## [133] plyr_1.8.9 fs_1.6.6
## [135] ggbeeswarm_0.7.2 ggiraph_0.9.1
## [137] stringi_1.8.7 viridisLite_0.4.2
## [139] BiocParallel_1.43.4 lazyeval_0.2.2
## [141] Matrix_1.7-4 ExperimentHub_2.99.5
## [143] hms_1.1.3 patchwork_1.3.2
## [145] sparseMatrixStats_1.21.0 bit64_4.6.0-1
## [147] KEGGREST_1.49.1 AnnotationHub_3.99.6
## [149] gridtext_0.1.5 igraph_2.1.4
## [151] memoise_2.0.1 bslib_0.9.0
## [153] ggtree_3.99.0 bit_4.6.0
## [155] readxl_1.4.5 ape_5.8-1