Expected results

Direct quotes from Tobacco exposure associated with oral microbiota oxygen utilization in the New York City Health and Nutrition Examination Study

These results were obtained using annotated OTUs based on their genus.

ORA

Significant result:

“… differentially abundant OTUs between current smokers and never smokers to be over-represented in aerobic OTUs (Hypergeometric test, p = 0.004).”

GSEA

Significant result:

“…aerobic OTUs were significantly depleted among current smokers relative to never smokers (Enrichment Score test statistic ES = −0.75, p = 0.002, GSEA permutation test).”

Non-significant results:

“Anaerobic OTUs were enriched in smokers relative to never smokers but the difference was not statistically significant (ES = 0.36, p = 0.14, GSEA permutation test).”

“… enrichment of facultative anaerobic OTUs among never smokers compared to current smokers but this result was not statistically significant (ES = −0.29, p = 0.48, GSEA permutation test).”

Data

Data used here is a subset of the original data used for the NYCHANES study. Full data can be found on GitHub. Signatures from this study have been published on BugSigDB.

The data subset presented here only contains abundance values for “Never smoker” vs “Cigarette” samples (“smokingstatus” column in metadata).

NYCHANES data - OTU:

tse <- importNYCHANES()
tse
#> class: TreeSummarizedExperiment 
#> dim: 1291 129 
#> metadata(0):
#> assays(1): counts
#> rownames(1291): New.CleanUp.ReferenceOTU7367
#>   New.CleanUp.ReferenceOTU7623 ... New.CleanUp.ReferenceOTU2608
#>   New.CleanUp.ReferenceOTU5014
#> rowData names(8): Domain Phylum ... Species GenusID
#> colnames(129): NYDH0033 NYDH0026 ... NYDH1460 NYDH0847
#> colData names(714): KEY Burklab_ID ... INC3C DBQ_10_3CAT
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: a LinkDataFrame (1291 rows)
#> rowTree: 1 phylo tree(s) (1291 leaves)
#> colLinks: NULL
#> colTree: NULL
table(tse$smokingstatus)
#> 
#> Never smoker    Cigarette 
#>           43           86

NYCHANES data - Genus:

tse_gn <- splitByRanks(tse)$Genus
## Filter taxa with at least 1 count as abundance in at least 20% of samples
# min_n_samples <- round(ncol(tse_gn) * 0.2)
# tse_gn_subset <- tse_gn[rowSums(assay(tse_gn) >= 1) >= min_n_samples,]
tse_gn
#> class: TreeSummarizedExperiment 
#> dim: 173 129 
#> metadata(1): agglomerated_by_rank
#> assays(1): counts
#> rownames(173): Streptococcus unclassified ... Aerococcus
#>   unclassified_22
#> rowData names(8): Domain Phylum ... Species GenusID
#> colnames(129): NYDH0033 NYDH0026 ... NYDH1460 NYDH0847
#> colData names(714): KEY Burklab_ID ... INC3C DBQ_10_3CAT
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: a LinkDataFrame (173 rows)
#> rowTree: 1 phylo tree(s) (1291 leaves)
#> colLinks: NULL
#> colTree: NULL

bugphyzz data:

discrete_types <- c(
    "binary", "multistate-intersection", "multistate-union"
)
bp <- importBugphyzz(v = 0.5) |> 
    map(~ mutate(.x, NCBI_ID = as.character(NCBI_ID))) |> 
    map(~ {
        attr_type <- unique(.x$Attribute_type)
        if (attr_type %in% discrete_types) {
            df <- .x |> 
                filter(
                    !(Validation < 0.7 & Evidence == "asr")
                )
        } else if (attr_type == "numeric") {
            df <- .x |> 
                filter(
                    !(Validation < 0.5 & Evidence == "asr")
                )
        }
        df
    })

aer <- bp$aerophilicity
dim(aer)
#> [1] 27286    12

Signatures

Create signatures at the genus level:

gn_sigs <- makeSignatures(
    dat = aer, taxIdType = 'Taxon_name', taxLevel = 'genus'
) |> 
    list_flatten(name_spec = "{inner") |> 
    discard(is.null)
gn_sigs_bk <- c(gn_sigs, list(background = rownames(tse_gn)))
map(gn_sigs_bk, head)
#> $`bugphyz:aerophilicity|aerobic`
#> [1] "Flavihumibacter"  "Parasegetibacter" "Ferruginibacter"  "Fimbriimonas"    
#> [5] "Camelimonas"      "Thiothrix"       
#> 
#> $`bugphyz:aerophilicity|anaerobic`
#> [1] "Microaerobacter"      "Desulfitispora"       "Desulfurispira"      
#> [4] "Pseudoflavonifractor" "Chromatium"           "Ectothiorhodospira"  
#> 
#> $`bugphyz:aerophilicity|facultatively anaerobic`
#> [1] "Capnocytophaga" "Kistimonas"     "Trueperella"    "Telmatobacter" 
#> [5] "Alishewanella"  "Muricauda"     
#> 
#> $background
#> [1] "Streptococcus"  "unclassified"   "Blautia"        "Gemella"       
#> [5] "unclassified_1" "Abiotrophia"

Create signatures at the OTU level based on genus annotations:

genera <- rowData(tse)$Genus 
names(genera) <- rownames(tse)
otu_sigs <- lapply(gn_sigs, function(x) names(genera)[which(genera %in% x)])
otu_sigs_bk <- c(otu_sigs, list(background = rownames(tse)))
map(otu_sigs_bk, head)
#> $`bugphyz:aerophilicity|aerobic`
#> [1] "New.CleanUp.ReferenceOTU9251"  "New.CleanUp.ReferenceOTU11022"
#> [3] "New.CleanUp.ReferenceOTU11549" "New.CleanUp.ReferenceOTU11122"
#> [5] "New.CleanUp.ReferenceOTU8077"  "New.CleanUp.ReferenceOTU11146"
#> 
#> $`bugphyz:aerophilicity|anaerobic`
#> [1] "New.CleanUp.ReferenceOTU8003"  "New.CleanUp.ReferenceOTU10697"
#> [3] "New.CleanUp.ReferenceOTU10070" "New.CleanUp.ReferenceOTU8703" 
#> [5] "New.CleanUp.ReferenceOTU3192"  "New.CleanUp.ReferenceOTU3925" 
#> 
#> $`bugphyz:aerophilicity|facultatively anaerobic`
#> [1] "New.CleanUp.ReferenceOTU7367" "New.CleanUp.ReferenceOTU7623"
#> [3] "New.ReferenceOTU195"          "New.CleanUp.ReferenceOTU2376"
#> [5] "New.CleanUp.ReferenceOTU3539" "New.CleanUp.ReferenceOTU7335"
#> 
#> $background
#> [1] "New.CleanUp.ReferenceOTU7367" "New.CleanUp.ReferenceOTU7623"
#> [3] "New.ReferenceOTU195"          "New.CleanUp.ReferenceOTU2376"
#> [5] "New.CleanUp.ReferenceOTU3539" "New.CleanUp.ReferenceOTU7335"
max_sig_size <- max(map_int(c(otu_sigs_bk, gn_sigs_bk), length))
max_sig_size
#> [1] 2422

Current value:

configEBrowser(key="GS.MAX.SIZE")
#> [1] 500

New max.size value:

configEBrowser(key="GS.MAX.SIZE", value = max_sig_size)
configEBrowser(key="GS.MAX.SIZE")
#> [1] 2422

Enrichment analysis at the OTU level

Differential abundance:

tse$GROUP <- ifelse(
  tse$smokingstatus == 'Never smoker', 0, 1
)
edger <- deAna(
  expr = tse, de.method = 'edgeR', padj.method = 'fdr', 
  filter.by.expr = FALSE
)
edger_norm <- limmaVoom(edger)

Enrichment (GSEA)

gsea <- sbea(
  method = 'gsea', se = edger_norm, gs = otu_sigs, perm = 1000, alpha = 0.1 # This is for DA taxa
)
gsea_res <- as.data.frame(gsea$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(gsea_res)

Enrichment (ORA)

Significant (mixed) vs Non-Significant

ora <- sbea(
  method = 'ora', se = edger, gs = otu_sigs_bk, perm = 0, 
  alpha = 0.1 # This is for DA taxa
)
ora_res <- as.data.frame(ora$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    filter(GENE.SET != "background") |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(ora_res)

Significant over-abundant vs Reference

edger_up <- edger
rowData(edger_up)$ADJ.PVAL <- ifelse(
  rowData(edger_up)$FC < 0, 1, rowData(edger_up)$ADJ.PVAL
)
ora_up <- sbea(
  method = 'ora', se = edger_up, gs = otu_sigs_bk, perm = 0, alpha = 0.1 # For DA taxa
)
ora_up_res <- as.data.frame(ora_up$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    filter(GENE.SET != "background") |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(ora_up_res)

Significant under-abundant vs Reference

edger_down <- edger
rowData(edger_down)$ADJ.PVAL <- ifelse(
  rowData(edger_down)$FC < 1, 0, rowData(edger_down)$ADJ.PVAL
)
ora_down <- sbea(
  method = 'ora', se = edger_down, gs = otu_sigs_bk, perm = 0, 
  alpha = 0.1 # For DA taxa
)
ora_down_res <- as.data.frame(ora_down$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    filter(GENE.SET != "background") |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(ora_down_res)

Analysis at the genus level with bugphyzz signatures

Differential abundance analysis

tse_gn$GROUP <- ifelse(
  tse_gn$smokingstatus == 'Never smoker', 0, 1
)
edger_gn <- deAna(
    expr = tse_gn, de.method = 'edgeR', padj.method = 'BH', 
    filter.by.expr = FALSE, 
)
## This step is to avoid filtering out several taxa from the
## next analysis (GSEA)
edger_gn <- limmaVoom(edger_gn)

Enrichment GSEA

gsea_gn <- sbea(
  method = 'gsea', se = edger_gn, gs = gn_sigs, perm = 1000,
  alpha = 0.1 # This FDR is for DA taxa
)
gsea_gn_res <- as.data.frame(gsea_gn$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(gsea_gn_res)

Enrichment ORA

Significant (mixing up and down) vs Non-Significant

gn_sigs_bk <- c(gn_sigs, list(background = rownames(edger_gn)))
ora_gn <- sbea(
  method = 'ora', se = edger_gn, gs = gn_sigs_bk, perm = 0, 
  alpha = 0.1 # This is for significant genes in the SE
)
ora_gn_res <- as.data.frame(ora_gn$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    filter(GENE.SET != "background") |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(ora_gn_res)

Significant over-abundant vs Reference

edger_gn_up <- edger_gn
rowData(edger_gn_up)$ADJ.PVAL <- ifelse(
  rowData(edger_gn_up)$FC < 0, 1, rowData(edger_gn_up)$ADJ.PVAL
)
ora_gn_up <- sbea(
  method = 'ora', se = edger_gn_up, gs = gn_sigs_bk, alpha = 0.1, perm = 0, 
  padj.method = 'BH'
)
ora_gn_up_res <- as.data.frame(ora_gn_up$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    filter(GENE.SET != "background") |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(ora_gn_up_res)

Significant under-abundant vs Reference

edger_gn_down <- edger_gn
rowData(edger_gn_down)$ADJ.PVAL <- ifelse(
  rowData(edger_gn_down)$FC < 1, 0, rowData(edger_gn_down)$ADJ.PVAL
)
ora_gn_down <- sbea(
  method = 'ora', se = edger_gn_down, gs = gn_sigs_bk, alpha = 0.1, perm = 0, 
  padj.method = 'BH'
)
ora_gn_down_res <- as.data.frame(ora_gn_down$res.tbl) |> 
    mutate(GENE.SET = ifelse(PVAL < 0.05, paste0(GENE.SET, "*"), GENE.SET)) |> 
    filter(GENE.SET != "background") |> 
    mutate(PVAL = round(PVAL, 3))
myDataTable(ora_gn_down_res)

dbBact

row_data <- edger |> 
    rowData() |> 
    as.data.frame() |> 
    tibble::rownames_to_column(var = "OTU") |> 
    as_tibble()
    
otus_case <- row_data |> 
    filter(FC > 0, ADJ.PVAL < 0.1) |> 
    pull(OTU)
attr(otus_case, "nexp") <- 1

otus_control <- row_data |> 
    filter(FC < 0, ADJ.PVAL < 0.1) |> 
    pull(OTU)
attr(otus_control, "nexp") <- 1

dbBact - OTUs

otus_control_list <- map(otu_sigs, ~ as.integer(otus_control %in% .x))
otus_case_list <- map(otu_sigs, ~ as.integer(otus_case %in% .x))

wpvals <- map2_dbl(
    .x = otus_control_list,
    .y = otus_case_list,
    .f = ~ round(wilcox.test(.x, .y, exact = FALSE)$p.value, 3)
)
es <- map2_dbl(
    .x = otus_control_list,
    .y = otus_case_list,
    .f = ~ mean(.y) - mean(.x)
)

tibble(
    sigs = names(otu_sigs),
    p_value = unname(wpvals),
    es = unname(es)
) |> 
    myDataTable()

dbBact - genus - BugSigDB 727

bsdb <- importBugSigDB() |> 
    as_tibble()
tob_sigs <- bsdb |> 
    filter(`BSDB ID` %in% c("bsdb:727/1/1", "bsdb:727/1/2")) |> 
    getSignatures(tax.id.type = "taxname", tax.level = "genus") |> 
    set_names(c("control", "case"))


tob_con_list <- map(gn_sigs, ~ as.integer(tob_sigs$control %in% .x))
tob_cas_list <- map(gn_sigs, ~ as.integer(tob_sigs$case %in% .x))

tob_wpvals <- map2_dbl(
    .x = tob_con_list,
    .y = tob_cas_list,
    .f = ~ round(wilcox.test(.x, .y, exact = FALSE)$p.value, 3)
)
tob_es <- map2_dbl(
    .x = tob_con_list,
    .y = tob_cas_list,
    .f = ~ mean(.y) - mean(.x)
)

tibble(
    sigs = names(gn_sigs),
    p_value = unname(tob_wpvals),
    es = unname(tob_es)
) |> 
    myDataTable()

Extra

biosis <- importBiosis() |> 
  {\(y) split(y, factor(y$Attribute))}() |> 
  lapply(function(x) unique(x$Genus))
taxa_names <- rownames(tse_gn)
df1 <- map_dbl(biosis, function(x) mean(taxa_names %in% x) * 100) |> 
  as.data.frame() |> 
  tibble::rownames_to_column() |> 
  set_names(c('Attribute', 'n'))
df2 <- map_dbl(gn_sigs, function(x) mean(taxa_names %in% x) * 100) |> 
  as.data.frame() |> 
  tibble::rownames_to_column() |> 
  set_names(c('Attribute', 'n'))
df <- rbind(df1, df2)
df
#>                                       Attribute        n
#> 1                                       aerobic 16.18497
#> 2                                     anaerobic 41.61850
#> 3                       facultatively_anaerobic 13.29480
#> 4                 bugphyz:aerophilicity|aerobic 20.23121
#> 5               bugphyz:aerophilicity|anaerobic 34.10405
#> 6 bugphyz:aerophilicity|facultatively anaerobic 11.56069
## Annotated
x <- map(biosis, function(x) taxa_names[which(taxa_names %in% x)])
y <- map(gn_sigs, function(x) taxa_names[which(taxa_names %in% x)])

z <- map2(x, y, ~ {
  inboth <- intersect(.x, .y)
  inbio <- setdiff(.x, .y)
  inbp <- setdiff(.y, .x)
  return(
    list(both = inboth, bp = inbp, bio = inbio)
  )
})

## just in biosis
justInBio <- map(z, ~ .x$bio)

Session information

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-06-28
#>  pandoc   3.2 @ /usr/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package                  * version   date (UTC) lib source
#>  abind                      1.4-5     2016-07-21 [1] RSPM (R 4.4.0)
#>  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)
#>  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)
#>  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)
#>  Biostrings               * 2.72.1    2024-06-02 [1] Bioconductor 3.19 (R 4.4.1)
#>  bit                        4.0.5     2022-11-15 [1] RSPM (R 4.4.0)
#>  bit64                      4.0.5     2020-08-30 [1] RSPM (R 4.4.0)
#>  bitops                     1.0-7     2021-04-24 [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)
#>  bslib                      0.7.0     2024-03-29 [1] RSPM (R 4.4.0)
#>  bugphyzz                 * 0.99.3    2024-06-28 [1] Github (waldronlab/bugphyzz@8fc1c6d)
#>  bugphyzzAnalyses         * 0.1.19    2024-06-28 [1] local
#>  bugsigdbr                * 1.10.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  cachem                     1.1.0     2024-05-16 [1] RSPM (R 4.4.0)
#>  cli                        3.6.3     2024-06-21 [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)
#>  colorspace                 2.1-0     2023-01-23 [1] RSPM (R 4.4.0)
#>  crayon                     1.5.3     2024-06-20 [1] RSPM (R 4.4.0)
#>  crosstalk                  1.2.1     2023-11-23 [1] RSPM (R 4.4.0)
#>  curl                       5.2.1     2024-03-01 [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)
#>  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)
#>  desc                       1.4.3     2023-12-10 [1] RSPM (R 4.4.0)
#>  digest                     0.6.36    2024-06-23 [1] RSPM (R 4.4.0)
#>  DirichletMultinomial       1.46.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  dplyr                    * 1.1.4     2023-11-17 [1] RSPM (R 4.4.0)
#>  DT                         0.33      2024-04-04 [1] RSPM (R 4.4.0)
#>  edgeR                      4.2.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  EnrichmentBrowser        * 2.34.1    2024-05-06 [1] Bioconductor 3.19 (R 4.4.1)
#>  evaluate                   0.24.0    2024-06-10 [1] RSPM (R 4.4.0)
#>  fansi                      1.0.6     2023-12-08 [1] RSPM (R 4.4.0)
#>  fastmap                    1.2.0     2024-05-15 [1] RSPM (R 4.4.0)
#>  filelock                   1.0.3     2023-12-11 [1] RSPM (R 4.4.0)
#>  fs                         1.6.4     2024-04-25 [1] RSPM (R 4.4.0)
#>  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)
#>  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.5     2024-01-10 [1] RSPM (R 4.4.0)
#>  glue                       1.7.0     2024-01-09 [1] RSPM (R 4.4.0)
#>  graph                    * 1.82.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  gridExtra                  2.3       2017-09-09 [1] RSPM (R 4.4.0)
#>  GSEABase                   1.66.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  gtable                     0.3.5     2024-04-22 [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)
#>  httr                       1.4.7     2023-08-15 [1] RSPM (R 4.4.0)
#>  httr2                      1.0.1     2024-04-01 [1] RSPM (R 4.4.0)
#>  igraph                     2.0.3     2024-03-13 [1] RSPM (R 4.4.0)
#>  IRanges                  * 2.38.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  irlba                      2.3.5.1   2022-10-03 [1] RSPM (R 4.4.0)
#>  jquerylib                  0.1.4     2021-04-26 [1] RSPM (R 4.4.0)
#>  jsonlite                   1.8.8     2023-12-04 [1] RSPM (R 4.4.0)
#>  KEGGgraph                  1.64.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  KEGGREST                   1.44.1    2024-06-19 [1] Bioconductor 3.19 (R 4.4.1)
#>  knitr                      1.47      2024-05-29 [1] RSPM (R 4.4.0)
#>  lattice                    0.22-6    2024-03-20 [2] 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 [1] RSPM (R 4.4.0)
#>  limma                      3.60.3    2024-06-16 [1] Bioconductor 3.19 (R 4.4.1)
#>  locfit                     1.5-9.10  2024-06-24 [1] RSPM (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] RSPM (R 4.4.0)
#>  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)
#>  matrixStats              * 1.3.0     2024-04-11 [1] RSPM (R 4.4.0)
#>  memoise                    2.0.1     2021-11-26 [1] RSPM (R 4.4.0)
#>  mgcv                       1.9-1     2023-12-21 [2] CRAN (R 4.4.1)
#>  mia                      * 1.12.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  MultiAssayExperiment     * 1.30.2    2024-05-29 [1] Bioconductor 3.19 (R 4.4.1)
#>  munsell                    0.5.1     2024-04-01 [1] RSPM (R 4.4.0)
#>  nlme                       3.1-165   2024-06-06 [2] RSPM (R 4.4.0)
#>  permute                    0.9-7     2022-01-27 [1] RSPM (R 4.4.0)
#>  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.0.9     2024-04-18 [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)
#>  purrr                    * 1.0.2     2023-08-10 [1] RSPM (R 4.4.0)
#>  R6                         2.5.1     2021-08-19 [1] RSPM (R 4.4.0)
#>  ragg                       1.3.2     2024-05-15 [1] RSPM (R 4.4.0)
#>  rappdirs                   0.3.3     2021-01-31 [1] RSPM (R 4.4.0)
#>  Rcpp                       1.0.12    2024-01-09 [1] RSPM (R 4.4.0)
#>  RCurl                      1.98-1.14 2024-01-09 [1] RSPM (R 4.4.0)
#>  reshape2                   1.4.4     2020-04-09 [1] RSPM (R 4.4.0)
#>  Rgraphviz                  2.48.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.27      2024-05-17 [1] RSPM (R 4.4.0)
#>  RSQLite                    2.3.7     2024-05-27 [1] RSPM (R 4.4.0)
#>  rsvd                       1.0.5     2021-04-16 [1] RSPM (R 4.4.0)
#>  S4Arrays                   1.4.1     2024-05-20 [1] Bioconductor 3.19 (R 4.4.1)
#>  S4Vectors                * 0.42.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  safe                       3.44.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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)
#>  SingleCellExperiment     * 1.26.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  SparseArray                1.4.8     2024-05-24 [1] Bioconductor 3.19 (R 4.4.1)
#>  SparseM                    1.84      2024-06-25 [1] RSPM (R 4.4.0)
#>  sparseMatrixStats          1.16.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#>  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)
#>  systemfonts                1.1.0     2024-05-15 [1] RSPM (R 4.4.0)
#>  textshaping                0.4.0     2024-05-24 [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)
#>  tidytree                   0.4.6     2023-12-12 [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)
#>  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)
#>  vctrs                      0.6.5     2023-12-01 [1] RSPM (R 4.4.0)
#>  vegan                      2.6-6.1   2024-05-21 [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.0     2024-01-16 [1] RSPM (R 4.4.0)
#>  xfun                       0.45      2024-06-16 [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.8     2023-12-11 [1] RSPM (R 4.4.0)
#>  yulab.utils                0.1.4     2024-01-28 [1] RSPM (R 4.4.0)
#>  zlibbioc                   1.50.0    2024-04-30 [1] Bioconductor 3.19 (R 4.4.1)
#> 
#>  [1] /usr/local/lib/R/site-library
#>  [2] /usr/local/lib/R/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────