Converting Common Data Formats to Phyloseq and TreeSummarizedExperiment
Source:vignettes/data_import.Rmd
data_import.Rmd
The “dar” package is a versatile and user-friendly tool designed to
accept inputs in a variety of formats. It primarily utilizes the
phyloseq
format but also supports the
TreeSummarizedExperiment
format. This flexibility allows
users to conduct differential abundance analysis smoothly, irrespective
of their initial data format. To facilitate this, a detailed guide is
available to aid users in converting other prevalent data formats, such
as biome
, mothur
, metaphlan
, and
more, into the necessary phyloseq
or
TreeSummarizedExperiment
formats.
Importing Data from biome
Format
The biome
format is a commonly used format in
bioinformatics to represent microbiome sequencing data. Here’s how you
can import data in biome
format to both
phyloseq
and TreeSummarizedExperiment.
To Phyloseq
To convert data from the biome
format to the
phyloseq
format, you can use the
phyloseq::import_biom()
function. Here’s a step-by-step
example of how to perform this conversion:
# Example of a rich dense biom file
rich_dense_biom <-
system.file("extdata", "rich_dense_otu_table.biom", package = "phyloseq")
# Import biom as a phyloseq-class object
phy <- phyloseq::import_biom(
rich_dense_biom,
parseFunction = parse_taxonomy_greengenes
)
phy
#> phyloseq-class experiment-level object
#> otu_table() OTU Table: [ 5 taxa and 6 samples ]
#> sample_data() Sample Data: [ 6 samples by 4 sample variables ]
#> tax_table() Taxonomy Table: [ 5 taxa by 7 taxonomic ranks ]
# Print sample_data
phyloseq::sample_data(phy)
#> BarcodeSequence LinkerPrimerSequence BODY_SITE Description
#> Sample1 CGCTTATCGAGA CATGCTGCCTCCCGTAGGAGT gut human gut
#> Sample2 CATACCAGTAGC CATGCTGCCTCCCGTAGGAGT gut human gut
#> Sample3 CTCTCTACCTGT CATGCTGCCTCCCGTAGGAGT gut human gut
#> Sample4 CTCTCGGCCTGT CATGCTGCCTCCCGTAGGAGT skin human skin
#> Sample5 CTCTCTACCAAT CATGCTGCCTCCCGTAGGAGT skin human skin
#> Sample6 CTAACTACCAAT CATGCTGCCTCCCGTAGGAGT skin human skin
# Print tax_table
phyloseq::tax_table(phy)
#> Taxonomy Table: [5 taxa by 7 taxonomic ranks]:
#> Kingdom Phylum Class Order
#> GG_OTU_1 "Bacteria" "Proteobacteria" "Gammaproteobacteria" "Enterobacteriales"
#> GG_OTU_2 "Bacteria" "Cyanobacteria" "Nostocophycideae" "Nostocales"
#> GG_OTU_3 "Archaea" "Euryarchaeota" "Methanomicrobia" "Methanosarcinales"
#> GG_OTU_4 "Bacteria" "Firmicutes" "Clostridia" "Halanaerobiales"
#> GG_OTU_5 "Bacteria" "Proteobacteria" "Gammaproteobacteria" "Enterobacteriales"
#> Family Genus Species
#> GG_OTU_1 "Enterobacteriaceae" "Escherichia" NA
#> GG_OTU_2 "Nostocaceae" "Dolichospermum" NA
#> GG_OTU_3 "Methanosarcinaceae" "Methanosarcina" NA
#> GG_OTU_4 "Halanaerobiaceae" "Halanaerobium" "Halanaerobiumsaccharolyticum"
#> GG_OTU_5 "Enterobacteriaceae" "Escherichia" NA
# Recipe init
rec <- dar::recipe(phy, var_info = "BODY_SITE", tax_info = "Genus")
rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#>
#> ℹ phyloseq object with 5 taxa and 6 samples
#> ℹ variable of interes BODY_SITE (class: character, levels: gut, skin)
#> ℹ taxonomic level Genus
To TreeSummarizedExperiment
To convert data from the biome
format to the
TreeSummarizedExperiment
format, you can use the
mia::importBIOM()
function. Here’s a step-by-step example
of how to perform this conversion:
# Example of a rich dense biom file
rich_dense_biom <-
system.file("extdata", "rich_dense_otu_table.biom", package = "phyloseq")
# Import biom as a phyloseq-class object
tse <- mia::importBIOM(rich_dense_biom)
tse
#> class: TreeSummarizedExperiment
#> dim: 5 6
#> metadata(0):
#> assays(1): counts
#> rownames(5): GG_OTU_1 GG_OTU_2 GG_OTU_3 GG_OTU_4 GG_OTU_5
#> rowData names(7): taxonomy1 taxonomy2 ... taxonomy6 taxonomy7
#> colnames(6): Sample1 Sample2 ... Sample5 Sample6
#> colData names(4): BarcodeSequence LinkerPrimerSequence BODY_SITE
#> Description
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: NULL
#> rowTree: NULL
#> colLinks: NULL
#> colTree: NULL
# Print sample_data
colData(tse)
#> DataFrame with 6 rows and 4 columns
#> BarcodeSequence LinkerPrimerSequence BODY_SITE Description
#> <character> <character> <character> <character>
#> Sample1 CGCTTATCGAGA CATGCTGCCTCCCGTAGGAGT gut human gut
#> Sample2 CATACCAGTAGC CATGCTGCCTCCCGTAGGAGT gut human gut
#> Sample3 CTCTCTACCTGT CATGCTGCCTCCCGTAGGAGT gut human gut
#> Sample4 CTCTCGGCCTGT CATGCTGCCTCCCGTAGGAGT skin human skin
#> Sample5 CTCTCTACCAAT CATGCTGCCTCCCGTAGGAGT skin human skin
#> Sample6 CTAACTACCAAT CATGCTGCCTCCCGTAGGAGT skin human skin
# Print tax_table
rowData(tse)
#> DataFrame with 5 rows and 7 columns
#> taxonomy1 taxonomy2 taxonomy3
#> <character> <character> <character>
#> GG_OTU_1 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#> GG_OTU_2 k__Bacteria p__Cyanobacteria c__Nostocophycideae
#> GG_OTU_3 k__Archaea p__Euryarchaeota c__Methanomicrobia
#> GG_OTU_4 k__Bacteria p__Firmicutes c__Clostridia
#> GG_OTU_5 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#> taxonomy4 taxonomy5 taxonomy6
#> <character> <character> <character>
#> GG_OTU_1 o__Enterobacteriales f__Enterobacteriaceae g__Escherichia
#> GG_OTU_2 o__Nostocales f__Nostocaceae g__Dolichospermum
#> GG_OTU_3 o__Methanosarcinales f__Methanosarcinaceae g__Methanosarcina
#> GG_OTU_4 o__Halanaerobiales f__Halanaerobiaceae g__Halanaerobium
#> GG_OTU_5 o__Enterobacteriales f__Enterobacteriaceae g__Escherichia
#> taxonomy7
#> <character>
#> GG_OTU_1 s__
#> GG_OTU_2 s__
#> GG_OTU_3 s__
#> GG_OTU_4 s__Halanaerobiumsacc..
#> GG_OTU_5 s__
# Change the column names of the tax_table
colnames(rowData(tse)) <-
c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")
rowData(tse)
#> DataFrame with 5 rows and 7 columns
#> Kingdom Phylum Class
#> <character> <character> <character>
#> GG_OTU_1 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#> GG_OTU_2 k__Bacteria p__Cyanobacteria c__Nostocophycideae
#> GG_OTU_3 k__Archaea p__Euryarchaeota c__Methanomicrobia
#> GG_OTU_4 k__Bacteria p__Firmicutes c__Clostridia
#> GG_OTU_5 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#> Order Family Genus
#> <character> <character> <character>
#> GG_OTU_1 o__Enterobacteriales f__Enterobacteriaceae g__Escherichia
#> GG_OTU_2 o__Nostocales f__Nostocaceae g__Dolichospermum
#> GG_OTU_3 o__Methanosarcinales f__Methanosarcinaceae g__Methanosarcina
#> GG_OTU_4 o__Halanaerobiales f__Halanaerobiaceae g__Halanaerobium
#> GG_OTU_5 o__Enterobacteriales f__Enterobacteriaceae g__Escherichia
#> Species
#> <character>
#> GG_OTU_1 s__
#> GG_OTU_2 s__
#> GG_OTU_3 s__
#> GG_OTU_4 s__Halanaerobiumsacc..
#> GG_OTU_5 s__
# Recipe init
rec <- dar::recipe(tse, var_info = "BODY_SITE", tax_info = "Genus")
rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#>
#> ℹ phyloseq object with 5 taxa and 6 samples
#> ℹ variable of interes BODY_SITE (class: character, levels: gut, skin)
#> ℹ taxonomic level Genus
Importing Data from qiime
Format
The qiime
format is another commonly used format in
bioinformatics for microbiome sequencing data. Here’s how you can import
data in qiime
format to both Phyloseq
and
TreeSummarizedExperiment.
To Phyloseq
To convert data from the qiime
format to the
Phyloseq
format, you can use the
phyloseq::import_qiime()
function. Here’s a step-by-step
example of how to perform this conversion:
# Import QIIME data
phy_qiime <- phyloseq::import_qiime(
otufilename = system.file("extdata", "GP_otu_table_rand_short.txt.gz", package = "phyloseq"),
mapfilename = system.file("extdata", "master_map.txt", package = "phyloseq"),
treefilename = system.file("extdata", "GP_tree_rand_short.newick.gz", package = "phyloseq")
)
#> Processing map file...
#> Processing otu/tax file...
#> Reading file into memory prior to parsing...
#> Detecting first header line...
#> Header is on line 2
#> Converting input file to a table...
#> Defining OTU table...
#> Parsing taxonomy table...
#> Processing phylogenetic tree...
#> /__w/_temp/Library/phyloseq/extdata/GP_tree_rand_short.newick.gz ...
phy_qiime
#> phyloseq-class experiment-level object
#> otu_table() OTU Table: [ 500 taxa and 26 samples ]
#> sample_data() Sample Data: [ 26 samples by 7 sample variables ]
#> tax_table() Taxonomy Table: [ 500 taxa by 7 taxonomic ranks ]
#> phy_tree() Phylogenetic Tree: [ 500 tips and 499 internal nodes ]
# Recipe init
rec <- dar::recipe(phy_qiime, var_info = "SampleType", tax_info = "Genus")
rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#>
#> ℹ phyloseq object with 500 taxa and 26 samples
#> ℹ variable of interes SampleType (class: character, levels: Feces, Freshwater, Freshwater (creek), Mock, Ocean, Sediment (estuary), Skin, Soil, Tongue)
#> ℹ taxonomic level Genus
To TreeSummarizedExperiment
To convert data from the qiime
format to the
TreeSummarizedExperiment
format, you can use the
mia::importQIIME2()
function. Here’s a step-by-step example
of how to perform this conversion:
# Import QIIME data to tse
tse_qiime <- mia::importQIIME2(
featureTableFile = system.file("extdata", "table.qza", package = "mia"),
taxonomyTableFile = system.file("extdata", "taxonomy.qza", package = "mia"),
sampleMetaFile = system.file("extdata", "sample-metadata.tsv", package = "mia"),
refSeqFile = system.file("extdata", "refseq.qza", package = "mia"),
phyTreeFile = system.file("extdata", "tree.qza", package = "mia")
)
tse_qiime
#> class: TreeSummarizedExperiment
#> dim: 770 34
#> metadata(0):
#> assays(1): counts
#> rownames(770): 4b5eeb300368260019c1fbc7a3c718fc
#> fe30ff0f71a38a39cf1717ec2be3a2fc ... 98d250a339a635f20e26397dafc6ced3
#> 1830c14ead81ad012f1db0e12f8ab6a4
#> rowData names(8): kingdom phylum ... species Confidence
#> colnames(34): L1S8 L1S57 ... L6S68 L6S93
#> colData names(9): sample.id barcode.sequence ...
#> reported.antibiotic.usage days.since.experiment.start
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: a LinkDataFrame (770 rows)
#> rowTree: 1 phylo tree(s) (770 leaves)
#> colLinks: NULL
#> colTree: NULL
#> referenceSeq: a DNAStringSet (770 sequences)
# Recipe init
rec <- dar::recipe(tse_qiime, var_info = "body.site", tax_info = "genus")
rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#>
#> ℹ phyloseq object with 770 taxa and 34 samples
#> ℹ variable of interes body.site (class: character, levels: gut, left palm, right palm, tongue)
#> ℹ taxonomic level genus
Importing Data from mothur
Format
The mothur
format is another commonly used format in
bioinformatics for microbiome sequencing data. Here’s how you can import
data in mothur
format to both Phyloseq
and
TreeSummarizedExperiment.
To Phyloseq
To convert data from the mothur
format to the
Phyloseq
format, you can use the
phyloseq::import_mothur()
function. Here’s a step-by-step
example of how to perform this conversion:
# Import Mothur data
phy_mothur <- phyloseq::import_mothur(
mothur_list_file = system.file("extdata", "esophagus.fn.list.gz", package = "phyloseq"),
mothur_group_file = system.file("extdata", "esophagus.good.groups.gz", package = "phyloseq"),
mothur_tree_file = system.file("extdata", "esophagus.tree.gz", package = "phyloseq")
)
phy_mothur
#> phyloseq-class experiment-level object
#> otu_table() OTU Table: [ 591 taxa and 3 samples ]
#> phy_tree() Phylogenetic Tree: [ 591 tips and 590 internal nodes ]
# Recipe init
rec <- dar::recipe(phy_mothur)
rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#>
#> ℹ phyloseq object with 591 taxa and 3 samples
#> ✖ undefined variable of interest. Use add_var() to add it to Recipe!
#> ✖ undefined taxonomic level. Use add_tax() to add it to Recipe!
To TreeSummarizedExperiment
To convert data from the mothur
format to the
TreeSummarizedExperiment
format, you can use the
mia::importMothur()
function. Here’s a step-by-step example
of how to perform this conversion:
# Import Mothur data to TreeSummarizedExperiment
tse_mothur <- mia::importMothur(
sharedFile = system.file("extdata", "mothur_example.shared", package = "mia"),
taxonomyFile = system.file("extdata", "mothur_example.cons.taxonomy", package = "mia"),
designFile = system.file("extdata", "mothur_example.design", package = "mia")
) |> methods::as("TreeSummarizedExperiment")
tse_mothur
#> class: TreeSummarizedExperiment
#> dim: 100 100
#> metadata(0):
#> assays(1): counts
#> rownames(100): Otu001 Otu002 ... Otu099 Otu100
#> rowData names(8): OTU Size ... Family Genus
#> colnames(100): Sample1 Sample2 ... Sample99 Sample100
#> colData names(7): group sex ... numOtus Group
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: NULL
#> rowTree: NULL
#> colLinks: NULL
#> colTree: NULL
# Recipe init
rec <- dar::recipe(tse_mothur, var_info = "drug", tax_info = "Genus")
rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#>
#> ℹ phyloseq object with 100 taxa and 100 samples
#> ℹ variable of interes drug (class: character, levels: A, B)
#> ℹ taxonomic level Genus
Importing Data from metaphlan
Format
The metaphlan
format is another commonly used format in
bioinformatics for microbiome sequencing data. Here’s how you can import
data in metaphlan
format to
TreeSummarizedExperiment.
To TreeSummarizedExperiment
To convert data from the metaphlan
format to the
TreeSummarizedExperiment
format, you can use the
mia::importMetaPhlAn()
function. Here’s a step-by-step
example of how to perform this conversion:
# Importing data from Metaphlan
tse_metaphlan <- mia::importMetaPhlAn(
file = system.file("extdata", "merged_abundance_table.txt", package = "mia")
)
# Recipe init
tse_metaphlan <- TreeSummarizedExperiment::TreeSummarizedExperiment(
assays = list(counts = SummarizedExperiment::assay(tse_metaphlan)),
rowData = SummarizedExperiment::rowData(tse_metaphlan),
colData = SummarizedExperiment::colData(tse_metaphlan) |>
as.data.frame() |>
dplyr::mutate(condition = rep(c("A", "B"), times = 3))
)
rec <- dar::recipe(tse_metaphlan, var_info = "condition", tax_info = "Genus")
rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#>
#> ℹ phyloseq object with 16 taxa and 6 samples
#> ℹ variable of interes condition (class: character, levels: A, B)
#> ℹ taxonomic level Genus
Conclusion
In this guide, we have explored various methods for importing
microbiome sequencing data from different formats into
Phyloseq
and TreeSummarizedExperiment.
We’ve
covered the biome
, qiime
, mothur
,
metaphlan
, and humann
formats, providing
step-by-step examples for each.
The flexibility of these tools allows for a smooth transition between different data formats, making it easier to conduct your analysis irrespective of the initial data format. By following the steps outlined in this guide, you should be able to successfully convert your data and carry out further differential abundance analysis.
Remember, the specific details of your data may require you to adjust the parameters in the import functions. Always inspect your data after conversion to ensure it has been imported correctly.
Session info
devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#> setting value
#> version R version 4.4.1 (2024-06-14)
#> os Ubuntu 22.04.5 LTS
#> system x86_64, linux-gnu
#> ui X11
#> language en
#> collate en_US.UTF-8
#> ctype en_US.UTF-8
#> tz UTC
#> date 2024-10-16
#> pandoc 3.4 @ /usr/bin/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> abind 1.4-8 2024-09-12 [1] RSPM (R 4.4.0)
#> ade4 1.7-22 2023-02-06 [1] RSPM (R 4.4.0)
#> ape 5.8 2024-04-11 [1] RSPM (R 4.4.0)
#> assertthat 0.2.1 2019-03-21 [1] RSPM (R 4.4.0)
#> backports 1.5.0 2024-05-23 [1] RSPM (R 4.4.0)
#> base64enc 0.1-3 2015-07-28 [2] RSPM (R 4.4.0)
#> beachmat 2.21.6 2024-09-05 [1] Bioconductor 3.20 (R 4.4.1)
#> beeswarm 0.4.0 2021-06-01 [1] RSPM (R 4.4.0)
#> Biobase * 2.65.1 2024-08-28 [1] Bioconductor 3.20 (R 4.4.1)
#> BiocGenerics * 0.51.3 2024-10-02 [1] Bioconductor 3.20 (R 4.4.1)
#> BiocNeighbors 1.99.2 2024-10-07 [1] Bioconductor 3.20 (R 4.4.1)
#> BiocParallel 1.39.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> BiocSingular 1.21.4 2024-09-22 [1] Bioconductor 3.20 (R 4.4.1)
#> biomformat 1.33.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> Biostrings * 2.73.2 2024-09-26 [1] Bioconductor 3.20 (R 4.4.1)
#> bluster 1.15.1 2024-09-06 [1] Bioconductor 3.20 (R 4.4.1)
#> boot 1.3-31 2024-08-28 [2] RSPM (R 4.4.0)
#> bslib 0.8.0 2024-07-29 [2] RSPM (R 4.4.0)
#> ca 0.71.1 2020-01-24 [1] RSPM (R 4.4.0)
#> cachem 1.1.0 2024-05-16 [2] RSPM (R 4.4.0)
#> checkmate 2.3.2 2024-07-29 [1] RSPM (R 4.4.0)
#> cli 3.6.3 2024-06-21 [2] RSPM (R 4.4.0)
#> cluster 2.1.6 2023-12-01 [3] CRAN (R 4.4.1)
#> codetools 0.2-20 2024-03-31 [3] CRAN (R 4.4.1)
#> colorspace 2.1-1 2024-07-26 [1] RSPM (R 4.4.0)
#> crayon 1.5.3 2024-06-20 [2] RSPM (R 4.4.0)
#> dar 1.1.2 2024-10-16 [1] Bioconductor
#> data.table 1.16.2 2024-10-10 [1] RSPM (R 4.4.0)
#> DBI 1.2.3 2024-06-02 [1] RSPM (R 4.4.0)
#> DECIPHER 3.1.4 2024-06-12 [1] Bioconductor 3.20 (R 4.4.0)
#> decontam 1.25.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> DelayedArray 0.31.14 2024-10-03 [1] Bioconductor 3.20 (R 4.4.1)
#> DelayedMatrixStats 1.27.3 2024-08-08 [1] Bioconductor 3.20 (R 4.4.1)
#> dendextend 1.18.1 2024-10-13 [1] RSPM (R 4.4.0)
#> desc 1.4.3 2023-12-10 [2] RSPM (R 4.4.0)
#> devtools 2.4.5 2022-10-11 [2] RSPM (R 4.4.0)
#> digest 0.6.37 2024-08-19 [2] RSPM (R 4.4.0)
#> DirichletMultinomial 1.47.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> dplyr 1.1.4 2023-11-17 [1] RSPM (R 4.4.0)
#> ellipsis 0.3.2 2021-04-29 [2] RSPM (R 4.4.0)
#> evaluate 1.0.1 2024-10-10 [2] RSPM (R 4.4.0)
#> fansi 1.0.6 2023-12-08 [2] RSPM (R 4.4.0)
#> fastmap 1.2.0 2024-05-15 [2] RSPM (R 4.4.0)
#> foreach 1.5.2 2022-02-02 [1] RSPM (R 4.4.0)
#> foreign 0.8-87 2024-06-26 [2] RSPM (R 4.4.0)
#> Formula 1.2-5 2023-02-24 [1] RSPM (R 4.4.0)
#> fs 1.6.4 2024-04-25 [2] RSPM (R 4.4.0)
#> generics 0.1.3 2022-07-05 [1] RSPM (R 4.4.0)
#> GenomeInfoDb * 1.41.2 2024-10-02 [1] Bioconductor 3.20 (R 4.4.1)
#> GenomeInfoDbData 1.2.13 2024-10-16 [1] Bioconductor
#> GenomicRanges * 1.57.2 2024-10-09 [1] Bioconductor 3.20 (R 4.4.1)
#> ggbeeswarm 0.7.2 2023-04-29 [1] RSPM (R 4.4.0)
#> ggplot2 3.5.1 2024-04-23 [1] RSPM (R 4.4.0)
#> ggrepel 0.9.6 2024-09-07 [1] RSPM (R 4.4.0)
#> glue 1.8.0 2024-09-30 [2] RSPM (R 4.4.0)
#> gridExtra 2.3 2017-09-09 [1] RSPM (R 4.4.0)
#> gtable 0.3.5 2024-04-22 [1] RSPM (R 4.4.0)
#> heatmaply 1.5.0 2023-10-06 [1] RSPM (R 4.4.0)
#> Hmisc 5.1-3 2024-05-28 [1] RSPM (R 4.4.0)
#> htmlTable 2.4.3 2024-07-21 [1] RSPM (R 4.4.0)
#> htmltools 0.5.8.1 2024-04-04 [2] RSPM (R 4.4.0)
#> htmlwidgets 1.6.4 2023-12-06 [2] RSPM (R 4.4.0)
#> httpuv 1.6.15 2024-03-26 [2] RSPM (R 4.4.0)
#> httr 1.4.7 2023-08-15 [1] RSPM (R 4.4.0)
#> igraph 2.0.3 2024-03-13 [1] RSPM (R 4.4.0)
#> IRanges * 2.39.2 2024-07-17 [1] Bioconductor 3.20 (R 4.4.1)
#> irlba 2.3.5.1 2022-10-03 [1] RSPM (R 4.4.0)
#> iterators 1.0.14 2022-02-05 [1] RSPM (R 4.4.0)
#> jquerylib 0.1.4 2021-04-26 [2] RSPM (R 4.4.0)
#> jsonlite 1.8.9 2024-09-20 [2] RSPM (R 4.4.0)
#> knitr 1.48 2024-07-07 [2] RSPM (R 4.4.0)
#> later 1.3.2 2023-12-06 [2] RSPM (R 4.4.0)
#> lattice 0.22-6 2024-03-20 [3] CRAN (R 4.4.1)
#> lazyeval 0.2.2 2019-03-15 [1] RSPM (R 4.4.0)
#> lifecycle 1.0.4 2023-11-07 [2] RSPM (R 4.4.0)
#> lme4 1.1-35.5 2024-07-03 [1] RSPM (R 4.4.0)
#> lpSolve 5.6.21 2024-09-12 [1] RSPM (R 4.4.0)
#> magrittr 2.0.3 2022-03-30 [2] RSPM (R 4.4.0)
#> MASS 7.3-61 2024-06-13 [2] RSPM (R 4.4.0)
#> Matrix 1.7-0 2024-04-26 [3] CRAN (R 4.4.1)
#> MatrixGenerics * 1.17.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> matrixStats * 1.4.1 2024-09-08 [1] RSPM (R 4.4.0)
#> mediation 4.5.0 2019-10-08 [1] RSPM (R 4.4.0)
#> memoise 2.0.1 2021-11-26 [2] RSPM (R 4.4.0)
#> mgcv 1.9-1 2023-12-21 [3] CRAN (R 4.4.1)
#> mia * 1.13.46 2024-10-09 [1] Bioconductor 3.20 (R 4.4.1)
#> mime 0.12 2021-09-28 [2] RSPM (R 4.4.0)
#> miniUI 0.1.1.1 2018-05-18 [2] RSPM (R 4.4.0)
#> minqa 1.2.8 2024-08-17 [1] RSPM (R 4.4.0)
#> MultiAssayExperiment * 1.31.5 2024-08-23 [1] Bioconductor 3.20 (R 4.4.1)
#> multtest 2.61.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> munsell 0.5.1 2024-04-01 [1] RSPM (R 4.4.0)
#> mvtnorm 1.3-1 2024-09-03 [1] RSPM (R 4.4.0)
#> nlme 3.1-166 2024-08-14 [2] RSPM (R 4.4.0)
#> nloptr 2.1.1 2024-06-25 [1] RSPM (R 4.4.0)
#> nnet 7.3-19 2023-05-03 [3] CRAN (R 4.4.1)
#> permute 0.9-7 2022-01-27 [1] RSPM (R 4.4.0)
#> phyloseq * 1.49.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> pillar 1.9.0 2023-03-22 [2] RSPM (R 4.4.0)
#> pkgbuild 1.4.4 2024-03-17 [2] RSPM (R 4.4.0)
#> pkgconfig 2.0.3 2019-09-22 [2] RSPM (R 4.4.0)
#> pkgdown 2.1.1.9000 2024-10-16 [1] Github (r-lib/pkgdown@71fd32c)
#> pkgload 1.4.0 2024-06-28 [2] RSPM (R 4.4.0)
#> plotly 4.10.4 2024-01-13 [1] RSPM (R 4.4.0)
#> plyr 1.8.9 2023-10-02 [1] RSPM (R 4.4.0)
#> profvis 0.4.0 2024-09-20 [2] RSPM (R 4.4.0)
#> promises 1.3.0 2024-04-05 [2] RSPM (R 4.4.0)
#> purrr 1.0.2 2023-08-10 [2] RSPM (R 4.4.0)
#> R6 2.5.1 2021-08-19 [2] RSPM (R 4.4.0)
#> ragg 1.3.3 2024-09-11 [2] RSPM (R 4.4.0)
#> rbiom 1.0.3 2021-11-05 [1] RSPM (R 4.4.0)
#> RColorBrewer 1.1-3 2022-04-03 [1] RSPM (R 4.4.0)
#> Rcpp 1.0.13 2024-07-17 [2] RSPM (R 4.4.0)
#> RcppParallel 5.1.9 2024-08-19 [1] RSPM (R 4.4.0)
#> registry 0.5-1 2019-03-05 [1] RSPM (R 4.4.0)
#> remotes 2.5.0 2024-03-17 [1] RSPM (R 4.4.0)
#> reshape2 1.4.4 2020-04-09 [1] RSPM (R 4.4.0)
#> rhdf5 2.49.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> rhdf5filters 1.17.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> Rhdf5lib 1.27.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> rlang 1.1.4 2024-06-04 [2] RSPM (R 4.4.0)
#> rmarkdown 2.28 2024-08-17 [2] RSPM (R 4.4.0)
#> rpart 4.1.23 2023-12-05 [3] CRAN (R 4.4.1)
#> rstudioapi 0.16.0 2024-03-24 [2] RSPM (R 4.4.0)
#> rsvd 1.0.5 2021-04-16 [1] RSPM (R 4.4.0)
#> S4Arrays 1.5.11 2024-10-14 [1] Bioconductor 3.20 (R 4.4.1)
#> S4Vectors * 0.43.2 2024-07-17 [1] Bioconductor 3.20 (R 4.4.1)
#> sandwich 3.1-1 2024-09-15 [1] RSPM (R 4.4.0)
#> sass 0.4.9 2024-03-15 [2] RSPM (R 4.4.0)
#> ScaledMatrix 1.13.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> scales 1.3.0 2023-11-28 [1] RSPM (R 4.4.0)
#> scater 1.33.4 2024-07-21 [1] Bioconductor 3.20 (R 4.4.1)
#> scuttle 1.15.4 2024-08-14 [1] Bioconductor 3.20 (R 4.4.1)
#> seriation 1.5.6 2024-08-19 [1] RSPM (R 4.4.0)
#> sessioninfo 1.2.2 2021-12-06 [2] RSPM (R 4.4.0)
#> shiny 1.9.1 2024-08-01 [2] RSPM (R 4.4.0)
#> SingleCellExperiment * 1.27.2 2024-05-24 [1] Bioconductor 3.20 (R 4.4.0)
#> slam 0.1-54 2024-10-15 [1] RSPM (R 4.4.0)
#> SparseArray 1.5.44 2024-10-06 [1] Bioconductor 3.20 (R 4.4.1)
#> sparseMatrixStats 1.17.2 2024-06-12 [1] Bioconductor 3.20 (R 4.4.0)
#> stringi 1.8.4 2024-05-06 [2] RSPM (R 4.4.0)
#> stringr 1.5.1 2023-11-14 [2] RSPM (R 4.4.0)
#> SummarizedExperiment * 1.35.4 2024-10-09 [1] Bioconductor 3.20 (R 4.4.1)
#> survival 3.7-0 2024-06-05 [2] RSPM (R 4.4.0)
#> systemfonts 1.1.0 2024-05-15 [2] RSPM (R 4.4.0)
#> textshaping 0.4.0 2024-05-24 [2] RSPM (R 4.4.0)
#> tibble 3.2.1 2023-03-20 [2] RSPM (R 4.4.0)
#> tidyr 1.3.1 2024-01-24 [1] RSPM (R 4.4.0)
#> tidyselect 1.2.1 2024-03-11 [1] RSPM (R 4.4.0)
#> tidytree 0.4.6 2023-12-12 [1] RSPM (R 4.4.0)
#> treeio 1.29.1 2024-08-18 [1] Bioconductor 3.20 (R 4.4.1)
#> TreeSummarizedExperiment * 2.13.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> TSP 1.2-4 2023-04-04 [1] RSPM (R 4.4.0)
#> UCSC.utils 1.1.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> UpSetR 1.4.0 2019-05-22 [1] RSPM (R 4.4.0)
#> urlchecker 1.0.1 2021-11-30 [2] RSPM (R 4.4.0)
#> usethis 3.0.0 2024-07-29 [2] RSPM (R 4.4.0)
#> utf8 1.2.4 2023-10-22 [2] RSPM (R 4.4.0)
#> vctrs 0.6.5 2023-12-01 [2] RSPM (R 4.4.0)
#> vegan 2.6-8 2024-08-28 [1] RSPM (R 4.4.0)
#> vipor 0.4.7 2023-12-18 [1] RSPM (R 4.4.0)
#> viridis 0.6.5 2024-01-29 [1] RSPM (R 4.4.0)
#> viridisLite 0.4.2 2023-05-02 [1] RSPM (R 4.4.0)
#> webshot 0.5.5 2023-06-26 [1] RSPM (R 4.4.0)
#> withr 3.0.1 2024-07-31 [2] RSPM (R 4.4.0)
#> xfun 0.48 2024-10-03 [2] RSPM (R 4.4.0)
#> xtable 1.8-4 2019-04-21 [2] RSPM (R 4.4.0)
#> XVector * 0.45.0 2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#> yaml 2.3.10 2024-07-26 [2] RSPM (R 4.4.0)
#> yulab.utils 0.1.7 2024-08-26 [1] RSPM (R 4.4.0)
#> zlibbioc 1.51.1 2024-06-05 [1] Bioconductor 3.20 (R 4.4.0)
#> zoo 1.8-12 2023-04-13 [1] RSPM (R 4.4.0)
#>
#> [1] /__w/_temp/Library
#> [2] /usr/local/lib/R/site-library
#> [3] /usr/local/lib/R/library
#>
#> ──────────────────────────────────────────────────────────────────────────────