Data

Import dataset:

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

Exploring some of the data

Let’s convert the col_data into a tibble (jsut for ease of handling):

col_data <- tse |> 
    colData() |> 
    as.data.frame() |> 
    tibble::rownames_to_column("sample_name") |> 
    as_tibble()

Total number of subjects:

subjects <- col_data |> 
    pull(subject_id) |> 
    unique()
length(subjects)
#> [1] 132

The number of male and female subjects:

col_data |> 
    select(subject_id, gender) |> 
    unique() |> 
    count(gender) |> 
    arrange(-n)
#> # A tibble: 2 × 2
#>   gender     n
#>   <chr>  <int>
#> 1 female    67
#> 2 male      65

Number of subjects per visit number:

col_data |> 
    select(subject_id, visit_number) |> 
    unique() |> 
    count(visit_number) |> 
    arrange(-n)
#> # A tibble: 3 × 2
#>   visit_number     n
#>          <dbl> <int>
#> 1            1    88
#> 2            2    76
#> 3            3     1

Number of subjects per run_center:

col_data |> 
    select(subject_id, run_center) |> 
    unique() |> 
    count(run_center) |> 
    arrange(-n)
#> # A tibble: 8 × 2
#>   run_center     n
#>   <chr>      <int>
#> 1 WUGC          74
#> 2 JCVI          32
#> 3 BCM           17
#> 4 BCM,WUGC       6
#> 5 JCVI,WUGC      6
#> 6 BCM,JCVI       3
#> 7 WUGC,BCM       2
#> 8 BI,BCM         1
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) {
        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)

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

col_data_subset |> 
    count(gender)
#> # A tibble: 2 × 2
#>   gender     n
#>   <chr>  <int>
#> 1 female   118
#> 2 male     112
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

OTU level:

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 5 taxonomic ranks ]
#> phy_tree()    Phylogenetic Tree: [ 1556 tips and 1540 internal nodes ]

Differential abundance analysis

Select methods for DA:

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)) {
    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 
#> 282.720  32.524 283.212

Enrichment analysis

Get the column name indicating the direction of the features (increased or decreased). This is the stats output.

direction <- get_direction_cols(DA_output, conditions_col, conditions)

Enrichment (adjP <= 0.1)

Lefse is the strictest method, defining DA with p-values and effect size thresholds (based on linear discriminant analysis). CLR affects the magnitud of the effect size, so let’s define a new one.

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.16749921 0.06591452

Create variables of thresholds:

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

Create enrichment plot

enPlot <- enrichmentSummary |> 
    left_join(get_meth_class(), by = "method") |> 
    mutate(
        direction = factor(
            direction, levels = c("Supragingival", "Subgingival")
        )
    ) |> 
    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"))
    ) |> 
        left_join(get_meth_class(), by = 'method')
}) |> bind_rows()
# names(positives) <- names(DA_output)


# positives <- createPositives(
#     object = DA_output,
#     priorKnowledge = prior_info, 
#     enrichmentCol = "taxon_annotation", namesCol = "new_names",
#     slot = slotV, colName = colNameV, type = typeV,
#     direction = direction,
#     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"))
# ) |> 
#     left_join(get_meth_class(), by = 'method')

Plot TP - FP

vec <- positives$color
names(vec) <- positives$base_method
posPlot <- positives |> 
    mutate(diff = jitter(TP - FP, amount = 1.5, factor = 2)) |> 
    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")

Combine 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.1 (2024-06-14)
#>  os       Ubuntu 22.04.4 LTS
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language en
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Etc/UTC
#>  date     2024-09-24
#>  pandoc   3.2 @ /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.36.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  ANCOMBC                           2.6.0      2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  annotate                          1.82.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  AnnotationDbi                     1.66.0     2024-05-01 [1] Bioconductor 3.19 (R 4.4.1)
#>  ape                               5.8        2024-04-11 [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.20.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  beeswarm                          0.4.0      2021-06-01 [1] RSPM (R 4.4.0)
#>  benchdamic                      * 1.11.1     2024-09-24 [1] Github (mcalgaro93/benchdamic@7686034)
#>  biglm                             0.9-3      2024-06-12 [1] RSPM (R 4.4.0)
#>  Biobase                         * 2.64.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  BiocFileCache                     2.12.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  BiocGenerics                    * 0.50.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  BiocNeighbors                     1.22.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  BiocParallel                      1.38.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  BiocSingular                      1.20.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  biomformat                        1.32.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  Biostrings                      * 2.72.1     2024-06-02 [1] Bioconductor 3.19 (R 4.4.1)
#>  bit                               4.5.0      2024-09-20 [1] RSPM (R 4.4.0)
#>  bit64                             4.5.2      2024-09-22 [1] RSPM (R 4.4.0)
#>  bitops                            1.0-8      2024-07-29 [1] RSPM (R 4.4.0)
#>  blob                              1.2.4      2023-03-17 [1] RSPM (R 4.4.0)
#>  bluster                           1.14.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  boot                              1.3-30     2024-02-26 [2] CRAN (R 4.4.1)
#>  broom                             1.0.6      2024-05-17 [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-2      2023-03-30 [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.1)
#>  cli                               3.6.3      2024-06-21 [1] RSPM (R 4.4.0)
#>  clue                              0.3-65     2023-09-23 [1] RSPM (R 4.4.0)
#>  cluster                           2.1.6      2023-12-01 [2] CRAN (R 4.4.1)
#>  codetools                         0.2-20     2024-03-31 [2] CRAN (R 4.4.1)
#>  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                              5.2.3      2024-09-20 [1] RSPM (R 4.4.0)
#>  CVXR                              1.0-14     2024-06-27 [1] RSPM (R 4.4.0)
#>  data.table                        1.16.0     2024-08-27 [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.16.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  DECIPHER                          3.0.0      2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  decontam                          1.24.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  DelayedArray                      0.30.1     2024-05-07 [1] Bioconductor 3.19 (R 4.4.1)
#>  DelayedMatrixStats                1.26.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  deldir                            2.0-4      2024-02-28 [1] RSPM (R 4.4.0)
#>  DEoptimR                          1.1-3      2023-10-07 [1] RSPM (R 4.4.0)
#>  desc                              1.4.3      2023-12-10 [1] RSPM (R 4.4.0)
#>  DescTools                         0.99.56    2024-08-22 [1] RSPM (R 4.4.0)
#>  DESeq2                            1.44.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.46.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.1-1      2023-11-28 [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.2.1      2024-07-14 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.0      2024-09-17 [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)
#>  fansi                             1.0.6      2023-12-08 [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-1      2024-07-12 [1] RSPM (R 4.4.0)
#>  foreach                         * 1.5.2      2022-02-02 [1] RSPM (R 4.4.0)
#>  foreign                           0.8-86     2023-11-28 [2] CRAN (R 4.4.1)
#>  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.4      2024-04-25 [1] RSPM (R 4.4.0)
#>  future                            1.34.0     2024-07-29 [1] RSPM (R 4.4.0)
#>  future.apply                      1.11.2     2024-03-28 [1] RSPM (R 4.4.0)
#>  genefilter                        1.86.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  generics                          0.1.3      2022-07-05 [1] RSPM (R 4.4.0)
#>  GenomeInfoDb                    * 1.40.1     2024-05-24 [1] Bioconductor 3.19 (R 4.4.1)
#>  GenomeInfoDbData                  1.2.12     2024-06-25 [1] Bioconductor
#>  GenomicRanges                   * 1.56.1     2024-06-12 [1] Bioconductor 3.19 (R 4.4.1)
#>  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)
#>  ggplot2                         * 3.5.1      2024-04-23 [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)
#>  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.7.0      2024-01-09 [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.1.3.1    2024-02-02 [1] RSPM (R 4.4.0)
#>  gridExtra                       * 2.3        2017-09-09 [1] RSPM (R 4.4.0)
#>  gsl                               2.1-8      2023-01-24 [1] RSPM (R 4.4.0)
#>  gtable                            0.3.5      2024-04-22 [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)
#>  highr                             0.11       2024-05-26 [1] RSPM (R 4.4.0)
#>  Hmisc                             5.1-3      2024-05-28 [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.0.3      2024-03-13 [1] RSPM (R 4.4.0)
#>  inline                            0.3.19     2021-05-31 [1] RSPM (R 4.4.0)
#>  interp                            1.1-6      2024-01-26 [1] RSPM (R 4.4.0)
#>  IRanges                         * 2.38.1     2024-07-03 [1] Bioconductor 3.19 (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)
#>  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.44.1     2024-06-19 [1] Bioconductor 3.19 (R 4.4.1)
#>  KernSmooth                        2.23-24    2024-05-17 [2] CRAN (R 4.4.1)
#>  knitr                             1.48       2024-07-07 [1] RSPM (R 4.4.0)
#>  labeling                          0.4.3      2023-08-29 [1] RSPM (R 4.4.0)
#>  later                             1.3.2      2023-12-06 [1] RSPM (R 4.4.0)
#>  lattice                           0.22-6     2024-03-20 [2] CRAN (R 4.4.1)
#>  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.14.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.60.4     2024-07-17 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.0        2023-08-29 [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)
#>  Maaslin2                          1.18.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  magrittr                          2.0.3      2022-03-30 [1] RSPM (R 4.4.0)
#>  MASS                              7.3-61     2024-06-13 [2] RSPM (R 4.4.0)
#>  MAST                              1.30.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  Matrix                            1.7-0      2024-04-26 [2] CRAN (R 4.4.1)
#>  MatrixGenerics                  * 1.16.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  MatrixModels                      0.5-3      2023-11-06 [1] RSPM (R 4.4.0)
#>  matrixStats                     * 1.4.1      2024-09-08 [1] RSPM (R 4.4.0)
#>  memoise                           2.0.1      2021-11-26 [1] RSPM (R 4.4.0)
#>  metagenomeSeq                     1.46.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  mgcv                              1.9-1      2023-12-21 [2] CRAN (R 4.4.1)
#>  MGLM                              0.2.1      2022-04-13 [1] RSPM (R 4.4.0)
#>  mia                             * 1.12.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  mice                              3.16.0     2023-06-05 [1] RSPM (R 4.4.0)
#>  microbiome                        1.26.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  MicrobiomeBenchmarkData         * 1.6.0      2024-05-02 [1] Bioconductor 3.19 (R 4.4.1)
#>  MicrobiomeBenchmarkDataAnalyses * 0.99.11    2024-09-24 [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.28.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.30.3     2024-07-10 [1] Bioconductor 3.19 (R 4.4.1)
#>  multtest                          2.60.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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)
#>  NADA                              1.6-1.1    2020-03-22 [1] RSPM (R 4.4.0)
#>  nlme                              3.1-165    2024-06-06 [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 [2] CRAN (R 4.4.1)
#>  NOISeq                            2.48.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.38.0     2024-07-27 [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.48.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  pillar                            1.9.0      2023-03-22 [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.14.0     2023-08-10 [1] RSPM (R 4.4.0)
#>  promises                          1.3.0      2024-04-05 [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.98       2024-05-26 [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.2.16     2023-10-25 [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 [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.1      2024-08-06 [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.39.0     2024-09-05 [1] RSPM (R 4.4.0)
#>  Rfast                             2.1.0      2023-11-09 [1] RSPM (R 4.4.0)
#>  rhdf5                             2.48.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  rhdf5filters                      1.16.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  Rhdf5lib                          1.26.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  rlang                             1.1.4      2024-06-04 [1] RSPM (R 4.4.0)
#>  rmarkdown                         2.28       2024-08-17 [1] RSPM (R 4.4.0)
#>  Rmpfr                             0.9-5      2024-01-21 [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     2024-08-19 [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.1)
#>  RSpectra                          0.16-2     2024-07-18 [1] RSPM (R 4.4.0)
#>  RSQLite                           2.3.7      2024-05-27 [1] RSPM (R 4.4.0)
#>  rstatix                           0.7.2      2023-02-01 [1] RSPM (R 4.4.0)
#>  rstudioapi                        0.16.0     2024-03-24 [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.4.1      2024-05-20 [1] Bioconductor 3.19 (R 4.4.1)
#>  S4Vectors                       * 0.42.1     2024-07-03 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.12.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  scales                            1.3.0      2023-11-28 [1] RSPM (R 4.4.0)
#>  scater                            1.32.1     2024-07-21 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.14.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.9.1      2024-08-01 [1] RSPM (R 4.4.0)
#>  SingleCellExperiment            * 1.26.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.10-0     2023-10-23 [1] RSPM (R 4.4.0)
#>  SparseArray                       1.4.8      2024-05-24 [1] Bioconductor 3.19 (R 4.4.1)
#>  SparseM                           1.84-2     2024-07-17 [1] RSPM (R 4.4.0)
#>  sparseMatrixStats                 1.16.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  spatial                           7.3-17     2023-07-20 [2] CRAN (R 4.4.1)
#>  spatstat.data                     3.1-2      2024-06-21 [1] RSPM (R 4.4.0)
#>  spatstat.explore                  3.3-2      2024-08-21 [1] RSPM (R 4.4.0)
#>  spatstat.geom                     3.3-3      2024-09-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.0-1      2024-09-05 [1] RSPM (R 4.4.0)
#>  spatstat.utils                    3.1-0      2024-08-17 [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.34.0     2024-05-01 [1] Bioconductor 3.19 (R 4.4.1)
#>  survey                            4.4-2      2024-03-20 [1] RSPM (R 4.4.0)
#>  survival                          3.7-0      2024-06-05 [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)
#>  textshaping                       0.4.0      2024-05-24 [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.28.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  TreeSummarizedExperiment        * 2.12.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  truncnorm                         1.0-9      2023-03-20 [1] RSPM (R 4.4.0)
#>  UCSC.utils                        1.0.0      2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.1      2024-07-31 [1] RSPM (R 4.4.0)
#>  Wrench                            1.22.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  xfun                              0.47       2024-08-17 [1] RSPM (R 4.4.0)
#>  XML                               3.99-0.17  2024-06-25 [1] RSPM (R 4.4.0)
#>  xtable                            1.8-4      2019-04-21 [1] RSPM (R 4.4.0)
#>  XVector                         * 0.44.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  yaml                              2.3.10     2024-07-26 [1] RSPM (R 4.4.0)
#>  yulab.utils                       0.1.7      2024-08-26 [1] RSPM (R 4.4.0)
#>  zCompositions                     1.5.0-4    2024-06-19 [1] RSPM (R 4.4.0)
#>  zinbwave                          1.26.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  ZINQ                              2.0        2024-09-24 [1] Github (wdl2459/ZINQ-v2@40391a6)
#>  zlibbioc                          1.50.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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
#> 
#> ──────────────────────────────────────────────────────────────────────────────