• Analyses were carried out in a subset of subjects: subjects with samples taken for both subgingival and supragingival body subsites in the same visit. Only one visit was considered per subject.

  • All analyses were performed at the OTU level.

Data

dat_name <- 'HMP_2012_16S_gingival_V35'
conditions_col <- 'body_subsite'
conditions <- c(condB = 'subgingival_plaque', condA = 'supragingival_plaque')
tse <- getBenchmarkData(dat_name, dryrun = FALSE)[[1]]
tse
#> class: TreeSummarizedExperiment 
#> dim: 17949 311 
#> metadata(0):
#> assays(1): counts
#> rownames(17949): OTU_97.1 OTU_97.10 ... OTU_97.9991 OTU_97.9995
#> rowData names(7): superkingdom phylum ... genus taxon_annotation
#> colnames(311): 700103497 700106940 ... 700111586 700109119
#> colData names(15): dataset subject_id ... sequencing_method
#>   variable_region_16s
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: a LinkDataFrame (17949 rows)
#> rowTree: 1 phylo tree(s) (45364 leaves)
#> colLinks: NULL
#> colTree: NULL

Unique subjects:

col_data <- tse |> 
    colData() |> 
    as.data.frame() |> 
    tibble::rownames_to_column("sample_name") |> 
    as_tibble()
subjects <- col_data |> 
    pull(subject_id) |> 
    unique()
length(subjects)
#> [1] 132
sample_names <- vector("list", length(subjects))
names(sample_names) <- subjects
for (i in seq_along(subjects))  {
    current_subject <- subjects[i]
    sub_dat <- col_data |> 
        filter(subject_id == current_subject) |> 
        slice_max(order_by = visit_number, with_ties = TRUE, n = 1)
    if (nrow(sub_dat) != 2) {
        ## Only get subjects with samples from both subgingival and supragingival
        ## plaque taken in the same visit.
        next
    }
    lgl_vct <- all(sort(sub_dat[["body_subsite"]]) == conditions)
    if (isFALSE(lgl_vct)) {
        next
    }
    sample_names[[i]] <- sub_dat
}
sample_names <- discard(sample_names, is.null)
col_data_subset <- bind_rows(sample_names)
nrow(col_data_subset)
#> [1] 230

The number of female and male samples is still practically the same:

col_data_subset |> 
    count(gender, body_subsite)
#> # A tibble: 4 × 3
#>   gender body_subsite             n
#>   <chr>  <chr>                <int>
#> 1 female subgingival_plaque      59
#> 2 female supragingival_plaque    59
#> 3 male   subgingival_plaque      56
#> 4 male   supragingival_plaque    56

This is a subset of V35, but still is larger than the subset included in the MicrobiomeBenchmarkData package:

selected_samples <- col_data_subset |> 
    pull(sample_name)
tse_subset <- tse[, selected_samples]
tse_subset <- filterTaxa(tse_subset)
tse_subset
#> class: TreeSummarizedExperiment 
#> dim: 1556 230 
#> metadata(0):
#> assays(1): counts
#> rownames(1556): OTU_97.10005 OTU_97.10006 ... OTU_97.9966 OTU_97.9991
#> rowData names(7): superkingdom phylum ... genus taxon_annotation
#> colnames(230): 700103497 700103496 ... 700109120 700109119
#> colData names(15): dataset subject_id ... sequencing_method
#>   variable_region_16s
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: a LinkDataFrame (1556 rows)
#> rowTree: 1 phylo tree(s) (45364 leaves)
#> colLinks: NULL
#> colTree: NULL

Prior information

row_data <- as.data.frame(rowData(tse_subset))
prior_info <- row_data[, c('genus', 'taxon_annotation')]
prior_info$taxon_name <- rownames(row_data)
prior_info$new_names <- paste0(prior_info$taxon_name, '|', prior_info$genus)
prior_info <- 
    dplyr::relocate(prior_info, taxon_name, new_names, genus, taxon_annotation)
head(prior_info)
#>                taxon_name                    new_names           genus
#> OTU_97.10005 OTU_97.10005  OTU_97.10005|Capnocytophaga  Capnocytophaga
#> OTU_97.10006 OTU_97.10006     OTU_97.10006|Actinomyces     Actinomyces
#> OTU_97.10007 OTU_97.10007 OTU_97.10007|Corynebacterium Corynebacterium
#> OTU_97.10081 OTU_97.10081              OTU_97.10081|NA            <NA>
#> OTU_97.10093 OTU_97.10093              OTU_97.10093|NA            <NA>
#> OTU_97.10103 OTU_97.10103     OTU_97.10103|Actinomyces     Actinomyces
#>                   taxon_annotation
#> OTU_97.10005 facultative_anaerobic
#> OTU_97.10006             anaerobic
#> OTU_97.10007               aerobic
#> OTU_97.10081                  <NA>
#> OTU_97.10093                  <NA>
#> OTU_97.10103             anaerobic

Convert to phyloseq

ps <- makePhyloseqFromTreeSummarizedExperiment(tse_subset)
sample_data(ps)[[conditions_col]] <- 
    factor(sample_data(ps)[[conditions_col]], levels = conditions)
ps
#> phyloseq-class experiment-level object
#> otu_table()   OTU Table:         [ 1556 taxa and 230 samples ]
#> sample_data() Sample Data:       [ 230 samples by 15 sample variables ]
#> tax_table()   Taxonomy Table:    [ 1556 taxa by 6 taxonomic ranks ]
#> phy_tree()    Phylogenetic Tree: [ 1556 tips and 1540 internal nodes ]

Differential abundance analysis

Perform normalization, calculate weights, and select DA methods:

ps <- runNormalizations(set_norm_list(), ps, verbose = FALSE)
zw <- weights_ZINB(ps, design = conditions_col)
DA_methods <- set_DA_methods_list(conditions_col, conditions)

for (i in seq_along(DA_methods)) {
    ## This was a nacessary change for when the version increased:
    if (grepl("Seurat", names(DA_methods)[i])) {
        names(DA_methods[[i]]$contrast) <- NULL
    } else {
        next
    }
}
names(DA_methods)
#>  [1] "DA_edgeR.1"         "DA_edgeR.1"         "DA_DESeq2.1"       
#>  [4] "DA_DESeq2.1"        "DA_limma.1"         "DA_limma.1"        
#>  [7] "DA_metagenomeSeq.1" "DA_ALDEx2.1"        "DA_MAST.1"         
#> [10] "DA_Seurat.1"        "ancombc.1"          "wilcox.3"          
#> [13] "wilcox.4"           "ZINQ.9"             "ZINQ.10"           
#> [16] "lefse.12"           "lefse.13"

Run all of the differential analysis (DA) methods:

tim <- system.time({
    DA_output <- vector("list", length(DA_methods))
    for (i in seq_along(DA_output)) {
        message(
            "Running method ", i, ": ", names(DA_methods)[i], " - ", Sys.time()
        )
        DA_output[[i]] <- tryCatch(
            error = function(e) NULL,
            runDA(DA_methods[i], ps, weights = zw, verbose = FALSE) 
        )
    }
    DA_output <- purrr::list_flatten(DA_output, name_spec = "{inner}")
    DA_output <- purrr::discard(DA_output, is.null)
})
tim
#>    user  system elapsed 
#> 133.336  28.402 134.690

Enrichment analysis

Define a threshold for LEFSE with CLR

Lefser uses two values to define differential abundant taxa, p-value and LDA.

DA_output$lefse.TSS$statInfo$abs_score |> hist()

DA_output$lefse.CLR$statInfo$abs_score |> hist()

c(
    lefse.TSS = median(DA_output$lefse.TSS$statInfo$abs_score),
    lefse.CLR = median(DA_output$lefse.CLR$statInfo$abs_score)
)
#>  lefse.TSS  lefse.CLR 
#> 2.10563332 0.06591452

Create variables of thresholds:

direction <- get_direction_cols(DA_output, conditions_col, conditions)

adjThr<- rep(0.1, length(DA_output))
names(adjThr) <- names(DA_output)

esThr <- rep(0, length(DA_output))
names(esThr) <- names(DA_output)
esThr[grep("lefse.TSS", names(esThr))] <- 2
esThr[grep("lefse.CLR", names(esThr))] <- 0.06

slotV <- ifelse(grepl("lefse", names(DA_output)), "statInfo", "pValMat")
colNameV <- ifelse(grepl("lefse", names(DA_output)), "LDA_scores", "adjP")
typeV <- ifelse(grepl("lefse", names(DA_output)), "logfc", "pvalue")

Run enrichment:

enrichment <- createEnrichment(
    object = DA_output,
    priorKnowledge = prior_info,
    enrichmentCol = "taxon_annotation",
    namesCol = "new_names",
    slot = slotV, colName = colNameV, type = typeV,
    direction = direction,
    threshold_pvalue = adjThr,
    threshold_logfc = esThr,
    top = NULL, # No top feature selected
    alternative = "greater",
    verbose = FALSE 
)

Extract summary of the enrichment analysis:

enrichmentSummary <- purrr::map(enrichment,  ~ {
    .x$summaries |> 
        purrr::map(function(x) {
            pos <- which(colnames(x) != "pvalue")
            x |> 
                tibble::rownames_to_column(var = "direction") |> 
                tidyr::pivot_longer(
                    names_to = "annotation", values_to = "n",
                    cols = 2
                )
                
        }) |> 
        dplyr::bind_rows() |> 
        dplyr::relocate(pvalue)
}) |> 
    dplyr::bind_rows(.id = "method") |> 
    dplyr::mutate(
        sig = dplyr::case_when(
            pvalue < 0.05 & pvalue > 0.01 ~ "*",
            pvalue < 0.01 & pvalue > 0.001 ~ "**",
            pvalue < 0.001 ~ "***",
            TRUE ~ ""
        ) 
    ) |> 
    dplyr::mutate(
        direction = dplyr::case_when(
            direction == "DOWN Abundant" ~ "Subgingival",
            direction == "UP Abundant" ~ "Supragingival",
            TRUE ~ direction 
        )
    )
head(enrichmentSummary)
#> # A tibble: 6 × 6
#>   method      pvalue direction     annotation                n sig  
#>   <chr>        <dbl> <chr>         <chr>                 <int> <chr>
#> 1 edgeR.TMM 1   e+ 0 Subgingival   aerobic                   0 ""   
#> 2 edgeR.TMM 1.75e-39 Subgingival   anaerobic               127 "***"
#> 3 edgeR.TMM 1   e+ 0 Subgingival   facultative_anaerobic    10 ""   
#> 4 edgeR.TMM 2.31e- 1 Supragingival aerobic                  22 ""   
#> 5 edgeR.TMM 9.96e- 1 Supragingival anaerobic                26 ""   
#> 6 edgeR.TMM 4.82e- 2 Supragingival facultative_anaerobic    40 "*"

Plots

Enrichment plot

enPlot <- enrichmentSummary |> 
    dplyr::left_join(get_meth_class(), by = "method") |> 
    mutate(
        direction = factor(
            direction, levels = c("Supragingival", "Subgingival")
        )
    ) |> 
    mutate(
        method = case_when(
            grepl("lefse", method) ~ sub("lefse", "LEfSe", method),
            grepl("wilcox", method) ~ sub("wilcox", "Wilcox", method),
            TRUE ~ method
        )
    ) |> 
    mutate(
        annotation = case_when(
            annotation == "aerobic" ~ "Aerobic",
            annotation == "anaerobic" ~ "Anaerobic",
            annotation == "facultative_anaerobic" ~ "Facultative anaerobic",
            TRUE ~ annotation
        )
    ) |> 
    ggplot(aes(method, n)) +
    geom_col(
        aes(fill = annotation),
        position = position_dodge2(width = 0.9)
    ) +
    geom_text(
        aes(label = sig, color = annotation),
        position = position_dodge2(width = 0.9)
    ) +
    facet_grid(
        direction ~ method_class, scales = "free_x", space = "free"
    ) +
    scale_fill_viridis_d(option = "D", name = "Biological data") +
    scale_color_viridis_d(option = "D", name = "Biological data") +
    labs(
        x = "DA method", y = "Number of DA taxa"
    ) +
    theme_minimal() +
    theme(
        axis.text.x = element_text(angle = 45, hjust = 1),
        legend.position = "bottom"
    )

Putative true positives - putative false positives

Calculate TP - FP ratio (no threshold)

positives <- map(1:length(DA_output), .f = function(i) {
    positives <- createPositives(
        object = DA_output[i],
        priorKnowledge = prior_info, 
        enrichmentCol = "taxon_annotation", namesCol = "new_names",
        slot = slotV[i], colName = colNameV[i], type = typeV[i],
        direction = direction[i],
        threshold_pvalue = 1,
        threshold_logfc = 0,
        top = seq.int(from = 0, to = 50, by = 5),
        alternative = "greater",
        verbose = FALSE,
        TP = list(c("DOWN Abundant", "anaerobic"), c("UP Abundant", "aerobic")),
        FP = list(c("DOWN Abundant", "aerobic"), c("UP Abundant", "anaerobic"))
    ) |> 
        dplyr::left_join(get_meth_class(), by = 'method')
}) |> bind_rows()

Positives plot:

# names(vec) <- positives$base_method
positives <- positives |> 
    mutate(diff = jitter(TP - FP, amount = 1.5, factor = 2)) |> 
    mutate(
        base_method = case_when(
            grepl("lefse", base_method) ~ sub("lefse", "LEfSe", base_method),
            grepl("wilcox", base_method) ~ sub("wilcox", "Wilcox", base_method),
            TRUE ~ base_method 
        ),
        method = case_when(
            grepl("lefse", method) ~ sub("lefse", "LEfSe", method),
            grepl("wilcox", method) ~ sub("wilcox", "Wilcox", method),
            TRUE ~ method
        )
    )
vec <- positives$color
names(vec) <- positives$base_method
posPlot <- positives |> 
    ggplot(aes(top, diff)) +
    geom_line(
        aes(
            group = method, color = base_method, linetype = norm,
        ),
    ) +
    geom_point(
        aes(
            color = base_method, shape = norm
        ),
    ) +
    facet_wrap(~method_class, nrow = 1) +
    labs(
        x = "Top DA features", y = "TP - FP"
    ) +
    scale_shape(name = "Normalization") +
    scale_linetype(name = "Normalization") +
    scale_color_manual(values = vec, name = "Base method") +
    theme_minimal() +
    theme(legend.position = "bottom")

Combined plots

pp <- ggarrange(
    plotlist = list(enPlot, posPlot), ncol = 1, heights = c(1.5, 1)
)
pp

Session Info

sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.4.2 (2024-10-31)
#>  os       Ubuntu 24.04.1 LTS
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language en
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Etc/UTC
#>  date     2025-01-09
#>  pandoc   3.6 @ /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)
#>  ALDEx2                            1.38.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  ANCOMBC                           2.8.0      2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  annotate                          1.84.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  AnnotationDbi                     1.68.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  ape                               5.8-1      2024-12-16 [1] RSPM (R 4.4.0)
#>  aplot                             0.2.4      2024-12-17 [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 [1] RSPM (R 4.4.0)
#>  beachmat                          2.22.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  beeswarm                          0.4.0      2021-06-01 [1] RSPM (R 4.4.0)
#>  benchdamic                      * 1.11.0     2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#>  biglm                             0.9-3      2024-06-12 [1] RSPM (R 4.4.0)
#>  Biobase                         * 2.66.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  BiocFileCache                     2.14.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  BiocGenerics                    * 0.52.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  BiocNeighbors                     2.0.1      2024-11-28 [1] Bioconductor 3.20 (R 4.4.2)
#>  BiocParallel                      1.40.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  BiocSingular                      1.22.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  biomformat                        1.34.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  Biostrings                      * 2.74.1     2024-12-16 [1] Bioconductor 3.20 (R 4.4.2)
#>  bit                               4.5.0.1    2024-12-03 [1] RSPM (R 4.4.0)
#>  bit64                             4.5.2      2024-09-22 [1] RSPM (R 4.4.0)
#>  bitops                            1.0-9      2024-10-03 [1] RSPM (R 4.4.0)
#>  blob                              1.2.4      2023-03-17 [1] RSPM (R 4.4.0)
#>  bluster                           1.16.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  boot                              1.3-31     2024-08-28 [2] CRAN (R 4.4.2)
#>  brio                              1.1.5      2024-04-24 [1] RSPM (R 4.4.0)
#>  broom                             1.0.7      2024-09-26 [1] RSPM (R 4.4.0)
#>  bslib                             0.8.0      2024-07-29 [1] RSPM (R 4.4.0)
#>  cachem                            1.1.0      2024-05-16 [1] RSPM (R 4.4.0)
#>  car                               3.1-3      2024-09-27 [1] RSPM (R 4.4.0)
#>  carData                           3.0-5      2022-01-06 [1] RSPM (R 4.4.0)
#>  caTools                           1.18.3     2024-09-04 [1] RSPM (R 4.4.0)
#>  cellranger                        1.1.0      2016-07-27 [1] RSPM (R 4.4.0)
#>  checkmate                         2.3.2      2024-07-29 [1] RSPM (R 4.4.0)
#>  class                             7.3-22     2023-05-03 [2] CRAN (R 4.4.2)
#>  cli                               3.6.3      2024-06-21 [1] RSPM (R 4.4.0)
#>  clue                              0.3-66     2024-11-13 [1] RSPM (R 4.4.0)
#>  cluster                           2.1.8      2024-12-11 [2] RSPM (R 4.4.0)
#>  codetools                         0.2-20     2024-03-31 [2] CRAN (R 4.4.2)
#>  coin                              1.4-3      2023-09-27 [1] RSPM (R 4.4.0)
#>  colorspace                        2.1-1      2024-07-26 [1] RSPM (R 4.4.0)
#>  CompQuadForm                      1.4.3      2017-04-12 [1] RSPM (R 4.4.0)
#>  corncob                           0.4.1      2024-01-10 [1] RSPM (R 4.4.0)
#>  corpcor                           1.6.10     2021-09-16 [1] RSPM (R 4.4.0)
#>  cowplot                           1.1.3      2024-01-22 [1] RSPM (R 4.4.0)
#>  crayon                            1.5.3      2024-06-20 [1] RSPM (R 4.4.0)
#>  curl                              6.1.0      2025-01-06 [1] RSPM (R 4.4.0)
#>  CVXR                              1.0-15     2024-11-07 [1] RSPM (R 4.4.0)
#>  data.table                        1.16.4     2024-12-06 [1] RSPM (R 4.4.0)
#>  DBI                               1.2.3      2024-06-02 [1] RSPM (R 4.4.0)
#>  dbplyr                            2.5.0      2024-03-19 [1] RSPM (R 4.4.0)
#>  dearseq                           1.18.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  DECIPHER                          3.2.0      2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  decontam                          1.26.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  DelayedArray                      0.32.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  DelayedMatrixStats                1.28.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  deldir                            2.0-4      2024-02-28 [1] RSPM (R 4.4.0)
#>  DEoptimR                          1.1-3-1    2024-11-23 [1] RSPM (R 4.4.0)
#>  desc                              1.4.3      2023-12-10 [1] RSPM (R 4.4.0)
#>  DescTools                         0.99.58    2024-11-08 [1] RSPM (R 4.4.0)
#>  DESeq2                            1.46.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  digest                            0.6.37     2024-08-19 [1] RSPM (R 4.4.0)
#>  directlabels                      2024.1.21  2024-01-24 [1] RSPM (R 4.4.0)
#>  DirichletMultinomial              1.48.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  doParallel                        1.0.17     2022-02-07 [1] RSPM (R 4.4.0)
#>  doRNG                             1.8.6      2023-01-16 [1] RSPM (R 4.4.0)
#>  dotCall64                         1.2        2024-10-04 [1] RSPM (R 4.4.0)
#>  dplyr                           * 1.1.4      2023-11-17 [1] RSPM (R 4.4.0)
#>  e1071                             1.7-16     2024-09-16 [1] RSPM (R 4.4.0)
#>  edgeR                             4.4.1      2024-12-02 [1] Bioconductor 3.20 (R 4.4.2)
#>  ellipse                           0.5.0      2023-07-20 [1] RSPM (R 4.4.0)
#>  energy                            1.7-12     2024-08-24 [1] RSPM (R 4.4.0)
#>  evaluate                          1.0.1      2024-10-10 [1] RSPM (R 4.4.0)
#>  Exact                             3.3        2024-07-21 [1] RSPM (R 4.4.0)
#>  expm                              1.0-0      2024-08-19 [1] RSPM (R 4.4.0)
#>  farver                            2.1.2      2024-05-13 [1] RSPM (R 4.4.0)
#>  fastDummies                       1.7.4      2024-08-16 [1] RSPM (R 4.4.0)
#>  fastmap                           1.2.0      2024-05-15 [1] RSPM (R 4.4.0)
#>  fBasics                           4041.97    2024-08-19 [1] RSPM (R 4.4.0)
#>  filelock                          1.0.3      2023-12-11 [1] RSPM (R 4.4.0)
#>  fitdistrplus                      1.2-2      2025-01-07 [1] RSPM (R 4.4.0)
#>  forcats                           1.0.0      2023-01-29 [1] 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] CRAN (R 4.4.2)
#>  Formula                           1.2-5      2023-02-24 [1] RSPM (R 4.4.0)
#>  formula.tools                     1.7.1      2018-03-01 [1] RSPM (R 4.4.0)
#>  fs                                1.6.5      2024-10-30 [1] RSPM (R 4.4.0)
#>  future                            1.34.0     2024-07-29 [1] RSPM (R 4.4.0)
#>  future.apply                      1.11.3     2024-10-27 [1] RSPM (R 4.4.0)
#>  genefilter                        1.88.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  generics                          0.1.3      2022-07-05 [1] RSPM (R 4.4.0)
#>  GenomeInfoDb                    * 1.42.1     2024-11-28 [1] Bioconductor 3.20 (R 4.4.2)
#>  GenomeInfoDbData                  1.2.13     2025-01-09 [1] Bioconductor
#>  GenomicRanges                   * 1.58.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  getopt                            1.20.4     2023-10-01 [1] RSPM (R 4.4.0)
#>  ggbeeswarm                        0.7.2      2023-04-29 [1] RSPM (R 4.4.0)
#>  ggdendro                          0.2.0      2024-02-23 [1] RSPM (R 4.4.0)
#>  ggfun                             0.1.8      2024-12-03 [1] RSPM (R 4.4.0)
#>  ggplot2                         * 3.5.1      2024-04-23 [1] RSPM (R 4.4.0)
#>  ggplotify                         0.1.2      2023-08-09 [1] RSPM (R 4.4.0)
#>  ggpubr                          * 0.6.0      2023-02-10 [1] RSPM (R 4.4.0)
#>  ggrepel                           0.9.6      2024-09-07 [1] RSPM (R 4.4.0)
#>  ggridges                          0.5.6      2024-01-23 [1] RSPM (R 4.4.0)
#>  ggsignif                          0.6.4      2022-10-13 [1] RSPM (R 4.4.0)
#>  ggtree                            3.14.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  gld                               2.6.6      2022-10-23 [1] RSPM (R 4.4.0)
#>  glmnet                            4.1-8      2023-08-22 [1] RSPM (R 4.4.0)
#>  globals                           0.16.3     2024-03-08 [1] RSPM (R 4.4.0)
#>  glue                              1.8.0      2024-09-30 [1] RSPM (R 4.4.0)
#>  gmp                               0.7-5      2024-08-23 [1] RSPM (R 4.4.0)
#>  goftest                           1.2-3      2021-10-07 [1] RSPM (R 4.4.0)
#>  gplots                            3.2.0      2024-10-05 [1] RSPM (R 4.4.0)
#>  gridExtra                         2.3        2017-09-09 [1] RSPM (R 4.4.0)
#>  gridGraphics                      0.5-1      2020-12-13 [1] RSPM (R 4.4.0)
#>  gsl                               2.1-8      2023-01-24 [1] RSPM (R 4.4.0)
#>  gtable                            0.3.6      2024-10-25 [1] RSPM (R 4.4.0)
#>  gtools                            3.9.5      2023-11-20 [1] RSPM (R 4.4.0)
#>  GUniFrac                          1.8        2023-09-14 [1] RSPM (R 4.4.0)
#>  haven                             2.5.4      2023-11-30 [1] RSPM (R 4.4.0)
#>  Hmisc                             5.2-1      2024-12-02 [1] RSPM (R 4.4.0)
#>  hms                               1.1.3      2023-03-21 [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 [1] RSPM (R 4.4.0)
#>  htmlwidgets                       1.6.4      2023-12-06 [1] RSPM (R 4.4.0)
#>  httpuv                            1.6.15     2024-03-26 [1] RSPM (R 4.4.0)
#>  httr                              1.4.7      2023-08-15 [1] RSPM (R 4.4.0)
#>  ica                               1.0-3      2022-07-08 [1] RSPM (R 4.4.0)
#>  igraph                            2.1.3      2025-01-07 [1] RSPM (R 4.4.0)
#>  inline                            0.3.20     2024-11-10 [1] RSPM (R 4.4.0)
#>  interp                            1.1-6      2024-01-26 [1] RSPM (R 4.4.0)
#>  IRanges                         * 2.40.1     2024-12-05 [1] Bioconductor 3.20 (R 4.4.2)
#>  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)
#>  janeaustenr                       1.0.0      2022-08-26 [1] RSPM (R 4.4.0)
#>  jomo                              2.7-6      2023-04-15 [1] RSPM (R 4.4.0)
#>  jpeg                              0.1-10     2022-11-29 [1] RSPM (R 4.4.0)
#>  jquerylib                         0.1.4      2021-04-26 [1] RSPM (R 4.4.0)
#>  jsonlite                          1.8.9      2024-09-20 [1] RSPM (R 4.4.0)
#>  KEGGREST                          1.46.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  KernSmooth                        2.23-24    2024-05-17 [2] CRAN (R 4.4.2)
#>  knitr                             1.49       2024-11-08 [1] RSPM (R 4.4.0)
#>  labeling                          0.4.3      2023-08-29 [1] RSPM (R 4.4.0)
#>  later                             1.4.1      2024-11-27 [1] RSPM (R 4.4.0)
#>  lattice                           0.22-6     2024-03-20 [2] CRAN (R 4.4.2)
#>  latticeExtra                      0.6-30     2022-07-04 [1] RSPM (R 4.4.0)
#>  lazyeval                          0.2.2      2019-03-15 [1] RSPM (R 4.4.0)
#>  lefser                            1.16.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  leiden                            0.4.3.1    2023-11-17 [1] RSPM (R 4.4.0)
#>  libcoin                           1.0-10     2023-09-27 [1] RSPM (R 4.4.0)
#>  lifecycle                         1.0.4      2023-11-07 [1] RSPM (R 4.4.0)
#>  limma                             3.62.1     2024-11-03 [1] Bioconductor 3.20 (R 4.4.2)
#>  listenv                           0.9.1      2024-01-29 [1] RSPM (R 4.4.0)
#>  lme4                              1.1-35.5   2024-07-03 [1] RSPM (R 4.4.0)
#>  lmerTest                          3.1-3      2020-10-23 [1] RSPM (R 4.4.0)
#>  lmom                              3.2        2024-09-30 [1] RSPM (R 4.4.0)
#>  lmtest                            0.9-40     2022-03-21 [1] RSPM (R 4.4.0)
#>  locfit                            1.5-9.10   2024-06-24 [1] RSPM (R 4.4.0)
#>  logistf                           1.26.0     2023-08-18 [1] RSPM (R 4.4.0)
#>  lpSolve                           5.6.23     2024-12-14 [1] RSPM (R 4.4.0)
#>  Maaslin2                          1.19.0     2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#>  magrittr                          2.0.3      2022-03-30 [1] RSPM (R 4.4.0)
#>  MASS                              7.3-61     2024-06-13 [2] CRAN (R 4.4.2)
#>  MAST                              1.32.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  Matrix                            1.7-1      2024-10-18 [2] CRAN (R 4.4.2)
#>  MatrixGenerics                  * 1.18.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  MatrixModels                      0.5-3      2023-11-06 [1] RSPM (R 4.4.0)
#>  matrixStats                     * 1.5.0      2025-01-07 [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 [1] RSPM (R 4.4.0)
#>  metagenomeSeq                     1.47.0     2024-05-01 [1] Bioconductor 3.20 (R 4.4.0)
#>  mgcv                              1.9-1      2023-12-21 [2] CRAN (R 4.4.2)
#>  MGLM                              0.2.1      2022-04-13 [1] RSPM (R 4.4.0)
#>  mia                             * 1.14.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  mice                              3.17.0     2024-11-27 [1] RSPM (R 4.4.0)
#>  microbiome                        1.28.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  MicrobiomeBenchmarkData         * 1.8.0      2024-10-31 [1] Bioconductor 3.20 (R 4.4.2)
#>  MicrobiomeBenchmarkDataAnalyses * 0.99.21    2025-01-09 [1] local
#>  MicrobiomeStat                    1.2        2024-04-01 [1] RSPM (R 4.4.0)
#>  mime                              0.12       2021-09-28 [1] RSPM (R 4.4.0)
#>  miniUI                            0.1.1.1    2018-05-18 [1] RSPM (R 4.4.0)
#>  minqa                             1.2.8      2024-08-17 [1] RSPM (R 4.4.0)
#>  mitml                             0.4-5      2023-03-08 [1] RSPM (R 4.4.0)
#>  mitools                           2.4        2019-04-26 [1] RSPM (R 4.4.0)
#>  mixOmics                          6.30.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  modeest                           2.4.0      2019-11-18 [1] RSPM (R 4.4.0)
#>  modeltools                        0.2-23     2020-03-05 [1] RSPM (R 4.4.0)
#>  multcomp                          1.4-26     2024-07-18 [1] RSPM (R 4.4.0)
#>  MultiAssayExperiment            * 1.32.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  multtest                          2.62.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  munsell                           0.5.1      2024-04-01 [1] RSPM (R 4.4.0)
#>  mvtnorm                           1.3-2      2024-11-04 [1] RSPM (R 4.4.0)
#>  NADA                              1.6-1.1    2020-03-22 [1] RSPM (R 4.4.0)
#>  nlme                              3.1-166    2024-08-14 [2] CRAN (R 4.4.2)
#>  nloptr                            2.1.1      2024-06-25 [1] RSPM (R 4.4.0)
#>  nnet                              7.3-19     2023-05-03 [2] CRAN (R 4.4.2)
#>  NOISeq                            2.50.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  numDeriv                          2016.8-1.1 2019-06-06 [1] RSPM (R 4.4.0)
#>  operator.tools                    1.6.3      2017-02-28 [1] RSPM (R 4.4.0)
#>  optparse                          1.7.5      2024-04-16 [1] RSPM (R 4.4.0)
#>  pan                               1.9        2023-12-07 [1] RSPM (R 4.4.0)
#>  parallelly                        1.41.0     2024-12-18 [1] RSPM (R 4.4.0)
#>  patchwork                         1.3.0      2024-09-16 [1] RSPM (R 4.4.0)
#>  pbapply                           1.7-2      2023-06-27 [1] RSPM (R 4.4.0)
#>  pcaPP                             2.0-5      2024-08-19 [1] RSPM (R 4.4.0)
#>  permute                           0.9-7      2022-01-27 [1] RSPM (R 4.4.0)
#>  phyloseq                        * 1.50.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  pillar                            1.10.1     2025-01-07 [1] RSPM (R 4.4.0)
#>  pkgconfig                         2.0.3      2019-09-22 [1] RSPM (R 4.4.0)
#>  pkgdown                           2.1.1      2024-09-17 [1] 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)
#>  png                               0.1-8      2022-11-29 [1] RSPM (R 4.4.0)
#>  polyclip                          1.10-7     2024-07-23 [1] RSPM (R 4.4.0)
#>  prettyunits                       1.2.0      2023-09-24 [1] RSPM (R 4.4.0)
#>  progress                          1.2.3      2023-12-06 [1] RSPM (R 4.4.0)
#>  progressr                         0.15.1     2024-11-22 [1] RSPM (R 4.4.0)
#>  promises                          1.3.2      2024-11-28 [1] RSPM (R 4.4.0)
#>  proxy                             0.4-27     2022-06-09 [1] RSPM (R 4.4.0)
#>  purrr                           * 1.0.2      2023-08-10 [1] RSPM (R 4.4.0)
#>  quadprog                          1.5-8      2019-11-20 [1] RSPM (R 4.4.0)
#>  quantreg                          5.99.1     2024-11-22 [1] RSPM (R 4.4.0)
#>  R6                                2.5.1      2021-08-19 [1] RSPM (R 4.4.0)
#>  ragg                              1.3.3      2024-09-11 [1] RSPM (R 4.4.0)
#>  RANN                              2.6.2      2024-08-25 [1] RSPM (R 4.4.0)
#>  rARPACK                           0.11-0     2016-03-10 [1] RSPM (R 4.4.0)
#>  rbibutils                         2.3        2024-10-04 [1] 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-1   2024-11-02 [1] RSPM (R 4.4.0)
#>  RcppAnnoy                         0.0.22     2024-01-23 [1] RSPM (R 4.4.0)
#>  RcppHNSW                          0.6.0      2024-02-04 [1] RSPM (R 4.4.0)
#>  RcppParallel                      5.1.9      2024-08-19 [1] RSPM (R 4.4.0)
#>  RcppZiggurat                      0.1.6      2020-10-20 [1] RSPM (R 4.4.0)
#>  Rdpack                            2.6.2      2024-11-15 [1] RSPM (R 4.4.0)
#>  readxl                            1.4.3      2023-07-06 [1] RSPM (R 4.4.0)
#>  reshape2                          1.4.4      2020-04-09 [1] RSPM (R 4.4.0)
#>  reticulate                        1.40.0     2024-11-15 [1] RSPM (R 4.4.0)
#>  Rfast                             2.1.3      2024-12-31 [1] RSPM (R 4.4.0)
#>  rhdf5                             2.50.1     2024-12-09 [1] Bioconductor 3.20 (R 4.4.2)
#>  rhdf5filters                      1.18.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  Rhdf5lib                          1.28.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  rlang                             1.1.4      2024-06-04 [1] RSPM (R 4.4.0)
#>  rmarkdown                         2.29       2024-11-04 [1] RSPM (R 4.4.0)
#>  Rmpfr                             1.0-0      2024-11-18 [1] RSPM (R 4.4.0)
#>  rmutil                            1.1.10     2022-10-27 [1] RSPM (R 4.4.0)
#>  rngtools                          1.5.2      2021-09-20 [1] RSPM (R 4.4.0)
#>  robustbase                        0.99-4-1   2024-09-27 [1] RSPM (R 4.4.0)
#>  ROCR                              1.0-11     2020-05-02 [1] RSPM (R 4.4.0)
#>  rootSolve                         1.8.2.4    2023-09-21 [1] RSPM (R 4.4.0)
#>  rpart                             4.1.23     2023-12-05 [2] CRAN (R 4.4.2)
#>  RSpectra                          0.16-2     2024-07-18 [1] RSPM (R 4.4.0)
#>  RSQLite                           2.3.9      2024-12-03 [1] RSPM (R 4.4.0)
#>  rstatix                           0.7.2      2023-02-01 [1] RSPM (R 4.4.0)
#>  rstudioapi                        0.17.1     2024-10-22 [1] RSPM (R 4.4.0)
#>  rsvd                              1.0.5      2021-04-16 [1] RSPM (R 4.4.0)
#>  Rtsne                             0.17       2023-12-07 [1] RSPM (R 4.4.0)
#>  S4Arrays                          1.6.0      2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  S4Vectors                       * 0.44.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  sandwich                          3.1-1      2024-09-15 [1] RSPM (R 4.4.0)
#>  sass                              0.4.9      2024-03-15 [1] RSPM (R 4.4.0)
#>  ScaledMatrix                      1.14.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  scales                            1.3.0      2023-11-28 [1] RSPM (R 4.4.0)
#>  scater                            1.34.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  scattermore                       1.2        2023-06-12 [1] RSPM (R 4.4.0)
#>  sctransform                       0.4.1      2023-10-19 [1] RSPM (R 4.4.0)
#>  scuttle                           1.16.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  sessioninfo                       1.2.2      2021-12-06 [1] RSPM (R 4.4.0)
#>  Seurat                            5.1.0      2024-05-10 [1] RSPM (R 4.4.0)
#>  SeuratObject                      5.0.2      2024-05-08 [1] RSPM (R 4.4.0)
#>  shape                             1.4.6.1    2024-02-23 [1] RSPM (R 4.4.0)
#>  shiny                             1.10.0     2024-12-14 [1] RSPM (R 4.4.0)
#>  SingleCellExperiment            * 1.28.1     2024-11-10 [1] Bioconductor 3.20 (R 4.4.2)
#>  slam                              0.1-55     2024-11-13 [1] RSPM (R 4.4.0)
#>  SnowballC                         0.7.1      2023-04-25 [1] RSPM (R 4.4.0)
#>  softImpute                        1.4-1      2021-05-09 [1] RSPM (R 4.4.0)
#>  sp                                2.1-4      2024-04-30 [1] RSPM (R 4.4.0)
#>  spam                              2.11-0     2024-10-03 [1] RSPM (R 4.4.0)
#>  SparseArray                       1.6.0      2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  SparseM                           1.84-2     2024-07-17 [1] RSPM (R 4.4.0)
#>  sparseMatrixStats                 1.18.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  spatial                           7.3-17     2023-07-20 [2] CRAN (R 4.4.2)
#>  spatstat.data                     3.1-4      2024-11-15 [1] RSPM (R 4.4.0)
#>  spatstat.explore                  3.3-3      2024-10-22 [1] RSPM (R 4.4.0)
#>  spatstat.geom                     3.3-4      2024-11-18 [1] RSPM (R 4.4.0)
#>  spatstat.random                   3.3-2      2024-09-18 [1] RSPM (R 4.4.0)
#>  spatstat.sparse                   3.1-0      2024-06-21 [1] RSPM (R 4.4.0)
#>  spatstat.univar                   3.1-1      2024-11-05 [1] RSPM (R 4.4.0)
#>  spatstat.utils                    3.1-2      2025-01-08 [1] RSPM (R 4.4.0)
#>  stable                            1.1.6      2022-03-02 [1] RSPM (R 4.4.0)
#>  stabledist                        0.7-2      2024-08-17 [1] RSPM (R 4.4.0)
#>  statip                            0.2.3      2019-11-17 [1] RSPM (R 4.4.0)
#>  statmod                           1.5.0      2023-01-06 [1] RSPM (R 4.4.0)
#>  stringi                           1.8.4      2024-05-06 [1] RSPM (R 4.4.0)
#>  stringr                           1.5.1      2023-11-14 [1] RSPM (R 4.4.0)
#>  SummarizedExperiment            * 1.36.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  survey                            4.4-2      2024-03-20 [1] RSPM (R 4.4.0)
#>  survival                          3.8-3      2024-12-17 [2] RSPM (R 4.4.0)
#>  systemfonts                       1.1.0      2024-05-15 [1] RSPM (R 4.4.0)
#>  tensor                            1.5        2012-05-05 [1] RSPM (R 4.4.0)
#>  testthat                          3.2.2      2024-12-10 [1] RSPM (R 4.4.0)
#>  textshaping                       0.4.1      2024-12-06 [1] RSPM (R 4.4.0)
#>  TH.data                           1.1-2      2023-04-17 [1] RSPM (R 4.4.0)
#>  tibble                            3.2.1      2023-03-20 [1] 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)
#>  tidytext                          0.4.2      2024-04-10 [1] RSPM (R 4.4.0)
#>  tidytree                          0.4.6      2023-12-12 [1] RSPM (R 4.4.0)
#>  timeDate                          4041.110   2024-09-22 [1] RSPM (R 4.4.0)
#>  timeSeries                        4041.111   2024-09-22 [1] RSPM (R 4.4.0)
#>  tokenizers                        0.3.0      2022-12-22 [1] RSPM (R 4.4.0)
#>  treeio                            1.30.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  TreeSummarizedExperiment        * 2.14.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  truncnorm                         1.0-9      2023-03-20 [1] RSPM (R 4.4.0)
#>  UCSC.utils                        1.2.0      2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  utf8                              1.2.4      2023-10-22 [1] RSPM (R 4.4.0)
#>  uwot                              0.2.2      2024-04-21 [1] RSPM (R 4.4.0)
#>  vctrs                             0.6.5      2023-12-01 [1] 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)
#>  withr                             3.0.2      2024-10-28 [1] RSPM (R 4.4.0)
#>  Wrench                            1.24.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  xfun                              0.50       2025-01-07 [1] RSPM (R 4.4.0)
#>  XML                               3.99-0.18  2025-01-01 [1] RSPM (R 4.4.0)
#>  xtable                            1.8-4      2019-04-21 [1] RSPM (R 4.4.0)
#>  XVector                         * 0.46.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  yaml                              2.3.10     2024-07-26 [1] RSPM (R 4.4.0)
#>  yulab.utils                       0.1.9      2025-01-07 [1] RSPM (R 4.4.0)
#>  zCompositions                     1.5.0-4    2024-06-19 [1] RSPM (R 4.4.0)
#>  zinbwave                          1.28.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  ZINQ                              2.0        2025-01-09 [1] Github (wdl2459/ZINQ-v2@40391a6)
#>  zlibbioc                          1.52.0     2024-10-29 [1] Bioconductor 3.20 (R 4.4.2)
#>  zoo                               1.8-12     2023-04-13 [1] RSPM (R 4.4.0)
#> 
#>  [1] /usr/local/lib/R/site-library
#>  [2] /usr/local/lib/R/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────