miaSim: Microbiome Data Simulation

Introduction

miaSim implements tools for microbiome data simulation based on varying ecological modeling assumptions. These can be used to simulate species abundance matrices, including time series. Detailed function documentation is available at the function reference

The miaSim package supports the R/Bioconductor framework based on the TreeSummarizedExperiment data container. For more information on operating with this data format in microbial ecology, see the online tutorial.

Installation

The stable Bioconductor release version can be installed as follows.

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
if (!requireNamespace("miaSim", quietly = TRUE))    
    BiocManager::install("miaSim")

The experimental Bioconductor devel version can be installed as follows.

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")
# The following initializes usage of Bioc devel
BiocManager::install(version='devel')
BiocManager::install("miaSim")

Load the library

library(miaSim)

Examples

Generating species interaction matrices

Some of the models rely on interaction matrices that represents interaction heterogeneity between species. The interaction matrix can be generated with different distributional assumptions.

Generate interactions from normal distribution:

A_normal <- powerlawA(n_species = 4, alpha = 3)

Generate interactions from uniform distribution:

A_uniform <- randomA(n_species = 10,
                 diagonal = -0.4,
                     connectance = 0.5,
             interactions = runif(n = 10^2, min = -0.8, max = 0.8))

Ricker model

Ricker model is a discrete version of the gLV:

tse_ricker <- simulateRicker(n_species=4, A = A_normal, t_end=100, norm = FALSE)

The number of species specified in the interaction matrix must be the same as the species used in the models.

Hubbell model

Hubbell Neutral simulation model characterizes diversity and relative abundance of species in ecological communities assuming migration, births and deaths but no interactions. Losses become replaced by migration or birth.

tse_hubbell <- simulateHubbell(n_species = 8,
                               M = 10,
                   carrying_capacity = 1000,
                               k_events = 50,
                   migration_p = 0.02,
                   t_end = 100)

One can also simulate parameters for the Hubbell model.

params_hubbell <- simulateHubbellRates(x0 = c(0,5,10),
    migration_p = 0.1, metacommunity_probability = NULL, k_events = 1, 
    growth_rates = NULL, norm = FALSE, t_end=1000)

Self-Organised Instability (SOI)

The Self-Organised Instability (SOI) model generates time series for communities and accelerates stochastic simulation.

tse_soi <- simulateSOI(n_species = 4, carrying_capacity = 1000,
                       A = A_normal, k_events=5,
               x0 = NULL,t_end = 150, norm = TRUE)

Stochastic logistic model

Stochastic logistic model is used to determine dead and alive counts in community.

tse_logistic <- simulateStochasticLogistic(n_species = 5)

Consumer-resource model

The consumer resource model requires the randomE function. This returns a matrix containing the production rates and consumption rates of each species. The resulting matrix is used as a determination of resource consumption efficiency.

# Consumer-resource model as a TreeSE object
tse_crm <- simulateConsumerResource(n_species = 2,
                                    n_resources = 4,
                                    E = randomE(n_species = 2, n_resources = 4))

You could visualize the simulated dynamics using tools from the miaTime package.

Generalized Lotka-Volterra (gLV)

The generalized Lotka-Volterra simulation model generates time-series assuming microbial population dynamics and interaction.

tse_glv <- simulateGLV(n_species = 4,
                       A = A_normal,
               t_start = 0, 
                       t_store = 1000,
               stochastic = FALSE,
               norm = FALSE)

Data containers

The simulated data sets are returned as TreeSummarizedExperiment objects. This provides access to a broad range of tools for microbiome analysis that support this format (see microbiome.github.io). More examples on the object manipulation and analysis can be found at OMA Online Manual.

For instance, to plot population density we can use the miaViz package:

library(miaViz)
p1 <- plotAbundanceDensity(tse_hubbell, assay.type = "counts")
p2 <- plotSeries(tse_hubbell, x = "time")
print(p1+p2)

Case studies

Source code for replicating the published case studies using the miaSim package (Gao et al. 2023) is available in the phyloseq folder (based on the phyloseq data container). Some of the original case studies have now been replicated also with TreeSummarized, see the TreeSummarizedExperiment folder.

Session info

sessionInfo()
## R version 4.4.2 (2024-10-31)
## Platform: x86_64-pc-linux-gnu
## Running under: Ubuntu 24.04.1 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        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       
## 
## time zone: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] miaViz_1.15.2                   mia_1.15.6                     
##  [3] MultiAssayExperiment_1.33.1     ggraph_2.2.1                   
##  [5] ggplot2_3.5.1                   miaSim_1.13.0                  
##  [7] TreeSummarizedExperiment_2.15.0 Biostrings_2.75.1              
##  [9] XVector_0.47.0                  SingleCellExperiment_1.29.1    
## [11] SummarizedExperiment_1.37.0     Biobase_2.67.0                 
## [13] GenomicRanges_1.59.1            GenomeInfoDb_1.43.2            
## [15] IRanges_2.41.1                  S4Vectors_0.45.2               
## [17] BiocGenerics_0.53.3             generics_0.1.3                 
## [19] MatrixGenerics_1.19.0           matrixStats_1.4.1              
## [21] BiocStyle_2.35.0               
## 
## loaded via a namespace (and not attached):
##   [1] splines_4.4.2               ggplotify_0.1.2            
##   [3] tibble_3.2.1                polyclip_1.10-7            
##   [5] rpart_4.1.23                DirichletMultinomial_1.49.0
##   [7] deSolve_1.40                lifecycle_1.0.4            
##   [9] lattice_0.22-6              MASS_7.3-61                
##  [11] SnowballC_0.7.1             backports_1.5.0            
##  [13] magrittr_2.0.3              Hmisc_5.2-0                
##  [15] sass_0.4.9                  rmarkdown_2.29             
##  [17] jquerylib_0.1.4             yaml_2.3.10                
##  [19] DBI_1.2.3                   buildtools_1.0.0           
##  [21] minqa_1.2.8                 abind_1.4-8                
##  [23] zlibbioc_1.52.0             purrr_1.0.2                
##  [25] yulab.utils_0.1.8           nnet_7.3-19                
##  [27] pracma_2.4.4                tweenr_2.0.3               
##  [29] sandwich_3.1-1              GenomeInfoDbData_1.2.13    
##  [31] ggrepel_0.9.6               irlba_2.3.5.1              
##  [33] tokenizers_0.3.0            tidytree_0.4.6             
##  [35] maketools_1.3.1             vegan_2.6-8                
##  [37] rbiom_1.0.3                 permute_0.9-7              
##  [39] DelayedMatrixStats_1.29.0   codetools_0.2-20           
##  [41] DelayedArray_0.33.2         scuttle_1.17.0             
##  [43] ggforce_0.4.2               tidyselect_1.2.1           
##  [45] aplot_0.2.3                 UCSC.utils_1.3.0           
##  [47] farver_2.1.2                lme4_1.1-35.5              
##  [49] ScaledMatrix_1.15.0         viridis_0.6.5              
##  [51] base64enc_0.1-3             jsonlite_1.8.9             
##  [53] BiocNeighbors_2.1.1         decontam_1.27.0            
##  [55] tidygraph_1.3.1             Formula_1.2-5              
##  [57] scater_1.35.0               tools_4.4.2                
##  [59] ggnewscale_0.5.0            treeio_1.31.0              
##  [61] Rcpp_1.0.13-1               glue_1.8.0                 
##  [63] gridExtra_2.3               SparseArray_1.7.2          
##  [65] xfun_0.49                   mgcv_1.9-1                 
##  [67] dplyr_1.1.4                 withr_3.0.2                
##  [69] BiocManager_1.30.25         fastmap_1.2.0              
##  [71] boot_1.3-31                 bluster_1.17.0             
##  [73] fansi_1.0.6                 digest_0.6.37              
##  [75] rsvd_1.0.5                  R6_2.5.1                   
##  [77] gridGraphics_0.5-1          colorspace_2.1-1           
##  [79] lpSolve_5.6.22              poweRlaw_0.80.0            
##  [81] utf8_1.2.4                  tidyr_1.3.1                
##  [83] data.table_1.16.2           DECIPHER_3.3.0             
##  [85] graphlayouts_1.2.1          httr_1.4.7                 
##  [87] htmlwidgets_1.6.4           S4Arrays_1.7.1             
##  [89] pkgconfig_2.0.3             gtable_0.3.6               
##  [91] sys_3.4.3                   janeaustenr_1.0.0          
##  [93] htmltools_0.5.8.1           scales_1.3.0               
##  [95] ggfun_0.1.7                 knitr_1.49                 
##  [97] rstudioapi_0.17.1           reshape2_1.4.4             
##  [99] checkmate_2.3.2             nlme_3.1-166               
## [101] nloptr_2.1.1                cachem_1.1.0               
## [103] zoo_1.8-12                  stringr_1.5.1              
## [105] parallel_4.4.2              vipor_0.4.7                
## [107] foreign_0.8-87              pillar_1.9.0               
## [109] grid_4.4.2                  vctrs_0.6.5                
## [111] slam_0.1-55                 BiocSingular_1.23.0        
## [113] beachmat_2.23.2             cluster_2.1.6              
## [115] beeswarm_0.4.0              htmlTable_2.4.3            
## [117] evaluate_1.0.1              mvtnorm_1.3-2              
## [119] cli_3.6.3                   compiler_4.4.2             
## [121] rlang_1.1.4                 crayon_1.5.3               
## [123] tidytext_0.4.2              labeling_0.4.3             
## [125] mediation_4.5.0             plyr_1.8.9                 
## [127] fs_1.6.5                    ggbeeswarm_0.7.2           
## [129] stringi_1.8.4               viridisLite_0.4.2          
## [131] BiocParallel_1.41.0         munsell_0.5.1              
## [133] lazyeval_0.2.2              Matrix_1.7-1               
## [135] patchwork_1.3.0             sparseMatrixStats_1.19.0   
## [137] igraph_2.1.1                memoise_2.0.1              
## [139] RcppParallel_5.1.9          bslib_0.8.0                
## [141] ggtree_3.15.0               ape_5.8