Multi-level inference to predict functional diversity


Coral reef functional diversity

Author
Published

May 10, 2024

Purpose

  • Format data
  • Run stats

Analysis flowchart

flowchart
  A[Read data] --> B(Format data) 
  B --> C(Graphs)
  C --> D(Statistical analysis)
  D --> E(Model summary) 

style A fill:#44015466
style B fill:#3E4A894D
style C fill:#26828E4D
style D fill:#6DCD594D

Load packages

Code
# install/ load packages

sketchy::load_packages(packages = c("knitr", "formatR", "pbapply",
    "ggbeeswarm", "ggplot2", "viridis", "cluster", "dplyr", "magrittr",
    "reshape", "plyr", "ade4", "svMisc", "geometry", "ape", "zoo",
    "MuMIn", "phangorn", "brms", "lme4", "vegan", "gamlss", "gamlss.dist",
    "gamlss.add", "tidybayes", "ggridges", "HDInterval", "kableExtra",
    "ggcorrplot", "cmdstanr", "cowplot", "bayestestR", "warbleR",
    "cluster"))
Warning: package 'MuMIn' is not available for this version of R
'MuMIn' version 1.47.5 is in the repositories but depends on R (>= 4.2.0)

A version of this package for your version of R might be available elsewhere,
see the ideas at
https://cran.r-project.org/doc/manuals/r-patched/R-admin.html#Installing-packages
Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
logical.return = TRUE, : there is no package called 'MuMIn'
Code
theme_set(theme_classic(base_size = 20))

knitr::opts_knit$set(dpi = 100, fig.width = 16, fig.height = 8, warning = FALSE,
    root.dir = "..", message = FALSE)

cols <- viridis(10, alpha = 0.7)
Code
source("~/Dropbox/Projects/reef_functional_diversity/scripts/assemblage_random_subsets.R")

source("./scripts/multidimFD.R")

# source('~/Dropbox/R_package_testing/warbleR/warbleR/R/pblapply_wrblr_int.R')

pblapply_wrblr_int <- warbleR:::pblapply_wrblr_int
Code
# species_abundances <- readRDS('./data/species_abundances.rds')
abundance_and_func_traits <- readRDS("~/Dropbox/Projects/eastern_tropical_pacific_herbivory/data_intermediate/fish/regional/herbfishes_regional_ecoregion_traits_biomass.rds")

abundance_and_func_traits$site_id[abundance_and_func_traits$site_id ==
    "nicaragua-toro_miscal/toro_marsella"] <- "nicaragua-toro_miscal-toro_marsella"

# transect_areas1 <- readRDS('./data/transect_areas.RDS')
transect_areas <- abundance_and_func_traits[!duplicated(paste(abundance_and_func_traits$ID_transect,
    abundance_and_func_traits$site_id)), c("ID_transect", "site_id",
    "area_uvc", "region", "date_y_m")]

transect_areas$ID_transect_num <- 1:nrow(transect_areas)

# Max number of sites a transect is found in (should be 1!)
max(table(transect_areas$ID_transect, transect_areas$site_id))
[1] 1
Code
uvc_sst_df <- readRDS("~/Dropbox/Projects/eastern_tropical_pacific_herbivory/results/biophy/uvc_sst_fishes_sites_data_frame.RDS")
uvc_chl_df <- readRDS("~/Dropbox/Projects/eastern_tropical_pacific_herbivory/results/biophy/uvc_chl_fishes_sites_data_frame.RDS")
predictors <- readRDS("~/Dropbox/Projects/eastern_tropical_pacific_herbivory/data_intermediate/predictors.RDS")

uvc_sst_df$site_id[uvc_sst_df$site_id == "nicaragua-toro_miscal/toro_marsella"] <- uvc_chl_df$site_id[uvc_chl_df$site_id ==
    "nicaragua-toro_miscal/toro_marsella"] <- predictors$site_id[predictors$site_id ==
    "nicaragua-toro_miscal/toro_marsella"] <- "nicaragua-toro_miscal-toro_marsella"



# these ones don't have coordinates (should be 4 sites from
# mexico)
setdiff(transect_areas$site_id, predictors$site_id)
character(0)
Code
transect_areas <- merge(transect_areas, predictors[!duplicated(predictors$site_id),
    ], by = "site_id")

transect_areas$years_protected[is.na(transect_areas$years_protected)] <- 0

transect_areas$ID_transect_num <- 1:nrow(transect_areas)

# load fish taxa to have 'taxonomy'
load("~/Dropbox/Projects/eastern_tropical_pacific_herbivory/data_intermediate/taxa/fish_taxa.rda")

# sampling coverage
sc <- readRDS("~/Dropbox/Projects/eastern_tropical_pacific_herbivory/results/mixed/sc.RDS")

rownames(sc)[rownames(sc) == "nicaragua-toro_miscal/toro_marsella"] <- "nicaragua-toro_miscal-toro_marsella"


# remove those with low coverage
transect_areas <- transect_areas[transect_areas$site_id %in% rownames(sc)[sc$sc >=
    0.95], ]

1 Create 100 random subsets

Code
random_FD_list <- warbleR:::pblapply_wrblr_int(X = 1:110, FUN = function(x) {
    # print(x)
    random_assemblages <- assemblage_random_subsets(transc_metadata = transect_areas,
        sp_abund = abundance_and_func_traits, reps = 100, buffer = 0.1,
        parallel = 1, target.area = 400, pb = FALSE, seed = x, site.specific.biomass = TRUE)

    fds <- FD_random_assemblages(random_assemblages = random_assemblages,
        sp_cutoff = 3, prop_cutoff = 0.5, abundance_and_func_traits = abundance_and_func_traits,
        taxonomy = fish_taxa, transect_areas = transect_areas)

    fds_predictors <- try(add_predictors(X = fds, transect_areas = transect_areas,
        uvc_chl_df = uvc_chl_df, uvc_sst_df = uvc_sst_df, parallel = 1,
        pb = FALSE), silent = TRUE)

    return(fds_predictors)
}, cl = 1)

# remove errors
random_FD_list <- random_FD_list[sapply(random_FD_list, class) ==
    "data.frame"]

# keep 100
random_FD_list <- random_FD_list[1:100]

saveRDS(random_FD_list, "./data/100_replicated_random_assemblages_data_set_400m2_target_area.RDS")

2 Check collinearity

Colinearity on the first 15 random transect data sets

2.1 Predictors

Code
random_FD_list <- readRDS("./data/100_replicated_random_assemblages_data_set_400m2_target_area.RDS")

# dev.off() par(mfrow = c(4, 4))

# for(i in 1:16){ print(head(random_FD_list[[i]]))

ggcorrplots <- lapply(1:15, function(i) {
    cormat <- cor(random_FD_list[[i]][, c("sst_range", "chl_range",
        "gravity", "years_protected")])

    ggcorrplot(cormat, type = "lower", outline.col = "black", lab = TRUE,
        ggtheme = ggplot2::theme_classic, colors = c("#6D9EC1", "white",
            "#E46726"))

    # print(cp <- corrplot::corrplot.mixed(cormat, upper =
    # 'ellipse', lower.col = 'black')) }
})
cowplot::plot_grid(plotlist = ggcorrplots, ncol = 3)

2.2 Responses

Code
random_FD_list <- readRDS("./data/100_replicated_random_assemblages_data_set_400m2_target_area.RDS")

# dev.off() par(mfrow = c(4, 4))

# for(i in 1:16){ print(head(random_FD_list[[i]]))

ggcorrplots <- lapply(1:15, function(i) {
    cormat <- cor(random_FD_list[[i]][, c("FRic", "FDiv", "FEve",
        "FDis", "tax_distinctnes", "corrected_biomass", "density")])

    ggcorrplot(cormat, type = "lower", outline.col = "black", lab = TRUE,
        ggtheme = ggplot2::theme_classic, colors = c("#6D9EC1", "white",
            "#E46726"))

    # print(cp <- corrplot::corrplot.mixed(cormat, upper =
    # 'ellipse', lower.col = 'black')) }
})
cowplot::plot_grid(plotlist = ggcorrplots, ncol = 3)

3 Models

Code
# modelos
## FDiv
 # modelos
  ## FDiv
mod_all_noiucn_FDiv <- "FDiv ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_FDiv <- "FDiv ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_FDiv <- "FDiv ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"  

mod_envir_FDiv <- "FDiv ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_FDiv <- "FDiv ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_FDiv <- "FDiv ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_FDiv <- "FDiv ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 

### FEve

mod_all_noiucn_FEve <- "FEve ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_FEve <- "FEve ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_FEve <- "FEve ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"  

mod_envir_FEve <- "FEve ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_FEve <- "FEve ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_FEve <- "FEve ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_FEve <- "FEve ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 

### FDis

mod_all_noiucn_FDis <- "FDis ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_FDis <- "FDis ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_FDis <- "FDis ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"  

mod_envir_FDis <- "FDis ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_FDis <- "FDis ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_FDis <- "FDis ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_FDis <- "FDis ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 

### tax dis

mod_all_noiucn_taxdis <- "tax_distinctnes ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_taxdis <- "tax_distinctnes ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_taxdis <- "tax_distinctnes ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"

mod_envir_taxdis <- "tax_distinctnes ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_taxdis <- "tax_distinctnes ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_taxdis <- "tax_distinctnes ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_taxdis <- "tax_distinctnes ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 

### FRiq

mod_all_noiucn_FRic <- "FRic ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_FRic <- "FRic ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_FRic <- "FRic ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"

mod_envir_FRic <- "FRic ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_FRic <- "FRic ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_FRic <- "FRic ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_FRic <- "FRic ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 


### Density
mod_all_noiucn_dens <- "density ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_dens <- "density ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_dens <- "density ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"

mod_envir_dens <- "density ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_dens <- "density ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_dens <- "density ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_dens <- "density ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 

### Biomass

mod_all_noiucn_biom <- "corrected_biomass ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_biom <- "corrected_biomass ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_biom <- "corrected_biomass ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"

mod_envir_biom <- "corrected_biomass ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_biom <- "corrected_biomass ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_biom <- "corrected_biomass ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_biom <- "corrected_biomass ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 

### Richness

mod_all_noiucn_rich <- "Nb_sp ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"  

mod_all_noyears_rich <- "Nb_sp ~ sst_range + chl_range + gravity + iucn_cat + geomorphology + (1|Ecoregion)" 

mod_all_intr_rich <- "Nb_sp ~ sst_range + chl_range + gravity + years_protected : iucn_cat + geomorphology + (1|Ecoregion)"

mod_envir_rich <- "Nb_sp ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

mod_antrop_noiucn_rich <- "Nb_sp ~ gravity + years_protected + (1|Ecoregion)" 

mod_antrop_noyears_rich <- "Nb_sp ~ gravity + iucn_cat + (1|Ecoregion)" 

mod_antrop_intr_rich <- "Nb_sp ~ gravity + years_protected : iucn_cat + (1|Ecoregion)" 


models <- list(
  mod_all_noiucn_FDiv     = mod_all_noiucn_FDiv,
  mod_all_noyears_FDiv    = mod_all_noyears_FDiv,
  mod_all_intr_FDiv       = mod_all_intr_FDiv,
  mod_envir_FDiv          = mod_envir_FDiv,
  mod_antrop_noiucn_FDiv  = mod_antrop_noiucn_FDiv, 
  mod_antrop_noyears_FDiv = mod_antrop_noyears_FDiv, 
  mod_antrop_intr_FDiv    = mod_antrop_intr_FDiv,
  
  mod_all_noiucn_FEve     = mod_all_noiucn_FEve,
  mod_all_noyears_FEve    = mod_all_noyears_FEve, 
  mod_all_intr_FEve       = mod_all_intr_FEve, 
  mod_envir_FEve          = mod_envir_FEve,
  mod_antrop_noiucn_FEve  = mod_antrop_noiucn_FEve,
  mod_antrop_noyears_FEve = mod_antrop_noyears_FEve,
  mod_antrop_intr_FEve    = mod_antrop_intr_FEve,
  
  mod_all_noiucn_FDis     = mod_all_noiucn_FDis,
  mod_all_noyears_FDis    = mod_all_noyears_FDis, 
  mod_all_intr_FDis       = mod_all_intr_FDis, 
  mod_envir_FDis          = mod_envir_FDis,
  mod_antrop_noiucn_FDis  = mod_antrop_noiucn_FDis,
  mod_antrop_noyears_FDis = mod_antrop_noyears_FDis,
  mod_antrop_intr_FDis    = mod_antrop_intr_FDis,
  
  mod_all_noiucn_taxdis     = mod_all_noiucn_taxdis,
  mod_all_noyears_taxdis    = mod_all_noyears_taxdis, 
  mod_all_intr_taxdis       = mod_all_intr_taxdis, 
  mod_envir_taxdis          = mod_envir_taxdis,
  mod_antrop_noiucn_taxdis  = mod_antrop_noiucn_taxdis,
  mod_antrop_noyears_taxdis = mod_antrop_noyears_taxdis,
  mod_antrop_intr_taxdis    = mod_antrop_intr_taxdis,
  
  mod_all_noiucn_FRic     = mod_all_noiucn_FRic,
  mod_all_noyears_FRic    = mod_all_noyears_FRic, 
  mod_all_intr_FRic       = mod_all_intr_FRic, 
  mod_envir_FRic          = mod_envir_FRic,
  mod_antrop_noiucn_FRic  = mod_antrop_noiucn_FRic,
  mod_antrop_noyears_FRic = mod_antrop_noyears_FRic,
  mod_antrop_intr_FRic    = mod_antrop_intr_FRic,
  
  mod_all_noiucn_dens     = mod_all_noiucn_dens,
  mod_all_noyears_dens    = mod_all_noyears_dens, 
  mod_all_intr_dens       = mod_all_intr_dens, 
  mod_envir_dens          = mod_envir_dens,
  mod_antrop_noiucn_dens  = mod_antrop_noiucn_dens,
  mod_antrop_noyears_dens = mod_antrop_noyears_dens,
  mod_antrop_intr_dens    = mod_antrop_intr_dens,
  
  mod_all_noiucn_biom     = mod_all_noiucn_biom,
  mod_all_noyears_biom    = mod_all_noyears_biom, 
  mod_all_intr_biom       = mod_all_intr_biom, 
  mod_envir_biom          = mod_envir_biom,
  mod_antrop_noiucn_biom  = mod_antrop_noiucn_biom,
  mod_antrop_noyears_biom = mod_antrop_noyears_biom,
  mod_antrop_intr_biom    = mod_antrop_intr_biom,
  
  mod_all_noiucn_rich     = mod_all_noiucn_rich,
  mod_all_noyears_rich    = mod_all_noyears_rich, 
  mod_all_intr_rich       = mod_all_intr_rich, 
  mod_envir_rich          = mod_envir_rich,
  mod_antrop_noiucn_rich  = mod_antrop_noiucn_rich,
  mod_antrop_noyears_rich = mod_antrop_noyears_rich,
  mod_antrop_intr_rich    = mod_antrop_intr_rich
)

# temporarily remove those including "iucn_cat"
models <- models[grep(pattern = "iucn", x = models, invert = TRUE)]

print(models)
$mod_all_noiucn_FDiv
[1] "FDiv ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_FDiv
[1] "FDiv ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_FDiv
[1] "FDiv ~ gravity + years_protected + (1|Ecoregion)"

$mod_all_noiucn_FEve
[1] "FEve ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_FEve
[1] "FEve ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_FEve
[1] "FEve ~ gravity + years_protected + (1|Ecoregion)"

$mod_all_noiucn_FDis
[1] "FDis ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_FDis
[1] "FDis ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_FDis
[1] "FDis ~ gravity + years_protected + (1|Ecoregion)"

$mod_all_noiucn_taxdis
[1] "tax_distinctnes ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_taxdis
[1] "tax_distinctnes ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_taxdis
[1] "tax_distinctnes ~ gravity + years_protected + (1|Ecoregion)"

$mod_all_noiucn_FRic
[1] "FRic ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_FRic
[1] "FRic ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_FRic
[1] "FRic ~ gravity + years_protected + (1|Ecoregion)"

$mod_all_noiucn_dens
[1] "density ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_dens
[1] "density ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_dens
[1] "density ~ gravity + years_protected + (1|Ecoregion)"

$mod_all_noiucn_biom
[1] "corrected_biomass ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_biom
[1] "corrected_biomass ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_biom
[1] "corrected_biomass ~ gravity + years_protected + (1|Ecoregion)"

$mod_all_noiucn_rich
[1] "Nb_sp ~ sst_range + chl_range + gravity + years_protected + geomorphology + (1|Ecoregion)"

$mod_envir_rich
[1] "Nb_sp ~ sst_range + chl_range + geomorphology + (1|Ecoregion)"

$mod_antrop_noiucn_rich
[1] "Nb_sp ~ gravity + years_protected + (1|Ecoregion)"

3.1 Bayesian mixed models

  • 12 models for each data subset
Code
random_FD_list <- readRDS("./data/100_replicated_random_assemblages_data_set_400m2_target_area.RDS")

# check sites on all data sets
sites <- unlist(sapply(random_FD_list, function(x) unique(x$site_id)))

sites_count <- table(sites)

shared_sites <- names(sites_count)[sites_count == length(random_FD_list)]

length(shared_sites)

# predictors to scale
vars <- c("sst_range", "chl_range", "gravity", "years_protected")

iters <- 30000

# z-transform predictors and keep only shared sites
random_FD_list <- lapply(random_FD_list, function(W) {
    # scale parameters
    for (i in vars) W[, i] <- scale(W[, i])

    # remove non-shared sites
    W <- W[W$site_id %in% shared_sites, ]

    # make taxonomic distinctness a proportion
    W$tax_distinctnes <- W$tax_distinctnes/(max(W$tax_distinctnes) *
        1.0001)

    # set base level for iucn categories
    W$iucn_cat <- as.character(W$iucn_cat)

    return(W)
})



priors <- c(set_prior("normal(0, 1.5)", class = "Intercept"), set_prior("normal(0, 2)",
    class = "b"))


# loop to run bayesian mcmc glmmm in brms (using stan)
# controlling for spatial autocorrelation

# remove iucn
models <- grep("iucn", models, value = TRUE, invert = TRUE)

shuffled_models <- sample(1:length(models))

brms_model_out <- warbleR:::pblapply_wrblr_int(shuffled_models, function(u) {

    x <- models[[u]]
    print(x)
    print(names(models)[u])
    rds_name <- file.path("./data/statistical_models_2024", paste0(names(models)[u],
        "-10-data-sets_brm_multiple.RDS"))

    # check Rhats if (file.exists(rds_name)){ mod <-
    # readRDS(rds_name) rhats <- rhat(mod[[1]][[1]]) rhats <-
    # rhats[-length(rhats)] iters <- attr(mod[[1]][[1]]$fit,
    # 'stan_args')[[1]]$iter + 10000 go <- if (any(rhats >
    # 1.05)) TRUE else FALSE } else go <- TRUE if (go) {
    if (TRUE) {

        # get priors for model
        sub_priors <- priors[sapply(priors$coef, function(x) grepl(x,
            as.character(x)[3])), ]

        # mod <- try(brm(formula = x, iter = 0000, thin = 1,
        # warmup = 5000, data = random_FD_list[[1]], family =
        # Beta(), control = list(adapt_delta = 0.999), silent =
        # 2, chains = 1, prior = sub_priors ), silent = TRUE)

        mod <- try(brm_multiple(formula = x, iter = iters, thin = 1,
            data = random_FD_list[1:10], family = Beta(), cores = 10,
            control = list(adapt_delta = 0.999), silent = 2, chains = 1,
            combine = FALSE, prior = sub_priors), silent = TRUE)

        # add loo
        if (!is(mod, "try-error"))
            for (i in 1:length(mod)) mod[[i]] <- add_criterion(mod[[i]],
                c("loo"))

        if (!is(mod, "try-error"))
            saveRDS(mod, file = rds_name)

        rm(mod)
    }
    return(NULL)
})
Code
random_FD_list <- readRDS("./data/100_replicated_random_assemblages_data_set_400m2_target_area.RDS")

random_FD_df <- do.call(rbind, random_FD_list)

# predictors to scale
vars <- c("sst_range", "chl_range", "gravity", "years_protected")

iters <- 50000

for (i in vars) random_FD_df[, i] <- scale(random_FD_df[, i])


# make taxonomic distinctness, Nb_sp density and
# corrected_biomass a proportion
random_FD_df$tax_distinctnes <- random_FD_df$tax_distinctnes/(max(random_FD_df$tax_distinctnes) *
    1.0001)

random_FD_df$Nb_sp <- random_FD_df$Nb_sp/(max(random_FD_df$Nb_sp) *
    1.0001)

random_FD_df$density <- random_FD_df$density/(max(random_FD_df$density) *
    1.0001)

random_FD_df$corrected_biomass <- random_FD_df$corrected_biomass/(max(random_FD_df$corrected_biomass) *
    1.0001)

priors <- c(set_prior("normal(0, 1.5)", class = "Intercept"), set_prior("normal(0, 2)",
    class = "b"))


# loop to run bayesian mcmc glmmm in brms (using stan)
# controlling for spatial autocorrelation

# remove iucn
models <- grep("iucn", models, value = TRUE, invert = TRUE)

shuffled_models <- sample(1:length(models))

brms_model_out <- warbleR:::pblapply_wrblr_int(shuffled_models, function(u) {
    x <- models[[u]]
    print(x)
    print(names(models)[u])
    rds_name <- file.path("./data/statistical_models_2024", paste0(names(models)[u],
        "-single_combined_100_data_sets.RDS"))

    # check Rhats
    if (!file.exists(rds_name)) {
        # mod <- readRDS(rds_name) rhats <- rhat(mod[[1]][[1]])
        # rhats <- rhats[-length(rhats)] iters <-
        # attr(mod[[1]][[1]]$fit, 'stan_args')[[1]]$iter + 10000
        # go <- if (any(rhats > 1.05)) TRUE else FALSE } else go
        # <- TRUE if (go) { if (TRUE) { get priors for model
        sub_priors <- priors[sapply(priors$coef, function(x) grepl(x,
            as.character(x)[3])), ]

        mod <- try(brm(formula = paste(x, "+ (1|site_id)"), iter = iters,
            thin = 1, data = random_FD_df, family = Beta(), control = list(adapt_delta = 0.999),
            silent = 2, chains = 2, cores = 2, backend = "cmdstanr",
            threads = threading(2), prior = sub_priors, save_pars = save_pars(all = TRUE)),
            silent = TRUE)

        if (!is(mod, "try-error"))
            mod2 <- try(add_criterion(mod, c("loo")), silent = TRUE)

        # if (!is(mod2, 'try-error')) mod <- mod2

        if (!is(mod, "try-error"))
            saveRDS(mod, file = rds_name)

        rm(mod)
    }
    return(NULL)
})
Code
brms_model_rds <- list.files("./data/statistical_models_2024", pattern = "combined_100_data_sets.RDS",
    full.names = TRUE)

brms_model_rds <- brms_model_rds[brms_model_rds != "./data/statistical_models/models_combined_100_data_sets.RDS"]

# temporarily remove iucn brms_model_rds <- grep(pattern =
# 'iucn', x = brms_model_rds, invert = TRUE, value = TRUE)

combined_mod_results <- pblapply(brms_model_rds, cl = 1, function(e) {

    mod <- readRDS(e)
    # comb_mod <- combine_models(mlist = mods, check_data =
    # FALSE)

    # mods[[1]]$criteria$loo$estimates

    # print(x$formula)
    summ <- summary(mod)$fixed
    fit <- mod$fit
    betas <- grep("^b_", names(fit@sim$samples[[1]]), value = TRUE)
    hdis <- t(sapply(betas, function(y) hdi(fit@sim$samples[[1]][[y]])))
    summ_table <- data.frame(summ, hdis, iterations = attr(fit, "stan_args")[[1]]$iter,
        chains = length(attr(fit, "stan_args")))
    summ_table <- summ_table[rownames(summ_table) != "Intercept",
        c("Estimate", "Rhat", "Bulk_ESS", "CI_low", "CI_high", "iterations",
            "chains")]

    summ_table <- as.data.frame(summ_table)
    summ_table$Rhat <- round(summ_table$Rhat, digits = 3)
    summ_table$CI_low <- round(unlist(summ_table$CI_low), digits = 3)
    summ_table$CI_high <- round(unlist(summ_table$CI_high), digits = 3)

    out <- lapply(betas, function(y) data.frame(variable = y, value = sort(fit@sim$samples[[1]][[y]],
        decreasing = FALSE)))

    posteriors <- do.call(rbind, out)
    posteriors <- posteriors[posteriors$variable != "b_Intercept",
        ]

    gg <- ggplot(data = posteriors, aes(y = variable, x = value, fill = stat(quantile))) +
        geom_density_ridges_gradient(quantile_lines = TRUE, quantile_fun = HDInterval::hdi,
            vline_linetype = 2) + theme_classic() + xlim(c(min(summ_table[,
        "CI_low"]), max(summ_table[, "CI_high"]))) + geom_vline(xintercept = 0,
        col = "red") + scale_fill_manual(values = c("transparent",
        "lightblue", "transparent"), guide = "none") + ggtitle(mod$formula)

    # print(gg)

    summ_table$Rhat <- ifelse(summ_table$Rhat > 1.05, cell_spec(summ_table$Rhat,
        "html", color = "white", background = "red", bold = TRUE,
        font_size = 12), cell_spec(summ_table$Rhat, "html"))

    signif <- summ_table[, "CI_low"] * summ_table[, "CI_high"] > 0

    # summ_table$CI_low <- ifelse(signif,
    # cell_spec(summ_table$CI_low, 'html', color ='black',
    # background = adjustcolor(cols[9], alpha.f = 0.3), bold =
    # TRUE, font_size = 12), cell_spec(summ_table$CI_low,
    # 'html'))

    # summ_table$CI_high <- ifelse(signif,
    # cell_spec(summ_table$CI_high, 'html', color ='black',
    # background = adjustcolor(cols[9], alpha.f = 0.3), bold =
    # TRUE, font_size = 12), cell_spec(summ_table$CI_high,
    # 'html'))

    df1 <- kbl(summ_table, row.names = TRUE, escape = FALSE, format = "html",
        digits = 3)

    df1 <- row_spec(kable_input = df1, row = which(summ_table$CI_low *
        summ_table$CI_high > 0), background = adjustcolor(cols[9],
        alpha.f = 0.3))

    df1 <- kable_styling(df1, bootstrap_options = c("striped", "hover",
        "condensed", "responsive"), full_width = FALSE, font_size = 12)

    # print(df1)

    results <- list(table = df1, gg = gg)

    return(results)

    return(cm)
})

names(combined_mod_results) <- gsub("-single_combined_100_data_sets.RDS",
    "", basename(brms_model_rds))

saveRDS(combined_mod_results, "./data/statistical_models_2024/models_combined_100_data_sets_2024.RDS")

4 Results for a single combined data set per model (100 subsets, site as random factor)

Code
models_combined_100_data_set <- readRDS("./data/statistical_models_2024/models_combined_100_data_sets_2024.RDS")

for (i in 1:length(models_combined_100_data_set)) {
    print(names(models_combined_100_data_set)[i])
    print(models_combined_100_data_set[[i]]$table)
    print(models_combined_100_data_set[[i]]$gg)
}

4.1 Model comparison

Code
brms_model_rds <- list.files(path = "./data/statistical_models_2024/",
    pattern = "-single_combined_100_data_sets.RDS", full.names = TRUE)

looic_list <- pblapply(brms_model_rds, cl = 1, function(e) {

    mod <- readRDS(e)

    if (is.null(mod$criteria$loo$estimates))
        mod <- try(add_criterion(mod, c("loo")), silent = TRUE)

    loos <- mod$criteria$loo$estimates

    rm(mod)

    out_df <- data.frame(models = gsub("-single_combined_100_data_sets.RDS",
        "", basename(e)), looic = loos[3, 1], SE = loos[3, 2])

    return(out_df)
})

looic_df <- do.call(rbind, looic_list)

saveRDS(looic_df, "./data/looic_by_model_site_id_as_random_effect_2024.RDS")
Code
looic_df <- readRDS("./data/looic_by_model_site_id_as_random_effect_2024.RDS")

brms_model_rds <- list.files("./data/statistical_models_2024/", pattern = "-single_combined_100_data_sets.RDS",
    full.names = TRUE)

mod_groups <- c("FDis", "FDiv", "FEve", "taxdis", "biom", "dens",
    "rich")

loo_comparisons <- lapply(mod_groups, function(i) {
    print(i)
    sub_looic <- looic_df[grep(i, looic_df$models), ]
    sub_looic$delta.looic <- sub_looic$looic - min(sub_looic$looic)

    mods <- lapply(file.path("./data/statistical_models_2024/", paste0(sub_looic$models,
        "-single_combined_100_data_sets.RDS")), FUN = readRDS)

    weights <- brms::loo_model_weights(mods[[1]], mods[[2]], mods[[3]],
        model_names = sub_looic$models, ndraws = 5000)

    rm(mods)

    sub_looic$looic.weights <- sapply(sub_looic$models, function(x) as.numeric(weights[names(weights) ==
        x]))

    sub_looic <- sub_looic[order(sub_looic$delta.looic, decreasing = TRUE),
        ]
    sub_looic$cum.weight <- cumsum(sub_looic$looic.weights)

    sub_looic <- sub_looic[order(sub_looic$delta.looic, decreasing = FALSE),
        ]

    df1 <- knitr::kable(sub_looic, row.names = TRUE, escape = FALSE,
        format = "html", digits = 3, caption = i)

    df1 <- row_spec(kable_input = df1, row = 1:which(sub_looic$cum.weight >=
        0.95)[1], background = adjustcolor(cols[9], alpha.f = 0.3))

    df1 <- kable_styling(df1, bootstrap_options = c("striped", "hover",
        "condensed", "responsive"), full_width = FALSE, font_size = 12)

    return(df1)
})

names(loo_comparisons) <- mod_groups

saveRDS(loo_comparisons, "./data/statistical_models_2024/models_comparison_results_100_data_sets_2024.RDS")
Code
loo_comparisons <- readRDS("./data/statistical_models_2024/models_comparison_results_100_data_sets_2024.RDS")

for (i in 1:length(loo_comparisons)) {
    print(names(loo_comparisons)[i])
    print(loo_comparisons[[i]])
}
[1] “FDis”
FDis
models looic SE delta.looic looic.weights cum.weight
19 mod_envir_FDis -62747.22 720.203 0.000 0.629 1.000
3 mod_all_noiucn_FDis -62746.87 720.069 0.344 0.000 0.371
11 mod_antrop_noiucn_FDis -62680.61 723.489 66.604 0.371 0.371
[1] “FDiv”
FDiv
models looic SE delta.looic looic.weights cum.weight
4 mod_all_noiucn_FDiv -88286.26 597.677 0.000 0.814 1.000
20 mod_envir_FDiv -88285.01 597.898 1.252 0.000 0.186
12 mod_antrop_noiucn_FDiv -88263.92 598.048 22.348 0.186 0.186
[1] “FEve”
FEve
models looic SE delta.looic looic.weights cum.weight
13 mod_antrop_noiucn_FEve -59627.11 976.528 0.000 0.24 1.00
5 mod_all_noiucn_FEve -59623.61 986.541 3.499 0.76 0.76
21 mod_envir_FEve -59623.19 986.156 3.922 0.00 0.00
[1] “taxdis”
taxdis
models looic SE delta.looic looic.weights cum.weight
24 mod_envir_taxdis -89370.21 683.090 0.000 0.000 1.000
8 mod_all_noiucn_taxdis -89368.90 683.196 1.303 0.624 1.000
16 mod_antrop_noiucn_taxdis -89325.54 687.309 44.668 0.376 0.376
[1] “biom”
biom
models looic SE delta.looic looic.weights cum.weight
17 mod_envir_biom -110588.0 726.724 0.000 0.674 1.000
1 mod_all_noiucn_biom -110585.2 727.280 2.844 0.000 0.326
9 mod_antrop_noiucn_biom -110574.2 726.479 13.830 0.326 0.326
[1] “dens”
dens
models looic SE delta.looic looic.weights cum.weight
2 mod_all_noiucn_dens -135836.7 1004.038 0.000 0.000 1.000
18 mod_envir_dens -135832.7 1002.594 3.962 0.711 1.000
10 mod_antrop_noiucn_dens -135582.0 1028.831 254.679 0.289 0.289
[1] “rich”
rich
models looic SE delta.looic looic.weights cum.weight
15 mod_antrop_noiucn_rich -85262.36 536.042 0.000 1 1
23 mod_envir_rich -85257.86 536.402 4.503 0 0
7 mod_all_noiucn_rich -85257.43 536.425 4.935 0 0

4.2 Model averaging

Code
brms_model_rds <- list.files("./data/statistical_models_2024", pattern = "-single_combined_100_data_sets.RDS", full.names = TRUE)

average_model_list <- pblapply(c("FDis", "FDiv", "FEve", "taxdis", "biom", "dens", "rich"), function(x){
  
  mods <- lapply(grep(x, brms_model_rds, value = TRUE), readRDS)
  
  params <- lapply(mods, function(x) rownames(summary(x)$fixed)[-1])  
  
  combs <- combn(1:length(mods), 2)
  
  post_avrg_list <- lapply(1:ncol(combs), function(y){

   prm <- paste0("b_", intersect(params[[combs[1, y]]], params[[combs[2, y]]]))
  
        if (!prm[1] == "b_")
    # calculate average posteriors and model
    post_avrg <- posterior_average(mods[[combs[1, y]]], mods[[combs[1, y]]], weights = "loo", pars = prm) else
      post_avrg <- NULL
    
    return(post_avrg)
  })
  
  post_avrg_list <- post_avrg_list[sapply(post_avrg_list, is.data.frame)]
  
post_avrgs <- do.call(cbind, post_avrg_list)

average_model <- describe_posterior(as.data.frame(post_avrgs), ci_method = "HDI")

average_model <- as.data.frame(average_model)

average_model_raw <- average_model
  average_model$CI_low <- round(average_model$CI_low, digits = 3)  
  average_model$CI_high <- round(average_model$CI_high, digits = 3)  
  

  signif <- average_model[, "CI_low"] * average_model[, "CI_high"] > 0
  
  # average_model$CI_low <- ifelse(signif, cell_spec(average_model$CI_low, "html", color ="black", background = adjustcolor(cols[9], alpha.f = 0.3), bold = TRUE,  font_size = 12),  cell_spec(average_model$CI_low, "html"))
  # 
  # average_model$CI_high <- ifelse(signif, cell_spec(average_model$CI_high, "html", color ="black", background = adjustcolor(cols[9], alpha.f = 0.3), bold = TRUE,  font_size = 12),  cell_spec(average_model$CI_high, "html"))
  # 
      
  
  
  df1 <- kbl(average_model, row.names = TRUE, escape = FALSE, format = "html", digits = 3)

  df1 <- row_spec(kable_input = df1,row =  which(signif), background = adjustcolor(cols[9], alpha.f = 0.3))
  
  df1 <- kable_styling(df1, bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = FALSE, font_size = 12)

  average_model_raw$response <- x
  
  out <- list(average_model = average_model_raw, table = df1)
  
  return(out)
})

names(average_model_list) <- c("FDis", "FDiv", "FEve", "taxdis", "biom", "dens", "rich")

averaged_model_table <- do.call(rbind, lapply(average_model_list, "[[", 'average_model'))

saveRDS(averaged_model_table, "./data/statistical_models_2024/averaged_model_table.RDS")
                                
saveRDS(average_model_list, "./data/statistical_models_2024/average_models.RDS")
Code
average_model_list <- readRDS("./data/statistical_models_2024/average_models.RDS")

for (i in 1:length(average_model_list)) {
    print(names(average_model_list)[i])
    print(average_model_list[[i]]$table)
}
[1] “FDis”
Parameter Median CI CI_low CI_high pd ROPE_CI ROPE_low ROPE_high ROPE_Percentage
4 b_gravity 0.076 0.95 -0.085 0.235 0.821 0.95 -0.1 0.1 0.628
6 b_years_protected 0.003 0.95 -0.178 0.168 0.513 0.95 -0.1 0.1 0.786
5 b_sst_range -0.244 0.95 -0.299 -0.188 1.000 0.95 -0.1 0.1 0.000
1 b_chl_range 0.088 0.95 0.051 0.128 1.000 0.95 -0.1 0.1 0.737
2 b_geomorphologycoastal_island 0.006 0.95 -0.331 0.342 0.517 0.95 -0.1 0.1 0.505
3 b_geomorphologyoceanic_island 0.365 0.95 -0.253 0.951 0.886 0.95 -0.1 0.1 0.122
[1] “FDiv”
Parameter Median CI CI_low CI_high pd ROPE_CI ROPE_low ROPE_high ROPE_Percentage
4 b_gravity 0.217 0.95 0.005 0.441 0.980 0.95 -0.1 0.1 0.123
6 b_years_protected 0.283 0.95 0.030 0.540 0.990 0.95 -0.1 0.1 0.051
5 b_sst_range -0.130 0.95 -0.186 -0.074 1.000 0.95 -0.1 0.1 0.126
1 b_chl_range -0.021 0.95 -0.061 0.021 0.846 0.95 -0.1 0.1 1.000
2 b_geomorphologycoastal_island 0.120 0.95 -0.298 0.509 0.727 0.95 -0.1 0.1 0.341
3 b_geomorphologyoceanic_island -0.551 0.95 -1.566 0.304 0.893 0.95 -0.1 0.1 0.094
[1] “FEve”
Parameter Median CI CI_low CI_high pd ROPE_CI ROPE_low ROPE_high ROPE_Percentage
4 b_gravity -0.264 0.95 -0.395 -0.114 1.000 0.95 -0.1 0.1 0.000
6 b_years_protected -0.078 0.95 -0.233 0.074 0.838 0.95 -0.1 0.1 0.615
5 b_sst_range -0.002 0.95 -0.064 0.061 0.531 0.95 -0.1 0.1 1.000
1 b_chl_range 0.055 0.95 0.012 0.097 0.995 0.95 -0.1 0.1 1.000
2 b_geomorphologycoastal_island -0.166 0.95 -0.445 0.098 0.888 0.95 -0.1 0.1 0.299
3 b_geomorphologyoceanic_island 0.080 0.95 -0.640 0.658 0.596 0.95 -0.1 0.1 0.240
[1] “taxdis”
Parameter Median CI CI_low CI_high pd ROPE_CI ROPE_low ROPE_high ROPE_Percentage
4 b_gravity -0.073 0.95 -0.177 0.034 0.907 0.95 -0.1 0.1 0.721
6 b_years_protected 0.072 0.95 -0.050 0.204 0.855 0.95 -0.1 0.1 0.674
5 b_sst_range -0.082 0.95 -0.106 -0.059 1.000 0.95 -0.1 0.1 0.945
1 b_chl_range 0.011 0.95 -0.004 0.026 0.926 0.95 -0.1 0.1 1.000
2 b_geomorphologycoastal_island 0.121 0.95 -0.017 0.328 0.970 0.95 -0.1 0.1 0.332
3 b_geomorphologyoceanic_island 0.633 0.95 0.115 1.125 0.991 0.95 -0.1 0.1 0.000
[1] “biom”
Parameter Median CI CI_low CI_high pd ROPE_CI ROPE_low ROPE_high ROPE_Percentage
4 b_gravity -0.087 0.95 -0.313 0.111 0.790 0.95 -0.1 0.1 0.530
6 b_years_protected -0.050 0.95 -0.273 0.192 0.667 0.95 -0.1 0.1 0.576
5 b_sst_range 0.005 0.95 -0.053 0.054 0.568 0.95 -0.1 0.1 1.000
1 b_chl_range -0.075 0.95 -0.111 -0.036 1.000 0.95 -0.1 0.1 0.934
2 b_geomorphologycoastal_island 0.176 0.95 -0.172 0.414 0.844 0.95 -0.1 0.1 0.234
3 b_geomorphologyoceanic_island 0.437 0.95 -0.545 1.356 0.816 0.95 -0.1 0.1 0.118
[1] “dens”
Parameter Median CI CI_low CI_high pd ROPE_CI ROPE_low ROPE_high ROPE_Percentage
4 b_gravity 0.035 0.95 -0.018 0.406 0.701 0.95 -0.1 0.1 0.502
6 b_years_protected 0.660 0.95 0.633 0.703 1.000 0.95 -0.1 0.1 0.000
5 b_sst_range 0.056 0.95 0.050 0.061 1.000 0.95 -0.1 0.1 1.000
1 b_chl_range -0.016 0.95 -0.019 -0.012 1.000 0.95 -0.1 0.1 1.000
2 b_geomorphologycoastal_island -0.194 0.95 -0.207 -0.153 1.000 0.95 -0.1 0.1 0.000
3 b_geomorphologyoceanic_island -1.348 0.95 -1.682 -0.992 1.000 0.95 -0.1 0.1 0.000
[1] “rich”
Parameter Median CI CI_low CI_high pd ROPE_CI ROPE_low ROPE_high ROPE_Percentage
4 b_gravity -0.119 0.95 -0.250 0.018 0.948 0.95 -0.1 0.1 0.387
6 b_years_protected 0.029 0.95 -0.115 0.165 0.630 0.95 -0.1 0.1 0.821
5 b_sst_range -0.003 0.95 -0.028 0.022 0.576 0.95 -0.1 0.1 1.000
1 b_chl_range 0.010 0.95 -0.007 0.026 0.875 0.95 -0.1 0.1 1.000
2 b_geomorphologycoastal_island 0.050 0.95 -0.184 0.318 0.660 0.95 -0.1 0.1 0.625
3 b_geomorphologyoceanic_island 0.163 0.95 -0.289 0.684 0.743 0.95 -0.1 0.1 0.275

5 Results for a single data set per model

Code
models_1_data_set <- readRDS("./data/statistical_models/combined_models_results_1_data_set.RDS")

for (i in 1:length(models_1_data_set)) {
    print(names(models_1_data_set)[i])
    print(models_1_data_set[[i]]$table)
    print(models_1_data_set[[i]]$gg)
}

6 Results for 10 data set models (propagating FD uncertainty)

Code
models_10_data_set <- readRDS("./data/statistical_models/combined_models_results_10_data_set_no_iucn.RDS")

for (i in 1:length(models_10_data_set)) {
    print(names(models_10_data_set)[i])
    print(models_10_data_set[[i]]$table)
    print(models_10_data_set[[i]]$gg)
}

6.1 Model comparison

Code
brms_model_rds <- list.files("./data/statistical_models", pattern = "10-data",
    full.names = TRUE)

mean_looic <- pblapply(brms_model_rds, cl = 1, function(e) {

    mods <- readRDS(e)

    loos <- sapply(mods, function(x) x$criteria$loo$estimates)[c(3,
        6), ]

    out_df <- data.frame(models = gsub("-10-data-sets_brm_multiple.RDS",
        "", basename(e)), looic = mean(loos[1, ]), min.looic = min(loos[1,
        ]), max.looic = max(loos[1, ]), SE = mean(loos[2, ]))

    return(out_df)
})

mean_looic <- do.call(rbind, mean_looic)

saveRDS(mean_looic, "mean_looic_by_model.RDS")
Code
mean_looic <- readRDS("mean_looic_by_model.RDS")

for (i in c("FDis", "FDiv", "FEve", "taxdis")) {

    sub_looic <- mean_looic[grep(i, mean_looic$models), ]
    sub_looic <- sub_looic[order(sub_looic$looic, decreasing = FALSE),
        ]
    sub_looic$delta.looic <- sub_looic$looic - min(sub_looic$looic)

    df1 <- knitr::kable(sub_looic, row.names = TRUE, escape = FALSE,
        format = "html", digits = 3, caption = i)

    df1 <- kable_styling(df1, bootstrap_options = c("striped", "hover",
        "condensed", "responsive"), full_width = FALSE, font_size = 12)

    print(df1)
}

7 Results for 100 data set models (propagating FD uncertainty)

Code
models_100_data_set <- readRDS("./data/statistical_models/combined_models_results_10_data_sets.RDS")

for (i in 1:length(models_100_data_set)) {
    print(names(models_100_data_set)[i])
    print(models_100_data_set[[i]]$table)
    print(models_100_data_set[[i]]$gg)
}

Takeaways

 


 

Session information

R version 4.1.2 (2021-11-01)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.4 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=es_CR.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=es_CR.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=es_CR.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=es_CR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] parallel  splines   stats     graphics  grDevices utils     datasets 
[8] methods   base     

other attached packages:
 [1] warbleR_1.1.30     NatureSounds_1.0.4 seewave_2.2.3      tuneR_1.4.6       
 [5] bayestestR_0.13.2  cowplot_1.1.3      cmdstanr_0.7.1     ggcorrplot_0.1.4.1
 [9] kableExtra_1.4.0   HDInterval_0.2.4   ggridges_0.5.6     tidybayes_3.0.6   
[13] gamlss.add_5.1-13  rpart_4.1.16       nnet_7.3-17        mgcv_1.8-39       
[17] gamlss_5.4-22      nlme_3.1-155       gamlss.dist_6.1-1  gamlss.data_6.0-6 
[21] vegan_2.6-4        lattice_0.20-45    permute_0.9-7      lme4_1.1-35.1     
[25] Matrix_1.6-5       brms_2.21.0        Rcpp_1.0.12        phangorn_2.11.1   
[29] zoo_1.8-12         ape_5.7-1          geometry_0.4.5     svMisc_1.2.3      
[33] ade4_1.7-22        plyr_1.8.9         reshape_0.8.9      magrittr_2.0.3    
[37] dplyr_1.1.4        cluster_2.1.2      viridis_0.6.5      viridisLite_0.4.2 
[41] ggbeeswarm_0.7.2   ggplot2_3.5.0      pbapply_1.7-2      formatR_1.14      
[45] knitr_1.46        

loaded via a namespace (and not attached):
 [1] backports_1.4.1      fastmatch_1.1-4      systemfonts_1.0.6   
 [4] igraph_2.0.3         svUnit_1.0.6         rstantools_2.4.0    
 [7] inline_0.3.19        digest_0.6.35        htmltools_0.5.8.1   
[10] fansi_1.0.6          checkmate_2.3.1      remotes_2.5.0       
[13] RcppParallel_5.1.7   matrixStats_1.2.0    svglite_2.1.3       
[16] colorspace_2.1-0     signal_1.8-0         ggdist_3.3.2        
[19] xfun_0.43            crayon_1.5.2         RCurl_1.98-1.14     
[22] jsonlite_1.8.8       survival_3.2-13      glue_1.7.0          
[25] gtable_0.3.4         V8_4.4.2             distributional_0.4.0
[28] pkgbuild_1.4.4       rstan_2.32.6         abind_1.4-5         
[31] scales_1.3.0         mvtnorm_1.2-4        xaringanExtra_0.7.0 
[34] dtw_1.23-1           magic_1.6-0          proxy_0.4-27        
[37] stats4_4.1.2         StanHeaders_2.32.6   htmlwidgets_1.6.4   
[40] arrayhelpers_1.1-0   posterior_1.5.0      farver_2.1.1        
[43] pkgconfig_2.0.3      loo_2.7.0            utf8_1.2.4          
[46] labeling_0.4.3       reshape2_1.4.4       tidyselect_1.2.1    
[49] rlang_1.1.3          munsell_0.5.0        tools_4.1.2         
[52] cli_3.6.2            generics_0.1.3       evaluate_0.23       
[55] stringr_1.5.1        fastmap_1.1.1        yaml_2.3.8          
[58] processx_3.8.4       purrr_1.0.2          packrat_0.9.2       
[61] xml2_1.3.6           brio_1.1.4           compiler_4.1.2      
[64] bayesplot_1.11.1     rstudioapi_0.15.0    beeswarm_0.4.0      
[67] curl_5.2.1           testthat_3.2.1       sketchy_1.0.3       
[70] tibble_3.2.1         stringi_1.8.4        ps_1.7.6            
[73] Brobdingnag_1.2-9    nloptr_2.0.0         fftw_1.0-8          
[76] tensorA_0.36.2.1     vctrs_0.6.5          pillar_1.9.0        
[79] lifecycle_1.0.4      bridgesampling_1.1-2 bitops_1.0-7        
[82] insight_0.19.10      QuickJSR_1.1.3       R6_2.5.1            
[85] gridExtra_2.3        vipor_0.4.7          codetools_0.2-18    
[88] boot_1.3-28          MASS_7.3-55          rjson_0.2.21        
[91] withr_3.0.0          quadprog_1.5-8       grid_4.1.2          
[94] tidyr_1.3.1          coda_0.19-4.1        minqa_1.2.4         
[97] rmarkdown_2.26