vignettes/articles/nychanes.Rmd
nychanes.Rmd
library(bugphyzzAnalyses)
library(bugphyzz)
library(mia)
library(dplyr)
library(EnrichmentBrowser)
library(purrr)
library(bugsigdbr)
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 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
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"
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
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)
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)
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)
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)
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)
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
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()
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()
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)
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
#>
#> ──────────────────────────────────────────────────────────────────────────────