bugsigdbr 1.2.2
BugSigDB is a manually curated database of microbial signatures from the published literature of differential abundance studies of human and other host microbiomes.
BugSigDB provides:
The bugsigdbr package implements convenient access to BugSigDB from within R/Bioconductor. The goal of the package is to facilitate import of BugSigDB data into R/Bioconductor, provide utilities for extracting microbe signatures, and enable export of the extracted signatures to plain text files in standard file formats such as GMT.
The bugsigdbr package is primarily a data package. For descriptive statistics and comprehensive analysis of BugSigDB contents, please see the BugSigDBStats package and analysis vignette.
We start by loading the package.
library(bugsigdbr)
The function importBugSigDB
can be used to import the complete collection of
curated signatures from BugSigDB. The dataset is downloaded once and
subsequently cached. Use cache = FALSE
to force a fresh download of BugSigDB
and overwrite the local copy in your cache.
bsdb <- importBugSigDB()
dim(bsdb)
#> [1] 2270 48
colnames(bsdb)
#> [1] "Study" "Study design"
#> [3] "PMID" "DOI"
#> [5] "URL" "Authors list"
#> [7] "Title" "Journal"
#> [9] "Year" "Experiment"
#> [11] "Location of subjects" "Host species"
#> [13] "Body site" "UBERON ID"
#> [15] "Condition" "EFO ID"
#> [17] "Group 0 name" "Group 1 name"
#> [19] "Group 1 definition" "Group 0 sample size"
#> [21] "Group 1 sample size" "Antibiotics exclusion"
#> [23] "Sequencing type" "16S variable region"
#> [25] "Sequencing platform" "Statistical test"
#> [27] "Significance threshold" "MHT correction"
#> [29] "LDA Score above" "Matched on"
#> [31] "Confounders controlled for" "Pielou"
#> [33] "Shannon" "Chao1"
#> [35] "Simpson" "Inverse Simpson"
#> [37] "Richness" "Signature page name"
#> [39] "Source" "Curated date"
#> [41] "Curator" "Revision editor"
#> [43] "Description" "Abundance in Group 1"
#> [45] "MetaPhlAn taxon names" "NCBI Taxonomy IDs"
#> [47] "State" "Reviewer"
Each row of the resulting data.frame
corresponds to a microbe signature from
differential abundance analysis, i.e. a set of microbes that has been found
with increased or decreased abundance in one sample group when compared to
another sample group (eg. in a case-vs.-control setup).
The curated signatures are richly annotated with additional metadata columns
providing information on study design, antibiotics exclusion criteria,
sample size, and experimental and statistical procedures, among others.
Subsetting the full dataset to certain conditions, body sites, or other
metadata columns of interest can be done along the usual lines for
subsetting data.frame
s.
For example, the following subset
command restricts the dataset to signatures
obtained from microbiome studies on obesity, based on fecal samples from
participants in the US.
us.obesity.feces <- subset(bsdb,
`Location of subjects` == "United States of America" &
Condition == "obesity" &
`Body site` == "feces")
Given the full BugSigDB collection (or a subset of interest), the function
getSignatures
can be used to obtain the microbes annotated to each signature.
Microbes annotated to a signature are returned following the NCBI Taxonomy nomenclature per default.
sigs <- getSignatures(bsdb)
length(sigs)
#> [1] 2270
sigs[1:3]
#> $`bsdb:1/1/1_adenoma:conventional-adenoma-cases_vs_controls_UP`
#> [1] "91061" "1236" "1654" "1716" "1301" "162289" "189330" "33024"
#> [9] "40544" "2037" "2049" "506" "186826" "1300" "31977" "91347"
#> [17] "1653" "57037" "1386" "186817"
#>
#> $`bsdb:1/1/2_adenoma:conventional-adenoma-cases_vs_controls_DOWN`
#> [1] "100883" "1117"
#>
#> $`bsdb:1/2/1_Hyperplastic-Polyp:hyperplastic-polyp-cases_vs_controls_UP`
#> [1] "207244" "57037"
It is also possible obtain signatures based on the full taxonomic classification in MetaPhlAn format …
mp.sigs <- getSignatures(bsdb, tax.id.type = "metaphlan")
mp.sigs[1:3]
#> $`bsdb:1/1/1_adenoma:conventional-adenoma-cases_vs_controls_UP`
#> [1] "k__Bacteria|p__Firmicutes|c__Bacilli"
#> [2] "k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria"
#> [3] "k__Bacteria|p__Actinobacteria|c__Actinomycetia|o__Actinomycetales|f__Actinomycetaceae|g__Actinomyces"
#> [4] "k__Bacteria|p__Actinobacteria|c__Actinomycetia|o__Corynebacteriales|f__Corynebacteriaceae|g__Corynebacterium"
#> [5] "k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Streptococcaceae|g__Streptococcus"
#> [6] "k__Bacteria|p__Firmicutes|c__Tissierellia|o__Tissierellales|f__Peptoniphilaceae|g__Peptoniphilus"
#> [7] "k__Bacteria|p__Firmicutes|c__Clostridia|o__Eubacteriales|f__Lachnospiraceae|g__Dorea"
#> [8] "k__Bacteria|p__Firmicutes|c__Negativicutes|o__Acidaminococcales|f__Acidaminococcaceae|g__Phascolarctobacterium"
#> [9] "k__Bacteria|p__Proteobacteria|c__Betaproteobacteria|o__Burkholderiales|f__Sutterellaceae|g__Sutterella"
#> [10] "k__Bacteria|p__Actinobacteria|c__Actinomycetia|o__Actinomycetales"
#> [11] "k__Bacteria|p__Actinobacteria|c__Actinomycetia|o__Actinomycetales|f__Actinomycetaceae"
#> [12] "k__Bacteria|p__Proteobacteria|c__Betaproteobacteria|o__Burkholderiales|f__Alcaligenaceae"
#> [13] "k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales"
#> [14] "k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Streptococcaceae"
#> [15] "k__Bacteria|p__Firmicutes|c__Negativicutes|o__Veillonellales|f__Veillonellaceae"
#> [16] "k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales"
#> [17] "k__Bacteria|p__Actinobacteria|c__Actinomycetia|o__Corynebacteriales|f__Corynebacteriaceae"
#> [18] "k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Lactobacillaceae|g__Lacticaseibacillus|s__Lacticaseibacillus zeae"
#> [19] "k__Bacteria|p__Firmicutes|c__Bacilli|o__Bacillales|f__Bacillaceae|g__Bacillus"
#> [20] "k__Bacteria|p__Firmicutes|c__Bacilli|o__Bacillales|f__Bacillaceae"
#>
#> $`bsdb:1/1/2_adenoma:conventional-adenoma-cases_vs_controls_DOWN`
#> [1] "k__Bacteria|p__Firmicutes|c__Erysipelotrichia|o__Erysipelotrichales|f__Coprobacillaceae|g__Coprobacillus"
#> [2] "k__Bacteria|p__Cyanobacteria"
#>
#> $`bsdb:1/2/1_Hyperplastic-Polyp:hyperplastic-polyp-cases_vs_controls_UP`
#> [1] "k__Bacteria|p__Firmicutes|c__Clostridia|o__Eubacteriales|f__Lachnospiraceae|g__Anaerostipes"
#> [2] "k__Bacteria|p__Firmicutes|c__Bacilli|o__Lactobacillales|f__Lactobacillaceae|g__Lacticaseibacillus|s__Lacticaseibacillus zeae"
… or using the taxonomic name only:
tn.sigs <- getSignatures(bsdb, tax.id.type = "taxname")
tn.sigs[1:3]
#> $`bsdb:1/1/1_adenoma:conventional-adenoma-cases_vs_controls_UP`
#> [1] "Bacilli" "Gammaproteobacteria"
#> [3] "Actinomyces" "Corynebacterium"
#> [5] "Streptococcus" "Peptoniphilus"
#> [7] "Dorea" "Phascolarctobacterium"
#> [9] "Sutterella" "Actinomycetales"
#> [11] "Actinomycetaceae" "Alcaligenaceae"
#> [13] "Lactobacillales" "Streptococcaceae"
#> [15] "Veillonellaceae" "Enterobacterales"
#> [17] "Corynebacteriaceae" "Lacticaseibacillus zeae"
#> [19] "Bacillus" "Bacillaceae"
#>
#> $`bsdb:1/1/2_adenoma:conventional-adenoma-cases_vs_controls_DOWN`
#> [1] "Coprobacillus" "Cyanobacteria"
#>
#> $`bsdb:1/2/1_Hyperplastic-Polyp:hyperplastic-polyp-cases_vs_controls_UP`
#> [1] "Anaerostipes" "Lacticaseibacillus zeae"
As metagenomic profiling with 16S RNA sequencing or whole-metagenome shotgun sequencing is typically conducted on a certain taxonomic level, it is also possible to obtain signatures restricted to eg. the genus level …
gn.sigs <- getSignatures(bsdb,
tax.id.type = "taxname",
tax.level = "genus")
gn.sigs[1:3]
#> $`bsdb:1/1/1_adenoma:conventional-adenoma-cases_vs_controls_UP`
#> [1] "Actinomyces" "Corynebacterium" "Streptococcus"
#> [4] "Peptoniphilus" "Dorea" "Phascolarctobacterium"
#> [7] "Sutterella" "Bacillus"
#>
#> $`bsdb:1/1/2_adenoma:conventional-adenoma-cases_vs_controls_DOWN`
#> [1] "Coprobacillus"
#>
#> $`bsdb:1/2/1_Hyperplastic-Polyp:hyperplastic-polyp-cases_vs_controls_UP`
#> [1] "Anaerostipes"
… or the species level:
gn.sigs <- getSignatures(bsdb,
tax.id.type = "taxname",
tax.level = "species")
gn.sigs[1:3]
#> $`bsdb:1/1/1_adenoma:conventional-adenoma-cases_vs_controls_UP`
#> [1] "Lacticaseibacillus zeae"
#>
#> $`bsdb:1/2/1_Hyperplastic-Polyp:hyperplastic-polyp-cases_vs_controls_UP`
#> [1] "Lacticaseibacillus zeae"
#>
#> $`bsdb:1/6/1_adenoma:Non-advanced-conventional-adenoma-cases_vs_controls_UP`
#> [1] "Lacticaseibacillus zeae"
Note that restricting signatures to microbes given at the genus level, will per default exclude microbes given at a more specific taxonomic rank such as species or strain.
For certain applications, it might be desirable to not exclude microbes given
at a more specific taxonomic rank, but rather extract the more general
tax.level
for microbes given at a more specific taxonomic level.
This can be achieved by setting the argument exact.tax.level
to FALSE
,
which will here extract genus level taxon names, for taxa given at the species
or strain level.
gn.sigs <- getSignatures(bsdb,
tax.id.type = "taxname",
tax.level = "genus",
exact.tax.level = FALSE)
gn.sigs[1:3]
#> $`bsdb:1/1/1_adenoma:conventional-adenoma-cases_vs_controls_UP`
#> [1] "Actinomyces" "Corynebacterium" "Streptococcus"
#> [4] "Peptoniphilus" "Dorea" "Phascolarctobacterium"
#> [7] "Sutterella" "Lacticaseibacillus" "Bacillus"
#>
#> $`bsdb:1/1/2_adenoma:conventional-adenoma-cases_vs_controls_DOWN`
#> [1] "Coprobacillus"
#>
#> $`bsdb:1/2/1_Hyperplastic-Polyp:hyperplastic-polyp-cases_vs_controls_UP`
#> [1] "Anaerostipes" "Lacticaseibacillus"
Once signatures have been extracted using a taxonomic identifier type of
choice, the function writeGMT
allows to write the signatures to plain text
files in GMT format.
writeGMT(sigs, gmt.file = "bugsigdb_signatures.gmt")
This is the standard file format for gene sets used by MSigDB and GeneSigDB and is compatible with most enrichment analysis software.
Leveraging BugSigDB’s semantic MediaWiki web interface, we can also programmatically access annotations for individual microbes and microbe signatures.
The browseSignature
function can be used to display BugSigDB signature pages
in an interactive session. For programmatic access in a non-interactive
setting, the URL of the signature page is returned.
browseSignature(names(sigs)[1])
#> [1] "https://bugsigdb.org/Study_1/Experiment_1/Signature_1"
Analogously, the browseTaxon
function displays BugSigDB taxon pages in an
interactive session, or the URL of the corresponding taxon page otherwise.
browseTaxon(sigs[[1]][1])
#> [1] "https://bugsigdb.org/Special:RunQuery/Taxon?Taxon%5BNCBI%5D=91061&_run=1"
The Semantic MediaWiki curation interface at bugsigdb.org enforces metadata annotation of signatures to follow established ontologies such as the Experimental Factor Ontology (EFO) for condition, and the Uber-Anatomy Ontology (UBERON) for body site.
The getOntology
function can be used to import both ontologies into R.
The result is an object of class ontology_index
from the
ontologyIndex
package.
efo <- getOntology("efo")
#> Loading required namespace: ontologyIndex
#> Using cached version from 2021-12-13 20:51:36
efo
#> Ontology with 30631 terms
#>
#> format-version: 1.2
#> data-version: http://www.ebi.ac.uk/efo/releases/v3.45.0/efo.owl
#> ontology: http://www.ebi.ac.uk/efo/efo.owl
#>
#> Properties:
#> id: character
#> name: character
#> parents: list
#> children: list
#> ancestors: list
#> obsolete: logical
#> equivalent_to: list
#> Roots:
#> EFO:0000001 - experimental factor
#> EFO:0000824 - relationship
#> RO:0000053 - bearer_of
#> RO:0000057 - has_participant
#> has_part - has part
#> RO:0000056 - participates_in
#> RO:0002502 - depends on
#> disease_has_feature - disease has feature
#> located_in - located_in
#> location_of - location_of
#> ... 43 more
uberon <- getOntology("uberon")
#> Using cached version from 2021-12-28 20:52:00
uberon
#> Ontology with 14107 terms
#>
#> format-version: 1.2
#> data-version: releases/2020-09-16
#> default-namespace: uberon
#> ontology: uberon
#>
#> Properties:
#> id: character
#> name: character
#> parents: list
#> children: list
#> ancestors: list
#> obsolete: logical
#> Roots:
#> part_of - part of
#> has_part - has part
#> functionally_related_to - functionally related to
#> UBERON:0001062 - anatomical entity
#> adjacent_to - adjacent_to
#> UBERON:0000000 - processual entity
#> anterior_to - anterior_to
#> posterior_to - posterior_to
#> attaches_to_part_of - attaches_to_part_of
#> bearer_of - bearer of
#> ... 127 more
As demonstrated above, subsets of BugSigDB signatures can be obtained for signatures
associated with certain experimental factors or specific body sites of interest.
Higher-level queries can be performed with the subsetByOntology
function, which
implements subsetting by more general ontology terms. This facilitates grouping
of signatures that semantically belong together.
More specifically, subsetting BugSigDB signatures by an EFO term then involves
subsetting the Condition
column to all descendants of that term in the EFO
ontology and that are present in the Condition
column. Here, we demonstrate
the usage by subsetting to signatures associated with cancer.
sdf <- subsetByOntology(bsdb,
column = "Condition",
term = "cancer",
ontology = efo)
dim(sdf)
#> [1] 305 48
table(sdf[,"Condition"])
#>
#> Genital neoplasm, female
#> 2
#> HER2 Positive Breast Carcinoma
#> 2
#> acute myeloid leukemia
#> 10
#> breast cancer
#> 4
#> breast carcinoma
#> 4
#> cervical cancer
#> 19
#> cervical glandular intraepithelial neoplasia,cervical cancer
#> 1
#> colorectal cancer
#> 50
#> colorectal carcinoma
#> 2
#> digestive system cancer
#> 2
#> endometrial cancer
#> 4
#> esophageal cancer
#> 10
#> esophageal squamous cell carcinoma
#> 4
#> gastric adenocarcinoma
#> 6
#> gastric cancer
#> 61
#> gastric carcinoma
#> 2
#> head and neck carcinoma
#> 7
#> hepatocellular carcinoma
#> 4
#> human papilloma virus infection,cervical cancer
#> 2
#> lung cancer
#> 23
#> multiple myeloma
#> 10
#> non-small cell lung carcinoma,renal cell carcinoma
#> 5
#> oral squamous cell carcinoma
#> 6
#> ovarian cancer
#> 4
#> pancreatic carcinoma
#> 17
#> prostate cancer
#> 6
#> squamous cell carcinoma
#> 36
#> thyroid carcinoma
#> 2
And analogously, subsetting by an UBERON term will involves subsetting the
Body site
column to all descendants of that term in the UBERON ontology and
that are present in the Body site
column. For example, we can use subsetByOntology
to subset to signatures for which microbiome samples have been obtained from
parts of the digestive system.
sdf <- subsetByOntology(bsdb,
column = "Body site",
term = "digestive system",
ontology = uberon)
dim(sdf)
#> [1] 410 48
table(sdf[,"Body site"])
#>
#> Major salivary gland
#> 1
#> bronchus,mouth
#> 2
#> buccal mucosa
#> 6
#> buccal mucosa,lower lip
#> 8
#> caecum
#> 15
#> colon
#> 19
#> colonic mucosa
#> 2
#> dental plaque
#> 13
#> digestive system,digestive tract,lower digestive tract
#> 20
#> feces,mouth
#> 4
#> feces,mucosa of small intestine
#> 4
#> feces,stomach,caecum,small intestine,colon
#> 2
#> gingiva
#> 5
#> hypopharynx
#> 1
#> ileum
#> 2
#> mouth
#> 57
#> mouth,skin of cheek,tongue,gingiva,oropharynx
#> 2
#> mucosa of small intestine,feces
#> 3
#> mucosa of stomach
#> 3
#> nasopharynx
#> 38
#> nasopharynx,oropharynx
#> 8
#> nose,mouth
#> 2
#> oral gland
#> 51
#> oropharynx
#> 24
#> rectum
#> 24
#> saliva-secreting gland
#> 2
#> small intestine
#> 10
#> sputum,mouth
#> 2
#> stomach
#> 41
#> subgingival dental plaque
#> 11
#> tongue
#> 28
sessionInfo()
#> R version 4.2.1 (2022-06-23)
#> Platform: x86_64-pc-linux-gnu (64-bit)
#> Running under: Ubuntu 20.04.5 LTS
#>
#> Matrix products: default
#> BLAS: /home/biocbuild/bbs-3.15-bioc/R/lib/libRblas.so
#> LAPACK: /home/biocbuild/bbs-3.15-bioc/R/lib/libRlapack.so
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_GB LC_COLLATE=C
#> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
#> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
#> [9] LC_ADDRESS=C LC_TELEPHONE=C
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] bugsigdbr_1.2.2 BiocStyle_2.24.0
#>
#> loaded via a namespace (and not attached):
#> [1] Rcpp_1.0.9 bslib_0.4.0 compiler_4.2.1
#> [4] pillar_1.8.1 BiocManager_1.30.18 jquerylib_0.1.4
#> [7] dbplyr_2.2.1 tools_4.2.1 digest_0.6.29
#> [10] bit_4.0.4 tibble_3.1.8 jsonlite_1.8.0
#> [13] BiocFileCache_2.4.0 RSQLite_2.2.16 evaluate_0.16
#> [16] memoise_2.0.1 lifecycle_1.0.1 pkgconfig_2.0.3
#> [19] rlang_1.0.5 DBI_1.1.3 cli_3.4.0
#> [22] filelock_1.0.2 curl_4.3.2 yaml_2.3.5
#> [25] xfun_0.32 fastmap_1.1.0 httr_1.4.4
#> [28] stringr_1.4.1 dplyr_1.0.10 knitr_1.40
#> [31] rappdirs_0.3.3 generics_0.1.3 sass_0.4.2
#> [34] vctrs_0.4.1 tidyselect_1.1.2 bit64_4.0.5
#> [37] glue_1.6.2 R6_2.5.1 ontologyIndex_2.10
#> [40] fansi_1.0.3 rmarkdown_2.16 bookdown_0.28
#> [43] purrr_0.3.4 blob_1.2.3 magrittr_2.0.3
#> [46] ellipsis_0.3.2 htmltools_0.5.3 assertthat_0.2.1
#> [49] utf8_1.2.2 stringi_1.7.8 cachem_1.0.6