diff --git a/estimation.R b/estimation.R new file mode 100644 index 0000000000000000000000000000000000000000..5ac35a783d4c51b2f581eb69743c9842eab5d268 --- /dev/null +++ b/estimation.R @@ -0,0 +1,407 @@ +library(INLA) +library(HDInterval) +library(modeest) +library(mvtnorm) +source("load_data.R") + +# Required functions + +f_G <- function(x){ + x * dnorm(x) / pnorm(x) +} + +f_z <- function(eta, rho2){ + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2))) / + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2) + sqrt(rho2)) + 2 * eta + rho2) +} + +f_sum <- function(x, p = 0.95){ + x <- x$value + tmp <- c(mean(x), sd(x), median(x), meanshift(x), hdi(x, p), + quantile(x, probs = c((1 - p)/2, 1 - (1 - p) / 2))) + names(tmp)[1:4] <- c("mean", "sd", "median", "mode") + return(as_tibble_row(tmp)) +} + +# Number of samples from posterior distribution +# Start off with fewer first! +sample_size <- 100 +# sample_size <- 10000 + +# Basic model with all the variance components +data_ammarnas_inla <- data_ammarnas %>% + mutate(species = as.numeric(as.factor(species)), + year2 = year) + +data_ammarnas_inla %>% + ggplot(aes(x = year, y = abundance)) + + geom_line(aes(group = species)) + +m01_am <- inla(abundance ~ f(year, + model = "ou", + group = species, + control.group = list(model = "iid")) + + f(species, model = "iid") + + f(year2, + model = "ou"), + family = "poisson", + data = data_ammarnas_inla) + +# Precision for year and species seem ok! +summary(m01_am) + +tmp_am_par <- inla.hyperpar.sample(sample_size, m01_am) %>% + as_tibble() %>% + mutate(se2 = 1 / `Precision for year`, + gamma = `Phi for year`, + gamma_c = `Phi for year2`, + sh2 = 1 / `Precision for species`, + sc2 = 1 / `Precision for year2`, + eta = inla.rmarginal(sample_size, + m01_am$marginals.fixed$`(Intercept)`), + rho2 = se2 + sh2 + sc2, + z = f_z(eta, rho2)) + +# How many species can there be in total: +n_years <- n_distinct(data_ammarnas$year) +n_sp <- 100 + + +p0_am = c() +for (i in 1:sample_size){ + sim <- tibble(species = 1:n_sp, + h_i = rnorm(n_sp, mean = 0, + sd = sqrt(tmp_am_par$sh2[i]))) %>% + add_column(year = list(tibble(year = 1:n_years, + c_t = c(rmvnorm(1, + mean = rep(0, n_years), + sigma = tmp_am_par$sc2[i] * + exp(-tmp_am_par$gamma_c[i] * + as.matrix(dist(1:n_years)))))))) %>% + unnest(cols = c(year)) %>% + arrange(year, species) %>% + mutate(s_i_t = c(rmvnorm(n_sp, + mean = rep(0, n_years), + sigma = tmp_am_par$se2[i] * + exp(-tmp_am_par$gamma[i] * + as.matrix(dist(1:n_years)))))) %>% + add_column(eta = tmp_am_par$eta[i]) + + sim <- sim %>% + mutate(abundance = rpois(nrow(sim), exp(eta + h_i + c_t + s_i_t))) + + p0_am <- c(p0_am, + 1 - n_distinct(select(filter(sim, abundance > 0), species)) / n_sp) + +} + +tmp_am_par <- tmp_am_par %>% + add_column(p0 = p0_am) %>% + mutate(ES = n_distinct(data_ammarnas$species) / (1 - p0), + I = 1 / (z * ES)) + +tmp_am_par_sum <- tmp_am_par %>% + select(se2:I) %>% + pivot_longer(se2:I) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +# write_rds(list(m01_am = m01_am, +# tmp_am_par = tmp_am_par, +# tmp_am_par_sum = tmp_am_par_sum), +# "model_ammarnas_inla.rds") + +# Basic model with all the variance components +data_budal_inla <- data_budal %>% + mutate(species = as.numeric(as.factor(species)), + year2 = year) + +data_budal_inla %>% + ggplot(aes(x = year, y = abundance)) + + geom_line(aes(group = species)) + +m01_bu <- inla(abundance ~ f(year, + model = "ou", + group = species, + control.group = list(model = "iid")) + + f(species, model = "iid") + + f(year2, + model = "ou"), + family = "poisson", + data = data_budal_inla) + +# Precision for year and species seem ok! +summary(m01_bu) + +tmp_bu_par <- inla.hyperpar.sample(sample_size, m01_bu) %>% + as_tibble() %>% + mutate(se2 = 1 / `Precision for year`, + gamma = `Phi for year`, + gamma_c = `Phi for year2`, + sh2 = 1 / `Precision for species`, + sc2 = 1 / `Precision for year2`, + eta = inla.rmarginal(sample_size, + m01_bu$marginals.fixed$`(Intercept)`), + rho2 = se2 + sh2 + sc2, + z = f_z(eta, rho2)) + +# How many species can there be in total: +n_years <- n_distinct(data_budal$year) +n_sp <- 100 + +library(mvtnorm) + +p0_bu = c() +for (i in 1:sample_size){ + sim <- tibble(species = 1:n_sp, + h_i = rnorm(n_sp, mean = 0, + sd = sqrt(tmp_bu_par$sh2[i]))) %>% + add_column(year = list(tibble(year = 1:n_years, + c_t = c(rmvnorm(1, + mean = rep(0, n_years), + sigma = tmp_bu_par$sc2[i] * + exp(-tmp_bu_par$gamma_c[i] * + as.matrix(dist(1:n_years)))))))) %>% + unnest(cols = c(year)) %>% + arrange(year, species) %>% + mutate(s_i_t = c(rmvnorm(n_sp, + mean = rep(0, n_years), + sigma = tmp_bu_par$se2[i] * + exp(-tmp_bu_par$gamma[i] * + as.matrix(dist(1:n_years)))))) %>% + add_column(eta = tmp_bu_par$eta[i]) + + sim <- sim %>% + mutate(abundance = rpois(nrow(sim), exp(eta + h_i + c_t + s_i_t))) + + p0_bu <- c(p0_bu, + 1 - n_distinct(select(filter(sim, abundance > 0), species)) / n_sp) + +} + +tmp_bu_par <- tmp_bu_par %>% + add_column(p0 = p0_bu) %>% + mutate(ES = n_distinct(data_budal$species) / (1 - p0), + I = 1 / (z * ES)) + +tmp_bu_par_sum <- tmp_bu_par %>% + select(se2:I) %>% + pivot_longer(se2:I) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +# write_rds(list(m01_bu = m01_bu, +# tmp_bu_par = tmp_bu_par, +# tmp_bu_par_sum = tmp_bu_par_sum), +# "model_budal_inla.rds") + +# Basic model with all the variance components +data_surrey_inla <- data_surrey %>% + mutate(species = as.numeric(as.factor(species)), + year2 = year) + +data_surrey_inla %>% + ggplot(aes(x = year, y = abundance)) + + geom_line(aes(group = species)) + +m01_su <- inla(abundance ~ f(year, + model = "ou", + group = species, + control.group = list(model = "iid")) + + f(species, model = "iid") + + f(year2, + model = "ou"), + family = "poisson", + data = data_surrey_inla) + +# Precision for year and species are not ok, so we change the prior of species. +summary(m01_su) + +m01_su <- inla(abundance ~ f(year, + model = "ou", + group = species, + control.group = list(model = "iid")) + + f(species, model = "iid", + hyper = list(theta = list(prior = "loggamma", + param = c(1, 5e-1)))) + + f(year2, + model = "ou"), + family = "poisson", + data = data_surrey_inla) + +summary(m01_su) + +tmp_su_par <- inla.hyperpar.sample(sample_size, m01_su) %>% + as_tibble() %>% + mutate(se2 = 1 / `Precision for year`, + gamma = `Phi for year`, + gamma_c = `Phi for year2`, + sh2 = 1 / `Precision for species`, + sc2 = 1 / `Precision for year2`, + eta = inla.rmarginal(sample_size, + m01_su$marginals.fixed$`(Intercept)`), + rho2 = se2 + sh2 + sc2, + z = f_z(eta, rho2)) + +# How many species can there be in total: +n_years <- n_distinct(data_surrey$year) +n_sp <- 100 + +library(mvtnorm) + +p0_su = c() +for (i in 1:sample_size){ + sim <- tibble(species = 1:n_sp, + h_i = rnorm(n_sp, mean = 0, + sd = sqrt(tmp_su_par$sh2[i]))) %>% + add_column(year = list(tibble(year = 1:n_years, + c_t = c(rmvnorm(1, + mean = rep(0, n_years), + sigma = tmp_su_par$sc2[i] * + exp(-tmp_su_par$gamma_c[i] * + as.matrix(dist(1:n_years)))))))) %>% + unnest(cols = c(year)) %>% + arrange(year, species) %>% + mutate(s_i_t = c(rmvnorm(n_sp, + mean = rep(0, n_years), + sigma = tmp_su_par$se2[i] * + exp(-tmp_su_par$gamma[i] * + as.matrix(dist(1:n_years)))))) %>% + add_column(eta = tmp_su_par$eta[i]) + + sim <- sim %>% + mutate(abundance = rpois(nrow(sim), exp(eta + h_i + c_t + s_i_t))) + + p0_su <- c(p0_su, + 1 - n_distinct(select(filter(sim, abundance > 0), species)) / n_sp) + +} + +tmp_su_par <- tmp_su_par %>% + add_column(p0 = p0_su) %>% + mutate(ES = n_distinct(data_surrey$species) / (1 - p0), + I = 1 / (z * ES)) + +tmp_su_par_sum <- tmp_su_par %>% + select(se2:I) %>% + pivot_longer(se2:I) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +# write_rds(list(m01_su = m01_su, +# tmp_su_par = tmp_su_par, +# tmp_su_par_sum = tmp_su_par_sum), +# "model_surrey_inla.rds") + +# Basic model with all the variance components +data_valley_inla <- data_valley %>% + mutate(species = as.numeric(as.factor(species)), + year2 = year) + +data_valley_inla %>% + ggplot(aes(x = year, y = abundance)) + + geom_line(aes(group = species)) + +m01_va <- inla(abundance ~ f(year, + model = "ou", + group = species, + control.group = list(model = "iid")) + + f(species, model = "iid") + + f(year2, + model = "ou"), + family = "poisson", + data = data_valley_inla) + +# Precision for year and species are not ok, so we change the prior of species. +summary(m01_va) + +m01_va <- inla(abundance ~ f(year, + model = "ou", + group = species, + control.group = list(model = "iid")) + + f(species, model = "iid", + hyper = list(theta = list(prior = "loggamma", + param = c(0.5, 5e-1)))) + + f(year2, model = "ou"), + family = "poisson", + data = data_valley_inla) + +summary(m01_va) + +tmp_va_par <- inla.hyperpar.sample(sample_size, m01_va) %>% + as_tibble() %>% + mutate(se2 = 1 / `Precision for year`, + gamma = `Phi for year`, + gamma_c = `Phi for year2`, + sh2 = 1 / `Precision for species`, + sc2 = 1 / `Precision for year2`, + eta = inla.rmarginal(sample_size, + m01_va$marginals.fixed$`(Intercept)`), + rho2 = se2 + sh2 + sc2, + z = f_z(eta, rho2)) + +# How many species can there be in total: +n_years <- n_distinct(data_valley$year) +n_sp <- 100 + +library(mvtnorm) + +p0_va = c() +for (i in 1:sample_size){ + sim <- tibble(species = 1:n_sp, + h_i = rnorm(n_sp, mean = 0, + sd = sqrt(tmp_va_par$sh2[i]))) %>% + add_column(year = list(tibble(year = 1:n_years, + c_t = c(rmvnorm(1, + mean = rep(0, n_years), + sigma = tmp_va_par$sc2[i] * + exp(-tmp_va_par$gamma_c[i] * + as.matrix(dist(1:n_years)))))))) %>% + unnest(cols = c(year)) %>% + arrange(year, species) %>% + mutate(s_i_t = c(rmvnorm(n_sp, + mean = rep(0, n_years), + sigma = tmp_va_par$se2[i] * + exp(-tmp_va_par$gamma[i] * + as.matrix(dist(1:n_years)))))) %>% + add_column(eta = tmp_va_par$eta[i]) + + sim <- sim %>% + mutate(abundance = rpois(nrow(sim), exp(eta + h_i + c_t + s_i_t))) + + p0_va <- c(p0_va, + 1 - n_distinct(select(filter(sim, abundance > 0), species)) / n_sp) + +} + +tmp_va_par <- tmp_va_par %>% + add_column(p0 = p0_va) %>% + mutate(ES = n_distinct(data_valley$species) / (1 - p0), + I = 1 / (z * ES)) + +tmp_va_par_sum <- tmp_va_par %>% + select(se2:I) %>% + pivot_longer(se2:I) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +# write_rds(list(m01_va = m01_va, +# tmp_va_par = tmp_va_par, +# tmp_va_par_sum = tmp_va_par_sum), +# "model_valley_inla.rds") diff --git a/fig1.R b/fig1.R new file mode 100644 index 0000000000000000000000000000000000000000..a859eafc86c760c82402f0f86f02857a80ab6111 --- /dev/null +++ b/fig1.R @@ -0,0 +1,174 @@ +# Figure 1 #### + +# Required packages +library(tidyverse) +library(mvtnorm) +library(patchwork) + +# Parameters for community in (a) +gamma <- 0.1 +lnK <- 5 +se2 <- 0.1 +sh2 <- 0.3 +sc2 <- 1.1 +n_sp <- 30 +n_years <- 30 + +# To get the same results +set.seed(134) + +# Correlation matrix +cor_mat <- exp(-gamma * as.matrix(dist(1:n_years))) + +sim01 <- tibble(species = 1:n_sp, + h_i = rnorm(n_sp, mean = 0, sd = sqrt(sh2))) %>% + add_column(year = list(tibble(year = 1:n_years, + c_t = c(rmvnorm(1, + mean = rep(0, n_years), + sigma = sc2 * cor_mat))))) %>% + unnest(cols = c(year)) %>% + arrange(year, species) %>% + mutate(s_i_t = c(rmvnorm(n_sp, + mean = rep(0, n_years), + sigma = se2 * cor_mat))) %>% + add_column(eta = lnK) + +# Parameters in community (b) +lnK <- 5 +se2 <- 0.6 +sh2 <- 0.3 +sc2 <- 0.6 + +sim02 <- tibble(species = 1:n_sp, + h_i = rnorm(n_sp, mean = 0, sd = sqrt(sh2))) %>% + add_column(year = list(tibble(year = 1:n_years, + c_t = c(rmvnorm(1, + mean = rep(0, n_years), + sigma = sc2 * cor_mat))))) %>% + unnest(cols = c(year)) %>% + arrange(year, species) %>% + mutate(s_i_t = c(rmvnorm(n_sp, + mean = rep(0, n_years), + sigma = se2 * cor_mat))) %>% + add_column(eta = lnK) + +# Parameters in community (c) +lnK <- 5 +se2 <- 1.1 +sh2 <- 0.3 +sc2 <- 0.1 + +sim03 <- tibble(species = 1:n_sp, + h_i = rnorm(n_sp, mean = 0, sd = sqrt(sh2))) %>% + add_column(year = list(tibble(year = 1:n_years, + c_t = c(rmvnorm(1, + mean = rep(0, n_years), + sigma = sc2 * cor_mat))))) %>% + unnest(cols = c(year)) %>% + arrange(year, species) %>% + mutate(s_i_t = c(rmvnorm(n_sp, + mean = rep(0, n_years), + sigma = se2 * cor_mat))) %>% + add_column(eta = lnK) + +fig_data <- bind_rows(add_column(sim01, mod = "common"), + add_column(sim02, mod = "mix"), + add_column(sim03, mod = "species")) + +fig_data <- fig_data %>% + mutate(mod = factor(mod, levels = c("species", "common", "mix"))) + + +fig_data_a <- fig_data %>% + filter(year == 5) + +fig_data_b <- fig_data %>% + filter(year == 25) + +# Illustrate temporal dynamics of communities + +fig1a <- fig_data %>% + ggplot(aes(x = year, y = eta + h_i + c_t + s_i_t)) + + geom_line(data = filter(fig_data, + species != 1), + aes(group = species), colour = "light grey") + + geom_line(data = filter(fig_data, + species == 1), + aes(group = species), colour = "black") + + # geom_point(data = fig_data_a, shape = 21, size = rel(2), fill = "white") + + # geom_point(data = fig_data_b, size = rel(2)) + + geom_text(data = tibble(mod = factor(c("species", "common", "mix"), + levels = c("species", "common", "mix")), + x = rep(2, 3), + y = rep(7.7, 3), + label = c("(a)", "(b)", "(c)")), + aes(x = x, y = y, label = label), size = rel(5)) + + facet_wrap(~ mod, nrow = 1) + + labs(x = "Time", y = "Log abundance") + + theme_bw() + + theme(strip.background = element_blank(), + strip.text = element_blank(), + axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2))) + +fig_data_c <- fig_data %>% + filter(year %in% c(5, 25)) + +# Illustrate log abundance distribution + +fig1b <- fig_data_c %>% + ggplot(aes(x = eta + h_i + c_t + s_i_t)) + + geom_histogram(aes(fill = as.factor(year)), + position = "dodge", colour = "black") + + geom_text(data = tibble(mod = factor(c("species", "common", "mix"), + levels = c("species", "common", "mix")), + x = rep(2.1, 3), + y = rep(5.8, 3), + label = c("(d)", "(e)", "(f)")), + aes(x = x, y = y, label = label), size = rel(5)) + + facet_wrap(~ mod, nrow = 1) + + scale_fill_manual("Time", values = c("white", "black")) + + labs(x = "Log abundance", y = "Count") + + theme_bw() + + theme(legend.position = c(.23, .99), + legend.justification = c("left", "top"), + legend.box.just = "right", + legend.margin = margin(6, 6, 6, 6), + legend.text = element_text(size = rel(1.2)), + legend.title = element_text(size = rel(1.2)), + strip.background = element_blank(), + strip.text = element_blank(), + axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2))) + +# Illustrate covariation between two time points + +fig1c <- fig_data %>% + mutate(log_abundance = eta + h_i + c_t + s_i_t) %>% + select(-eta, -h_i, -c_t, -s_i_t) %>% + pivot_wider(values_from = log_abundance, + names_from = year) %>% + ggplot(aes(x = `5`, + y = `25`)) + + geom_abline(slope = 1, intercept = 0, col = "grey") + + geom_point(size = rel(2), shape = 21, fill = "grey") + + geom_text(data = tibble(mod = factor(c("species", "common", "mix"), + levels = c("species", "common", "mix")), + x = rep(2.1, 3), + y = rep(7.0, 3), + label = c("(g)", "(h)", "(i)")), + aes(x = x, y = y, label = label), size = rel(5)) + + labs(x = "Log abundance at time 5", + y = "Log abundance at time 25") + + facet_wrap(~ mod, nrow = 1) + + theme_bw() + + theme(strip.background = element_blank(), + strip.text = element_blank(), + axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2))) + +# Join the figures together + +fig1a + fig1b + fig1c + plot_layout(nrow = 3) + +# ggsave("Fig1.pdf", height = 8, width = 9) diff --git a/fig2.R b/fig2.R new file mode 100644 index 0000000000000000000000000000000000000000..1924940b89496b63b5a1795e370162e2338d7c68 --- /dev/null +++ b/fig2.R @@ -0,0 +1,138 @@ +# Figure 2 #### + +# Required packages +library(tidyverse) +library(patchwork) + +# Required functions + +f_G <- function(x){ + x * dnorm(x) / pnorm(x) +} + +f_z <- function(eta, rho2){ + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2))) / + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2) + sqrt(rho2)) + 2 * eta + rho2) +} + + +f_EN <- function(eta, rho2, ES){ + prop <- pnorm(0, mean = eta, + sd = sqrt(rho2), lower.tail = FALSE) + EN <- integrate(function(x){exp(x) * ES * dnorm(x, + mean = eta, + sd = sqrt(rho2)) / prop}, + lower = 0, upper = 100)$value + return(EN) +} + +# Calculate z for each simulation #### + +fig2a_data <- tibble(case = c("A", "B", "C"), + mu = rep(5, 3), + sd = sqrt(c(0.4, 0.9, 1.4))) %>% + mutate(x = list(seq(1, 11, length.out = 1000))) %>% + unnest(x) %>% + mutate(ds = dnorm(x, mean = mu, sd = sd)) + +fig2a <- fig2a_data %>% + ggplot(aes(x = x, y = ds)) + + geom_line(aes(colour = case), linewidth = 1) + + theme_bw() + + scale_x_continuous(expand = c(0, 0)) + + scale_y_continuous(expand = c(0, 0), limits = c(0, 0.65)) + + scale_color_discrete(name = "Total variance:", + breaks = c("A", "B", "C"), + labels = c("0.4", "0.9", "1.4")) + + labs(x = "Log abundance, x", + y = "Density") + + theme(axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2)), + legend.title = element_text(size = rel(1.2)), + legend.text = element_text(size = rel(1.2)), + legend.position = c(0.75, 0.75), + plot.margin = margin(-5.5, 33, 5.5, 5.5, "pt")) + +fig2b_data <- tibble(case = c("A", "B", "C"), + mu = rep(5, 3), + sd = sqrt(c(0.4, 0.9, 1.4)), + z = f_z(mu, sd ^ 2)) %>% + mutate(dlnEN = list(seq(0, 4, length.out = 100))) %>% + unnest(dlnEN) %>% + mutate(dlnES = dlnEN * z) + +fig2b <- fig2b_data %>% + ggplot(aes(x = dlnEN, y = dlnES)) + + geom_line(aes(colour = case), linewidth = 1) + + theme_bw() + + scale_x_continuous(expand = c(0, 0)) + + scale_y_continuous(expand = c(0, 0), limits = c(0, 4)) + + labs(x = "Change in log total abundance, dln EN", + y = "Change in log number of species, dln ES") + + guides(colour = "none") + + theme(axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2)), + plot.margin = margin(-5.5, 33, 5.5, 5.5, "pt")) + + +fig2c_data <- tibble(case = c("A", "B", "C"), + eta = rep(5, 3), + ES = c(20, 30, 50)) %>% + mutate(rho2 = list(seq(0, 10, length.out = 1000))) %>% + unnest(rho2) %>% + rowwise() %>% + mutate(z = f_z(eta, rho2), + EN = f_EN(eta, rho2, ES), + I = 1 / (z * ES)) + +fig2c <- fig2c_data %>% + ggplot(aes(x = log(EN), y = z)) + + geom_line(aes(linetype = case), linewidth = 1) + + geom_point(data = filter(fig2c_data, + round(rho2, digits = 2) %in% c(0.61, 1.00, 1.40)), + aes(x = log(EN), y = z, colour = as.factor(rho2)), + size = rel(3)) + + theme_bw() + + scale_x_continuous(expand = c(0, 0), limits = c(8, 12)) + + scale_y_continuous(expand = c(0, 0), limits = c(0, 1)) + + scale_linetype_manual(name = "ES", + breaks = c("A", "B", "C"), + labels = c("20", "30", "50"), + values = c(2, 1, 3)) + + labs(x = "Log expected total community abundance, ln EN", + y = "Community sensitivity, z") + + guides(colour = "none") + + theme(axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2)), + legend.title = element_text(size = rel(1.2)), + legend.text = element_text(size = rel(1.2)), + legend.position = c(0.75, 0.75), + plot.margin = margin(-5.5, 33, 5.5, 5.5, "pt")) + +fig2d <- fig2c_data %>% + ggplot(aes(x = log(EN), y = I)) + + geom_line(aes(linetype = case), linewidth = 1) + + geom_point(data = filter(fig2c_data, + round(rho2, digits = 2) %in% c(0.61, 1.00, 1.40)), + aes(x = log(EN), y = I, colour = as.factor(rho2)), + size = rel(3)) + + theme_bw() + + scale_x_continuous(expand = c(0, 0), limits = c(8, 12)) + + scale_y_continuous(expand = c(0, 0), limits = c(0, 0.4)) + + scale_linetype_manual(name = "ES", + breaks = c("A", "B", "C"), + labels = c("20", "30", "50"), + values = c(2, 1, 3)) + + labs(x = "Log expected total community abundance, ln EN", + y = "Community resistance, I") + + guides(linetype = "none", + colour = "none") + + theme(axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2)), + plot.margin = margin(-5.5, 33, 5.5, 5.5, "pt")) + +fig2a + fig2b + fig2c + fig2d + + plot_layout(ncol = 2) + + plot_annotation(tag_levels = "a") + +# ggsave("Fig2.pdf", height = 8, width = 9) diff --git a/fig3.R b/fig3.R new file mode 100644 index 0000000000000000000000000000000000000000..6fbd94a3c400946bd0542339d91876fdee2b93d1 --- /dev/null +++ b/fig3.R @@ -0,0 +1,256 @@ +# Figure 3 #### + +# Required packages +library(tidyverse) +library(HDInterval) +library(modeest) +library(patchwork) + +# Required functions + +f_G <- function(x){ + x * dnorm(x) / pnorm(x) +} + +f_z <- function(eta, rho2){ + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2))) / + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2) + sqrt(rho2)) + 2 * eta + rho2) +} + +f_sum <- function(x, p = 0.95){ + x <- x$value + tmp <- c(mean(x), sd(x), median(x), meanshift(x), hdi(x, p), + quantile(x, probs = c((1 - p)/2, 1 - (1 - p) / 2))) + names(tmp)[1:4] <- c("mean", "sd", "median", "mode") + return(as_tibble_row(tmp)) +} + +# Estimating expected total abundance + +# We assume that lambda(x) is approximately normal and use the estimated +# expected number of species to estimate the total abundance: + +f_EN <- function(eta, rho2, ES){ + prop <- pnorm(0, mean = eta, + sd = sqrt(rho2), lower.tail = FALSE) + EN <- integrate(function(x){exp(x) * ES * dnorm(x, + mean = eta, + sd = sqrt(rho2)) / prop}, + lower = 0, upper = 100)$value + return(EN) +} + +model_ammarnas <- read_rds("model_ammarnas_inla.rds") +tmp_am_par <- model_ammarnas$tmp_am_par +tmp_am_par_sum <- model_ammarnas$tmp_am_par_sum + +tmp_am_par <- tmp_am_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_am_par_sum <- tmp_am_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +model_budal <- read_rds("model_budal_inla.rds") +tmp_bu_par <- model_budal$tmp_bu_par +tmp_bu_par_sum <- model_budal$tmp_bu_par_sum +tmp_bu_par <- tmp_bu_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_bu_par_sum <- tmp_bu_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +model_surrey <- read_rds("model_surrey_inla.rds") +tmp_su_par <- model_surrey$tmp_su_par +tmp_su_par_sum <- model_surrey$tmp_su_par_sum +tmp_su_par <- tmp_su_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_su_par_sum <- tmp_su_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +model_valley <- read_rds("model_valley_inla.rds") +tmp_va_par <- model_valley$tmp_va_par +tmp_va_par_sum <- model_valley$tmp_va_par_sum +tmp_va_par <- tmp_va_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_va_par_sum <- tmp_va_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +locations <- c("Ammarnäs", "Budal", "Eastern Wood", "Birdsong Valley") + +fig3_data <- bind_rows(add_column(tmp_am_par, + Location = "Ammarnäs"), + add_column(tmp_bu_par, + Location = "Budal"), + add_column(tmp_su_par, + Location = "Eastern Wood"), + add_column(tmp_va_par, + Location = "Birdsong Valley")) %>% + # Select posterior samples that are within the upper and lower highest + # density interval for community sensitivity (z) and resistance (I) + filter((Location == "Ammarnäs" & + I > tmp_am_par_sum$lower[11] & + I < tmp_am_par_sum$upper[11] & + z > tmp_am_par_sum$lower[8] & + z < tmp_am_par_sum$upper[8]) | + (Location == "Budal" & + I > tmp_bu_par_sum$lower[11] & + I < tmp_bu_par_sum$upper[11] & + z > tmp_bu_par_sum$lower[8] & + z < tmp_bu_par_sum$upper[8]) | + (Location == "Eastern Wood" & + I > tmp_su_par_sum$lower[11] & + I < tmp_su_par_sum$upper[11] & + z > tmp_su_par_sum$lower[8] & + z < tmp_su_par_sum$upper[8]) | + (Location == "Birdsong Valley" & + I > tmp_va_par_sum$lower[11] & + I < tmp_va_par_sum$upper[11] & + z > tmp_va_par_sum$lower[8] & + z < tmp_va_par_sum$upper[8])) %>% + mutate(Location = factor(Location, levels = locations)) + +asterisk_data <- bind_rows(add_column(tmp_am_par_sum, + Location = "Ammarnäs"), + add_column(tmp_bu_par_sum, + Location = "Budal"), + add_column(tmp_su_par_sum, + Location = "Eastern Wood"), + add_column(tmp_va_par_sum, + Location = "Birdsong Valley")) %>% + mutate(Location = factor(Location, levels = locations)) + +asterisk_z_data <- asterisk_data %>% + filter(name %in% c("z", "logEN")) %>% + select(name, mean, Location) %>% + pivot_wider(names_from = name, values_from = mean) %>% + pivot_longer(c(z)) + +asterisk_I_data <- asterisk_data %>% + filter(name %in% c("I", "logEN")) %>% + select(name, mean, Location) %>% + pivot_wider(names_from = name, values_from = mean) %>% + pivot_longer(c(I)) + +fig3a <- fig3_data %>% + select(Location, EN, z) %>% + pivot_longer(z) %>% + ggplot(aes(x = log(EN), y = value)) + + geom_point(aes(colour = Location), size = rel(2)) + + geom_point(data = asterisk_z_data, + aes(x = logEN, y = value), size = rel(4), + shape = "asterisk", stroke = 2) + + geom_text(data = tibble(Location = factor(locations, levels = locations), + logEN = rep(12, 4), + z = rep(0.33, 4), + label = c("(a)", "(b)", "(c)", "(d)")), + aes(x = logEN, y = z, label = label), size = rel(5)) + + facet_wrap(~ Location, ncol = 4) + + guides(colour = "none") + + labs(y = "Community sensitivity, z", + x = "ln EN") + + theme_bw() + + theme( + legend.position = c(.99, .99), + legend.justification = c("right", "top"), + legend.box.just = "right", + legend.margin = margin(6, 6, 6, 6), + strip.background = element_rect(fill = "white"), + strip.text = element_text(size = rel(1.1)), + axis.title.y = element_text(size = rel(1.2)), + axis.text.y = element_text(size = rel(1.2)), + axis.title.x = element_blank(), + axis.text.x = element_blank() + ) + + +fig3b <- fig3_data %>% + select(Location, EN, I) %>% + pivot_longer(I) %>% + ggplot(aes(x = log(EN), y = value)) + + geom_point(aes(colour = Location), size = rel(2)) + + geom_point(data = asterisk_I_data, + aes(x = logEN, y = value), size = rel(4), + shape = "asterisk", stroke = 2) + + geom_text(data = tibble(Location = factor(locations, levels = locations), + logEN = rep(5, 4), + I = rep(0.7, 4), + label = c("(e)", "(f)", "(g)", "(h)")), + aes(x = logEN, y = I, label = label), size = rel(5)) + + facet_wrap(~ Location, ncol = 4) + + guides(colour = "none") + + labs(y = "Community resistance, I", + x = "Log expected total community abundance, ln EN") + + theme_bw() + + theme( + legend.position = c(.99, .99), + legend.justification = c("right", "top"), + legend.box.just = "right", + legend.margin = margin(6, 6, 6, 6), + strip.background = element_rect(fill = "white"), + strip.text = element_blank(), + axis.title.y = element_text(size = rel(1.2)), + axis.text.y = element_text(size = rel(1.2)), + axis.title.x = element_text(size = rel(1.2)), + axis.text.x = element_text(size = rel(1.2)) + ) + +fig3a + fig3b + plot_layout(nrow = 2) + +# ggsave("Fig3.pdf", height = 8, width = 9) + +# Tables for SI: + +xtable::xtable(tmp_am_par_sum) +xtable::xtable(tmp_bu_par_sum) +xtable::xtable(tmp_su_par_sum) +xtable::xtable(tmp_va_par_sum) diff --git a/fig4.R b/fig4.R new file mode 100644 index 0000000000000000000000000000000000000000..c43b5e93335444f151c6586e63dc08df4cc6d1a4 --- /dev/null +++ b/fig4.R @@ -0,0 +1,94 @@ +# Figure 4 #### + +# Required packages +library(tidyverse) +library(patchwork) + +source("load_data.R") + +f_results <- function(location = "am", type = "single"){ + tmp <- read_rds(paste(switch(type, + "single" = "res_single_", + "inc" = "res_inc_year_"), location, ".rds", sep = "")) + count <- 0 + tmp_data <- get(switch(location, + "am" = "data_ammarnas", + "bu" = "data_budal", + "su" = "data_surrey", + "va" = "data_valley")) + tmp_res <- c() + + range <- ifelse(type == "single", 1, 2):length(unique(tmp_data$year)) + for (k in unique(tmp_data$year)[range]){ + count <- count + 1 + tmp_res <- tmp_res %>% + bind_rows(add_column(tmp[[count]][[3]], year = k)) + } + + tmp_res <- tmp_res %>% + add_column(Location = switch(location, + "am" = "Ammarnäs", + "bu" = "Budal", + "su" = "Eastern Wood", + "va" = "Birdsong Valley")) + + return(tmp_res) +} + +res_single_am_sum <- f_results(location = "am") +res_single_bu_sum <- f_results(location = "bu") +res_single_su_sum <- f_results(location = "su") +res_single_va_sum <- f_results(location = "va") +res_inc_year_am_sum <- f_results(location = "am", type = "inc") +res_inc_year_bu_sum <- f_results(location = "bu", type = "inc") +res_inc_year_su_sum <- f_results(location = "su", type = "inc") +res_inc_year_va_sum <- f_results(location = "va", type = "inc") + +# How does the increasing number of years affect the estimates? + +tmp_data <- bind_rows(res_single_am_sum, + res_single_bu_sum, + res_single_su_sum, + res_single_va_sum) %>% + add_column(data = "Single year") %>% + bind_rows(add_column(bind_rows(res_inc_year_am_sum, + res_inc_year_bu_sum, + res_inc_year_su_sum, + res_inc_year_va_sum), + data = "Increasing years")) + +tmp_data <- tmp_data %>% + mutate(Location = factor(Location, + levels = c("Ammarnäs", + "Budal", + "Eastern Wood", + "Birdsong Valley"))) + +tbl_name <- tibble(name = c("rho2", "z", "ES", "I"), + new_name = factor(c("sigma^2", "z", "ES", "I"), + levels = c("sigma^2", "z", "ES", "I"))) + +tmp_data %>% + filter(name %in% c("rho2", "z", "ES", "I")) %>% + left_join(tbl_name) %>% + filter(mean < 150) %>% + ggplot(aes(x = year, y = mean)) + + geom_point(aes(colour = data)) + + geom_line(aes(colour = data)) + + facet_grid(new_name ~ Location, + scales = "free", + labeller = labeller(new_name = label_parsed)) + + scale_color_manual(values = c("orange", "skyblue")) + + guides(colour = "none") + + theme_bw() + + scale_x_continuous(name = "Year", expand = c(0.05,0.05)) + + scale_y_continuous(name = "Parameter estimate", expand = c(0.1,0.1)) + + theme(legend.position = c(.99, .99), + legend.justification = c("right", "top"), + legend.box.just = "right", + legend.margin = margin(6, 6, 6, 6), + strip.background = element_rect(fill = "white"), + strip.text = element_text(size = rel(1.2)), + axis.title = element_text(size = rel(1.2)), + axis.text = element_text(size = rel(1.2)) + ) diff --git a/fig5.R b/fig5.R new file mode 100644 index 0000000000000000000000000000000000000000..3413b96dcace8098d3a4c7b62b729c2845e6295a --- /dev/null +++ b/fig5.R @@ -0,0 +1,101 @@ +# Figure 5 #### + +# Required packages +library(tidyverse) +library(patchwork) + +# Required functions +f_G <- function(x){ + x * dnorm(x) / pnorm(x) +} + +f_z <- function(eta, rho2){ + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2))) / + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2) + sqrt(rho2)) + 2 * eta + rho2) +} + +# Load results +model_ammarnas <- read_rds("model_ammarnas_inla.rds") +model_budal <- read_rds("model_budal_inla.rds") +model_surrey <- read_rds("model_surrey_inla.rds") +model_valley <- read_rds("model_valley_inla.rds") +tmp_am_par_sum <- model_ammarnas$tmp_am_par_sum +tmp_bu_par_sum <- model_budal$tmp_bu_par_sum +tmp_su_par_sum <- model_surrey$tmp_su_par_sum +tmp_va_par_sum <- model_valley$tmp_va_par_sum + +fig5_data <- add_column(tmp_am_par_sum, Location = "Ammarnäs") %>% + bind_rows(add_column(tmp_bu_par_sum, Location = "Budal")) %>% + bind_rows(add_column(tmp_su_par_sum, Location = "Eastern Wood")) %>% + bind_rows(add_column(tmp_va_par_sum, Location = "Birdsong Valley")) %>% + mutate(Location = factor(Location, + levels = c("Ammarnäs", + "Budal", + "Eastern Wood", + "Birdsong Valley"))) %>% + filter(name %in% c("eta", "rho2", "ES")) %>% + select(name, mean, Location) %>% + pivot_wider(names_from = name, + values_from = mean) %>% + mutate(nlog10nu = list(seq(0, 3, length.out = 100))) %>% + unnest(cols = c(nlog10nu)) %>% + rowwise() %>% + mutate(nu = 10 ^ (-nlog10nu), + z = f_z(log(exp(eta) * nu), rho2), + I = 1 / (ES * z)) + +fig5a <- fig5_data %>% + ggplot(aes(x = nlog10nu, y = z)) + + geom_line(aes(colour = Location), linewidth = 1) + + labs(y = "Community sensitivity, z", + x = "Sampling intensity (proportion sampled)") + + theme_bw() + + scale_x_continuous(expand = c(0.01, 0.01), + breaks = c(0, 1, 2, 3), + labels = c("1", "0.1", "0.01", "0.001")) + + scale_y_continuous(limits = c(0, 0.6), expand = c(0.01, 0.01)) + + theme( + legend.position = c(.01, .99), + legend.justification = c("left", "top"), + legend.box.just = "right", + legend.margin = margin(6, 6, 6, 6), + legend.title = element_text(size = rel(1.2)), + legend.text = element_text(size = rel(1.2)), + strip.background = element_rect(fill = "white"), + strip.text = element_blank(), + axis.title.y = element_text(size = rel(1.2)), + axis.text.y = element_text(size = rel(1.2)), + axis.title.x = element_text(size = rel(1.2)), + axis.text.x = element_text(size = rel(1.2)), + plot.margin = margin(5.5, 10, 5.5, 5.5) + ) + +fig5b <- fig5_data %>% + ggplot(aes(x = nlog10nu, y = I)) + + geom_line(aes(colour = Location), linewidth = 1) + + guides(colour = "none") + + labs(y = "Community resistance, I", + x = "Sampling intensity (proportion sampled)") + + theme_bw() + + scale_x_continuous(expand = c(0.01, 0.01), + breaks = c(0, 1, 2, 3), + labels = c("1", "0.1", "0.01", "0.001")) + + scale_y_continuous(limits = c(0, 0.6), expand = c(0.01, 0.01)) + + theme( + legend.position = c(.01, .99), + legend.justification = c("left", "top"), + legend.box.just = "right", + legend.margin = margin(6, 6, 6, 6), + legend.title = element_text(size = rel(1.2)), + legend.text = element_text(size = rel(1.2)), + strip.background = element_rect(fill = "white"), + strip.text = element_blank(), + axis.title.y = element_text(size = rel(1.2)), + axis.text.y = element_text(size = rel(1.2)), + axis.title.x = element_text(size = rel(1.2)), + axis.text.x = element_text(size = rel(1.2)), + plot.margin = margin(5.5, 10, 5.5, 5.5) + ) + +fig5a + fig5b + plot_layout(nrow = 1) + plot_annotation(tag_levels = "a") +# ggsave("Fig5.pdf", height = 6, width = 8, ) diff --git a/load_data.R b/load_data.R new file mode 100644 index 0000000000000000000000000000000000000000..9862e331994381423dc28a5cf957ff692c0d7b85 --- /dev/null +++ b/load_data.R @@ -0,0 +1,111 @@ +library(tidyverse) + +# Data preparation given the initial data files, stored in a folder "datasets" + +# Ammarnas #### + +bird_ammarnas <- read_delim("datasets/bird_ammarnas.csv", + delim = ";", + escape_double = FALSE, + trim_ws = TRUE, + show_col_types = FALSE) + +bird_ammarnas_wide <- bird_ammarnas %>% + pivot_wider(names_from = Species, + values_from = Abundance, + values_fill = 0) + +bird_ammarnas_long <- bird_ammarnas_wide %>% + pivot_longer(cols = c(-Year), + names_to = "species", + values_to = "abundance") %>% + rename(year = Year) %>% + add_column(omr_id = "Ammarnas") + +data_ammarnas <- bird_ammarnas_long %>% + mutate(year = year - min(year)) + +# Budal #### + +bird_budal <- readxl::read_excel("datasets/Budalen_pr_2018_revised.xlsx") + +bird_budal_long <- bird_budal %>% + dplyr::select(year:buskskv) %>% + filter(!(year %in% 1998:1999)) %>% + pivot_longer(cols = c(-year), + names_to = "species", + values_to = "abundance") %>% + mutate(abundance = round(as.numeric(ifelse(abundance == "NA", + "0", + abundance)))) + +bird_budal_wide <- bird_budal_long %>% + pivot_wider(names_from = "species", + values_from = "abundance", + values_fill = 0) + +bird_budal_long <- bird_budal_wide %>% + pivot_longer(cols = c(-year), + names_to = "species", + values_to = "abundance") %>% + add_column(omr_id = "Budal") + +data_budal <- bird_budal_long %>% + mutate(year = year - min(year)) + +# Eastern Wood (sorry about the wrong names!) #### + +bird_surrey <- read_delim("datasets/bird_sussex.txt", delim = ";", + escape_double = FALSE, + trim_ws = TRUE, + show_col_types = FALSE) + +bird_surrey_wide <- bird_surrey %>% + filter(Year > 1949) %>% + pivot_wider(names_from = Species, + values_from = Abundance, + values_fill = 0) + +bird_surrey_long <- bird_surrey_wide %>% + pivot_longer(cols = c(-Year), + names_to = "species", + values_to = "abundance") %>% + rename(year = Year) %>% + add_column(omr_id = "Surrey") %>% + mutate(abundance = round(abundance)) + +data_surrey <- bird_surrey_long %>% + mutate(year = year - min(year)) + +# Birdsong Valley #### + +bird_valley <- readxl::read_excel("datasets/Birdsong Valley.xlsx", + col_names = c("species", + "year", + "abundance", + "skip_1", + "skip_2", + "skip_3")) + +bird_valley_wide <- bird_valley %>% + dplyr::select(year, species, abundance) %>% + mutate(abundance = ifelse(is.na(abundance), 0, abundance)) %>% + pivot_wider(names_from = "species", + values_from = "abundance", + values_fill = 0) + +bird_valley_long <- bird_valley_wide %>% + pivot_longer(cols = c(-year), + names_to = "species", + values_to = "abundance") %>% + add_column(omr_id = "Birdsong Valley") + +data_valley <- bird_valley_long %>% + mutate(year = year - min(year)) + +# Clean-up #### + +rm(list = c("bird_budal", "bird_budal_long", "bird_budal_wide", + "bird_surrey", "bird_surrey_long", "bird_surrey_wide", + "bird_ammarnas", "bird_ammarnas_long", "bird_ammarnas_wide", + "bird_valley", "bird_valley_long", "bird_valley_wide")) \ No newline at end of file diff --git a/model_ammarnas_inla.rds b/model_ammarnas_inla.rds new file mode 100644 index 0000000000000000000000000000000000000000..ef481f5f5d1fe1c287e9ad197a92beb2fbb17c43 Binary files /dev/null and b/model_ammarnas_inla.rds differ diff --git a/model_budal_inla.rds b/model_budal_inla.rds new file mode 100644 index 0000000000000000000000000000000000000000..eac5b930b601dcb579bbd701b3607be42db57c66 Binary files /dev/null and b/model_budal_inla.rds differ diff --git a/model_surrey_inla.rds b/model_surrey_inla.rds new file mode 100644 index 0000000000000000000000000000000000000000..245393b7b591164010dc2583333cb736d2ce422d Binary files /dev/null and b/model_surrey_inla.rds differ diff --git a/model_valley_inla.rds b/model_valley_inla.rds new file mode 100644 index 0000000000000000000000000000000000000000..a7f889ce453f6930749035fa580b3f572b76e364 Binary files /dev/null and b/model_valley_inla.rds differ diff --git a/tables.R b/tables.R new file mode 100644 index 0000000000000000000000000000000000000000..cd7173a7e93a17ce2c22593dfbfd6133158d3223 --- /dev/null +++ b/tables.R @@ -0,0 +1,162 @@ +# Tables #### + +# Required packages +library(tidyverse) +library(HDInterval) +library(modeest) + +# Required functions + +f_G <- function(x){ + x * dnorm(x) / pnorm(x) +} + +f_z <- function(eta, rho2){ + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2))) / + (1 + eta ^ 2 / rho2 + f_G(eta / sqrt(rho2) + sqrt(rho2)) + 2 * eta + rho2) +} + +f_sum <- function(x, p = 0.95){ + x <- x$value + tmp <- c(mean(x), sd(x), median(x), meanshift(x), hdi(x, p), + quantile(x, probs = c((1 - p)/2, 1 - (1 - p) / 2))) + names(tmp)[1:4] <- c("mean", "sd", "median", "mode") + return(as_tibble_row(tmp)) +} + +# Estimating expected total abundance + +# We assume that lambda(x) is approximately normal and use the estimated +# expected number of species to estimate the total abundance: + +f_EN <- function(eta, rho2, ES){ + prop <- pnorm(0, mean = eta, + sd = sqrt(rho2), lower.tail = FALSE) + EN <- integrate(function(x){exp(x) * ES * dnorm(x, + mean = eta, + sd = sqrt(rho2)) / prop}, + lower = 0, upper = 100)$value + return(EN) +} + +model_ammarnas <- read_rds("model_ammarnas_inla.rds") +tmp_am_par <- model_ammarnas$tmp_am_par +tmp_am_par_sum <- model_ammarnas$tmp_am_par_sum + +tmp_am_par <- tmp_am_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + ss2 = se2 * 2 * gamma, + sE2 = sc2 * 2 * gamma_c, + sr2 = sh2 * gamma ^ 2, + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_am_par_sum <- tmp_am_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +model_budal <- read_rds("model_budal_inla.rds") +tmp_bu_par <- model_budal$tmp_bu_par +tmp_bu_par_sum <- model_budal$tmp_bu_par_sum +tmp_bu_par <- tmp_bu_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + ss2 = se2 * 2 * gamma, + sE2 = sc2 * 2 * gamma_c, + sr2 = sh2 * gamma ^ 2, + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_bu_par_sum <- tmp_bu_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +model_surrey <- read_rds("model_surrey_inla.rds") +tmp_su_par <- model_surrey$tmp_su_par +tmp_su_par_sum <- model_surrey$tmp_su_par_sum +tmp_su_par <- tmp_su_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + ss2 = se2 * 2 * gamma, + sE2 = sc2 * 2 * gamma_c, + sr2 = sh2 * gamma ^ 2, + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_su_par_sum <- tmp_su_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +model_valley <- read_rds("model_valley_inla.rds") +tmp_va_par <- model_valley$tmp_va_par +tmp_va_par_sum <- model_valley$tmp_va_par_sum +tmp_va_par <- tmp_va_par %>% + rowwise() %>% + mutate(EN = f_EN(eta, rho2, ES), + ss2 = se2 * 2 * gamma, + sE2 = sc2 * 2 * gamma_c, + sr2 = sh2 * gamma ^ 2, + logEN = log(EN), + lnK = log(EN / ES), + r = lnK * gamma) %>% + ungroup() + +tmp_va_par_sum <- tmp_va_par %>% + select(se2:r) %>% + pivot_longer(se2:r) %>% + group_by(name) %>% + nest() %>% + mutate(stats = map(data, f_sum)) %>% + unnest(stats) %>% + select(-data) %>% + ungroup() + +# Tables in paper: + +res_table <- tibble(Location = c("Ammarnäs", "Budal", "Eastern Wood", "Birdsong Valley")) %>% + bind_cols(bind_rows(pivot_wider(select(tmp_am_par_sum, name, mean), values_from = mean, names_from = name), + pivot_wider(select(tmp_bu_par_sum, name, mean), values_from = mean, names_from = name), + pivot_wider(select(tmp_su_par_sum, name, mean), values_from = mean, names_from = name), + pivot_wider(select(tmp_va_par_sum, name, mean), values_from = mean, names_from = name))) + +xtable::xtable(res_table[, c("Location", "ss2", "gamma", "sE2", "gamma_c", "r", "sr2")], digits = 3) + +res_table <- tibble(Location = c("Ammarnäs", "Budal", "Eastern Wood", "Birdsong Valley")) %>% + bind_cols(bind_rows(pivot_wider(select(tmp_am_par_sum, name, mean), values_from = mean, names_from = name), + pivot_wider(select(tmp_bu_par_sum, name, mean), values_from = mean, names_from = name), + pivot_wider(select(tmp_su_par_sum, name, mean), values_from = mean, names_from = name), + pivot_wider(select(tmp_va_par_sum, name, mean), values_from = mean, names_from = name))) + +xtable::xtable(res_table[, c("Location", "se2", "sh2", "sc2", "eta", "rho2", "z", "p0", "ES", "I")]) + +# Tables for SI: + +xtable::xtable(tmp_am_par_sum) #, digits = 4) # to get the details on ss2 and sr2) +xtable::xtable(tmp_bu_par_sum) +xtable::xtable(tmp_su_par_sum) #, digits = 4) # to get the details on ss2, sE2 and sr2 +xtable::xtable(tmp_va_par_sum) #, digits = 4) # to get the details on ss2, sE2 and sr2