Contents

1 Installation

To install curatedMetagenomicData from Bioconductor, use BiocManager as follows.

BiocManager::install("curatedMetagenomicData")

To install curatedMetagenomicData from GitHub, use BiocManager as follows.

BiocManager::install("waldronlab/curatedMetagenomicData", dependencies = TRUE, build_vignettes = TRUE)

Most users should simply install curatedMetagenomicData from Bioconductor.

2 R Packages

To demonstrate the functionality of curatedMetagenomicData, the dplyr and DT packages are needed.

library(dplyr)
library(DT)

3 Sample Metadata

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() method to query and return resources, and 2) to define sample_id, which is used with the returnSamples() method 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")

4 Data Access

There are three main ways to access data resources in curatedMetagenomicData.

  1. The curatedMetagenomicData() function to search and return individual datasets
  2. The returnSamples() function to access merged datasets based on filtered metadata
  3. Through the command-line interface, curatedMetagenomicDataCLI, but it is not part of the Bioconductor package or discussed here.

4.1 curatedMetagenomicData()

To access curated metagenomic data, users will use the curatedMetagenomicData() method 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, but only a single copy of each resource exists as of this writing.

Multiple resources can be queried or returned with a single call to curatedMetagenomicData(), only the titles of resources are returned by default. The following search term is a regex that matches all six data types from all datasets starting with *AsnicarF_20*:

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-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

If you are more comfortable with wildcard-like searching, the following is equivalent:

glob2rx("*AsnicarF_20*") %>%
    curatedMetagenomicData()
## 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-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 second argument dryrun is set to FALSE, a list of SummarizedExperiment and/or TreeSummarizedExperiment objects is returned. When a single resource is requested, a single element list is returned.

curatedMetagenomicData("AsnicarF_2017.relative_abundance", dryrun = FALSE)
## $`2021-03-31.AsnicarF_2017.relative_abundance`
## class: TreeSummarizedExperiment 
## dim: 301 24 
## metadata(0):
## assays(1): relative_abundance
## rownames(301):
##   k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Escherichia|s__Escherichia_coli
##   k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_bifidum
##   ...
##   k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Streptococcaceae|g__Streptococcus|s__Streptococcus_gordonii
##   k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Aerococcaceae|g__Abiotrophia|s__Abiotrophia_sp_HMSC24B09
## rowData names(7): Kingdom Phylum ... Genus Species
## colnames(24): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... MV_MIM5_t2M14
##   MV_MIM5_t3F15
## colData names(22): study_name subject_id ... lactating curator
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (301 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL

When the third argument counts 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)
## $`2021-03-31.AsnicarF_2017.relative_abundance`
## class: TreeSummarizedExperiment 
## dim: 301 24 
## metadata(0):
## assays(1): relative_abundance
## rownames(301):
##   k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Escherichia|s__Escherichia_coli
##   k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_bifidum
##   ...
##   k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Streptococcaceae|g__Streptococcus|s__Streptococcus_gordonii
##   k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Aerococcaceae|g__Abiotrophia|s__Abiotrophia_sp_HMSC24B09
## rowData names(7): Kingdom Phylum ... Genus Species
## colnames(24): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... MV_MIM5_t2M14
##   MV_MIM5_t3F15
## colData names(22): study_name subject_id ... lactating curator
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (301 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):
##   k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides_vulgatus
##   k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides_stercoris
##   ...
##   k__Bacteria|p__Synergistetes|c__Synergistia|o__Synergistales|f__Synergistaceae|g__Pyramidobacter|s__Pyramidobacter_sp_C12_8
##   k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Micrococcales|f__Brevibacteriaceae|g__Brevibacterium|s__Brevibacterium_aurantiacum
## rowData names(7): Kingdom Phylum ... Genus Species
## colnames(1098): SAMEA7041133 SAMEA7041134 ... SAMEA7045952 SAMEA7045953
## colData names(21): study_name subject_id ... curator BMI
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (639 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL

If you are interested only in taxonomic relative abundance, include *relative_abundance* in your search term, like above or with searches like glob2rx(*AsnicarF_20*abundance).

4.1.1 mergeData()

To merge the list elements returned from the curatedMetagenomicData() method into a single SummarizedExperiment or TreeSummarizedExperiment object, users will use the mergeData() method, provided elements are the same dataType.

curatedMetagenomicData("AsnicarF_20.+.marker_abundance", dryrun = FALSE) %>%
    mergeData()
## class: SummarizedExperiment 
## dim: 76772 1122 
## metadata(0):
## assays(1): marker_abundance
## rownames(76772): 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(24): study_name subject_id ... antibiotics_current_use
##   BMI

The mergeData() method 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: 17155 1122 
## metadata(0):
## assays(1): pathway_abundance
## rownames(17155): 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(24): study_name subject_id ... antibiotics_current_use
##   BMI

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() method is preferable.

curatedMetagenomicData("AsnicarF_20.+.relative_abundance", dryrun = FALSE) %>%
    mergeData()
## class: TreeSummarizedExperiment 
## dim: 681 1122 
## metadata(0):
## assays(1): relative_abundance
## rownames(681):
##   k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Escherichia|s__Escherichia_coli
##   k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Bifidobacteriales|f__Bifidobacteriaceae|g__Bifidobacterium|s__Bifidobacterium_bifidum
##   ...
##   k__Bacteria|p__Synergistetes|c__Synergistia|o__Synergistales|f__Synergistaceae|g__Pyramidobacter|s__Pyramidobacter_sp_C12_8
##   k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Micrococcales|f__Brevibacteriaceae|g__Brevibacterium|s__Brevibacterium_aurantiacum
## rowData names(7): Kingdom Phylum ... Genus Species
## colnames(1122): MV_FEI1_t1Q14 MV_FEI2_t1Q14 ... SAMEA7045952
##   SAMEA7045953
## colData names(24): study_name subject_id ... antibiotics_current_use
##   BMI
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (681 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL

4.2 returnSamples()

The returnSamples() takes a subset of the sampleMetadata object as input, and returns a single SummarizedExperiment or TreeSummarizedExperiment containing one of curatedMetagenomicData’s data types, with this metadata subset as its colData. To use this method, filter/select rows and columns of interest from the sampleMetadata object, maintaining at least one row, and the sampleID and study_name columns. Provide the resulting data.frame as the first argument to the returnSamples() function.

The returnSamples() method requires a second argument dataType ("gene_families", "marker_abundance", "marker_presence", "pathway_abundance", "pathway_coverage", or "relative_abundance") 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")
## class: TreeSummarizedExperiment 
## dim: 833 702 
## metadata(0):
## assays(1): relative_abundance
## rownames(833):
##   k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Prevotellaceae|g__Prevotella|s__Prevotella_copri
##   k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Prevotellaceae|g__Prevotella|s__Prevotella_sp_CAG_520
##   ...
##   k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Corynebacteriales|f__Corynebacteriaceae|g__Corynebacterium|s__Corynebacterium_aurimucosum
##   k__Bacteria|p__Actinobacteria|c__Actinobacteria|o__Corynebacteriales|f__Corynebacteriaceae|g__Corynebacterium|s__Corynebacterium_coyleae
## rowData names(7): Kingdom Phylum ... Genus Species
## colnames(702): JAS_1 JAS_10 ... YSZC12003_37879 YSZC12003_37880
## colData names(46): study_name subject_id ...
##   age_twins_started_to_live_apart zigosity
## reducedDimNames(0):
## mainExpName: NULL
## altExpNames(0):
## rowLinks: a LinkDataFrame (833 rows)
## rowTree: 1 phylo tree(s) (10430 leaves)
## colLinks: NULL
## colTree: NULL

The counts argument applies to the returnSamples() method as well, and can be passed as the third argument. 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.

5 Example Analysis

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.

5.1 R Packages

To demonstrate the utility of curatedMetagenomicData, the stringr, mia, scater, and vegan packages are needed.

library(stringr)
library(mia)
library(scater)
library(vegan)

5.2 Prepare Data

In our hypothetical study, let’s examine the association of alcohol consumption and stool microbial composition across all annotated samples in curatedMetagenomicData. We will examine the alpha diversity (within subject diversity), beta diversity (between subject diversity), and conclude with a few notes on differential abundance analysis.

5.2.1 Return Samples

First, as above, we use the returnSamples() method to return the relevant samples across all studies available in curatedMetagenomicData. We want adults over the age of 18, for whom alcohol consumption status is known, and we want only stool samples. The select(where... line below simply removes metadata columns which are all NA values - they exist in another study but are all NA once subsetting has been done. Lastly, the "relative_abundance" dataType is requested because it contains the relevant information about microbial composition.

alcoholStudy <-
    filter(sampleMetadata, age >= 18) %>%
    filter(!is.na(alcohol)) %>%
    filter(body_site == "stool") %>%
    select(where(~ !all(is.na(.x)))) %>%
    returnSamples("relative_abundance")

5.2.2 Mutate colData

Most of the values in the sampleMetadata data.frame (which becomes colData) are in lower snake case (e.g. snake_case) and don’t look nice in plots. Here, the values of the alcohol variable are made into title case using stringr so they will look nice in plots.

colData(alcoholStudy) <-
    colData(alcoholStudy) %>%
    as.data.frame() %>%
    mutate(alcohol = str_replace_all(alcohol, "no", "No")) %>%
    mutate(alcohol = str_replace_all(alcohol, "yes", "Yes")) %>%
    DataFrame()

5.2.3 Agglomerate Ranks

Next, the splitByRanks method from mia is used to create alternative experiments for each level of the taxonomic tree (e.g. Genus). This allows for diversity and differential abundance analysis at specific taxonomic levels; with this step complete, our data is ready to analyze.

altExps(alcoholStudy) <-
    splitByRanks(alcoholStudy)

5.3 Alpha Diversity

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 estimateDiversity() method from the mia package.

To quickly plot the results of alpha diversity estimation, the plotColData() method from the scater package is used along with ggplot2 syntax.

alcoholStudy %>%
    estimateDiversity(abund_values = "relative_abundance", index = "shannon") %>%
    plotColData(x = "alcohol", y = "shannon", colour_by = "alcohol", shape_by = "alcohol") +
    labs(x = "Alcohol", y = "Alpha Diversity (H')") +
    guides(color = guide_none(), shape = guide_none()) +
    theme(legend.position = "none")
Alpha Diversity - Shannon Index (H')

Figure 1: Alpha Diversity - Shannon Index (H’)

The figure suggest that those who consume alcohol have higher Shannon alpha diversity than those who do not consume alcohol; however, the difference does not appear to be significant, at least qualitatively.

5.4 Beta Diversity

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 accessed by Bray–Curtis Principal Coordinates Analysis (PCoA), which is a linear method, and Uniform Manifold Approximation and Projection (UMAP), which is a non-linear method.

5.4.1 Bray–Curtis PCoA

To calculate pairwise Bray–Curtis distance for every sample in our study we will use the runMDS() method from the scater package along with the vegdist() method from the vegan package.

To quickly plot the results of beta diversity analysis, the plotReducedDim() method from the scater package is used along with ggplot2 syntax.

alcoholStudy %>%
    runMDS(FUN = vegdist, method = "bray", exprs_values = "relative_abundance", altexp = "Genus", name = "BrayCurtis") %>%
    plotReducedDim("BrayCurtis", colour_by = "alcohol", shape_by = "alcohol") +
    labs(x = "PCo 1", y = "PCo 2") +
    guides(colour = guide_legend(title = "Alcohol"), shape = guide_legend(title = "Alcohol")) +
    theme(legend.position = c(0.90, 0.85))
Beta Diversity - Bray–Curtis PCoA

Figure 2: Beta Diversity - Bray–Curtis PCoA

5.4.2 UMAP

To calculate the UMAP coordinates of every sample in our study we will use the runUMAP() method 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() method from the scater package is used along with ggplot2 syntax again.

alcoholStudy %>%
    runUMAP(exprs_values = "relative_abundance", altexp = "Genus", name = "UMAP") %>%
    plotReducedDim("UMAP", colour_by = "alcohol", shape_by = "alcohol") +
    labs(x = "UMAP 1", y = "UMAP 2") +
    guides(colour = guide_legend(title = "Alcohol"), shape = guide_legend(title = "Alcohol")) +
    theme(legend.position = c(0.90, 0.85))
Beta Diversity - UMAP (Uniform Manifold Approximation and Projection)

Figure 3: Beta Diversity - UMAP (Uniform Manifold Approximation and Projection)

5.5 Differential Abundance

Next, it would be desirable to establish which microbes are differentially abundant between the two groups (those who consume alcohol, and those who do not). The lefser and ANCOMBC packages feature excellent methods to perform this tasks; however, code is not included here to avoid including many Suggests packages - curatedMetagenomicData had far too many of these in the the previous version and is now very lean. There is a repository of analyses, curatedMetagenomicAnalyses, on GitHub and a forthcoming paper that will feature extensive demonstrations of analyses - but for now, the suggestions above will have to suffice.

6 Type Conversion

Finally, the curatedMetagenomicData package previously had methods for conversion to phyloseq class objects, and they have been removed in the latest release. 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 method ourselves. As such, the mia package has a method, makePhyloseqFromTreeSummarizedExperiment, that will readily do the conversion - users needing this functionality are advised to use it.

makePhyloseqFromTreeSummarizedExperiment(alcoholStudy, abund_values = "relative_abundance")

7 Session Info

utils::sessionInfo()
## R version 4.1.1 (2021-08-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
## 
## Matrix products: default
## BLAS:   /home/biocbuild/bbs-3.13-bioc/R/lib/libRblas.so
## LAPACK: /home/biocbuild/bbs-3.13-bioc/R/lib/libRlapack.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        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       
## 
## attached base packages:
## [1] parallel  stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] vegan_2.5-7                    lattice_0.20-45               
##  [3] permute_0.9-5                  scater_1.20.1                 
##  [5] ggplot2_3.3.5                  scuttle_1.2.1                 
##  [7] mia_1.0.8                      stringr_1.4.0                 
##  [9] DT_0.19                        dplyr_1.0.7                   
## [11] curatedMetagenomicData_3.0.10  TreeSummarizedExperiment_2.0.3
## [13] Biostrings_2.60.2              XVector_0.32.0                
## [15] SingleCellExperiment_1.14.1    SummarizedExperiment_1.22.0   
## [17] Biobase_2.52.0                 GenomicRanges_1.44.0          
## [19] GenomeInfoDb_1.28.4            IRanges_2.26.0                
## [21] S4Vectors_0.30.2               BiocGenerics_0.38.0           
## [23] MatrixGenerics_1.4.3           matrixStats_0.61.0            
## [25] BiocStyle_2.20.2              
## 
## loaded via a namespace (and not attached):
##   [1] AnnotationHub_3.0.1           BiocFileCache_2.0.0          
##   [3] plyr_1.8.6                    lazyeval_0.2.2               
##   [5] splines_4.1.1                 BiocParallel_1.26.2          
##   [7] crosstalk_1.1.1               digest_0.6.28                
##   [9] htmltools_0.5.2               magick_2.7.3                 
##  [11] viridis_0.6.1                 fansi_0.5.0                  
##  [13] magrittr_2.0.1                memoise_2.0.0                
##  [15] ScaledMatrix_1.0.0            cluster_2.1.2                
##  [17] DECIPHER_2.20.0               colorspace_2.0-2             
##  [19] blob_1.2.2                    rappdirs_0.3.3               
##  [21] xfun_0.26                     crayon_1.4.1                 
##  [23] RCurl_1.98-1.5                jsonlite_1.7.2               
##  [25] ape_5.5                       glue_1.4.2                   
##  [27] gtable_0.3.0                  zlibbioc_1.38.0              
##  [29] DelayedArray_0.18.0           BiocSingular_1.8.1           
##  [31] scales_1.1.1                  DBI_1.1.1                    
##  [33] Rcpp_1.0.7                    viridisLite_0.4.0            
##  [35] xtable_1.8-4                  decontam_1.12.0              
##  [37] tidytree_0.3.5                bit_4.0.4                    
##  [39] rsvd_1.0.5                    htmlwidgets_1.5.4            
##  [41] httr_1.4.2                    FNN_1.1.3                    
##  [43] ellipsis_0.3.2                pkgconfig_2.0.3              
##  [45] farver_2.1.0                  uwot_0.1.10                  
##  [47] sass_0.4.0                    dbplyr_2.1.1                 
##  [49] utf8_1.2.2                    tidyselect_1.1.1             
##  [51] labeling_0.4.2                rlang_0.4.11                 
##  [53] reshape2_1.4.4                later_1.3.0                  
##  [55] AnnotationDbi_1.54.1          munsell_0.5.0                
##  [57] BiocVersion_3.13.1            tools_4.1.1                  
##  [59] cachem_1.0.6                  DirichletMultinomial_1.34.0  
##  [61] generics_0.1.0                RSQLite_2.2.8                
##  [63] ExperimentHub_2.0.0           evaluate_0.14                
##  [65] fastmap_1.1.0                 yaml_2.2.1                   
##  [67] knitr_1.36                    bit64_4.0.5                  
##  [69] purrr_0.3.4                   KEGGREST_1.32.0              
##  [71] nlme_3.1-153                  sparseMatrixStats_1.4.2      
##  [73] mime_0.12                     compiler_4.1.1               
##  [75] beeswarm_0.4.0                filelock_1.0.2               
##  [77] curl_4.3.2                    png_0.1-7                    
##  [79] interactiveDisplayBase_1.30.0 treeio_1.16.2                
##  [81] tibble_3.1.5                  bslib_0.3.0                  
##  [83] stringi_1.7.5                 highr_0.9                    
##  [85] RSpectra_0.16-0               Matrix_1.3-4                 
##  [87] vctrs_0.3.8                   pillar_1.6.3                 
##  [89] lifecycle_1.0.1               BiocManager_1.30.16          
##  [91] jquerylib_0.1.4               BiocNeighbors_1.10.0         
##  [93] cowplot_1.1.1                 bitops_1.0-7                 
##  [95] irlba_2.3.3                   httpuv_1.6.3                 
##  [97] R6_2.5.1                      bookdown_0.24                
##  [99] promises_1.2.0.1              gridExtra_2.3                
## [101] vipor_0.4.5                   MASS_7.3-54                  
## [103] assertthat_0.2.1              withr_2.4.2                  
## [105] GenomeInfoDbData_1.2.6        mgcv_1.8-37                  
## [107] grid_4.1.1                    beachmat_2.8.1               
## [109] tidyr_1.1.4                   rmarkdown_2.11               
## [111] DelayedMatrixStats_1.14.3     shiny_1.7.1                  
## [113] ggbeeswarm_0.6.0