knitr::opts_chunk$set(cache = TRUE, dev = c("png", "pdf"))
library(here)
source(here("src", "model_linear_validation_grampians.R"))
Warning: Column `taxon` joining factor and character vector, coercing into
character vector
Warning: Column `ibra_subregion` joining factor and character vector, coercing
into character vector
Warning: Removed 60 rows containing missing values (geom_point).
Warning: Removed 3 rows containing missing values (geom_point).
Warning: Removed 60 rows containing missing values (geom_point).
Warning: Removed 3 rows containing missing values (geom_point).
Warning: Removed 30 rows containing missing values (geom_point).
Warning: Removed 3 rows containing missing values (geom_point).
Warning: Removed 30 rows containing missing values (geom_point).
Warning: Removed 3 rows containing missing values (geom_point).
Warning: Column `taxon` joining factor and character vector, coercing into
character vector
Warning: Column `ibra_subregion` joining factor and character vector, coercing
into character vector
library(arm)
library(forcats)
library(ggrepel)
library(tidyr)
gramps_auc <- subset(
perf, ibra_subregion == "Greater Grampians",
select = c(taxon, random_effect, AUC, `AUC-PR`)
)
gramps_auc <- inner_join(
mutate(gramps_auc, ibra_subregion = "Greater Grampians"),
taxon_region_prevalence
)
gramps_auc <- mutate(gramps_auc, `AUPRC / prevalence` = `AUC-PR` / prevalence)
gramps_auc <- dplyr::select(gramps_auc, -`AUC-PR`)
gramps_auc <- rename(gramps_auc, AUROC = AUC)
gramps_auc$taxon <- fct_recode(
gramps_auc$taxon,
`Eucalyptus goniocalyx` = "Eucalyptus (goniocalyx|nortonii)",
`Eucalyptus viminalis subsp. viminalis` =
"Eucalyptus viminalis subsp. (pryoriana|viminalis)"
)
gramps_auc$taxon <- gsub("Eucalyptus ", "", gramps_auc$taxon)
gramps_auc <- pivot_longer(
gramps_auc, cols = starts_with("AU"), names_to = "type", values_to = "value"
)
gramps_auc <- pivot_wider(
gramps_auc, names_from = random_effect, values_from = value
)
groc <-
ggplot(filter(gramps_auc, type == "AUROC")) +
aes(`FALSE`, `TRUE`, label = taxon) +
geom_abline(slope = 1, intercept = 0, color = "grey") +
geom_point() +
geom_text_repel(fontface = "italic", size = 2) +
xlab("AUROC (no random effect)") +
ylab("AUROC (random effect included)") +
xlim(.4, 1) +
ylim(.4, 1) +
theme_bw()
gprc <-
ggplot(filter(gramps_auc, type != "AUROC")) +
aes(`FALSE`, `TRUE`, label = taxon) +
scale_y_continuous(trans = "log2") + scale_x_continuous(trans = "log2") +
geom_abline(slope = 1, intercept = 0, color = "grey") +
geom_point() +
geom_text_repel(fontface = "italic", size = 2) +
xlab("AUPRC / Prevalence (no random effect)") +
ylab("AUPRC / Prevalence (random effect included)") +
theme_bw()
grid.arrange(groc, gprc, nrow = 1, widths = c(.5, .5))

vars <- c("mlq", "twi", "r1k", "tn")
taxa <- unique(mdg$taxon)
traits <- sapply(
taxa,
function(x) unlist(unique(mdg[mdg$taxon == x, c("sla", "sm", "mh")]))
)
Calculate the responses of each species in each region using single-species/single-region glms.
observed_responses <- lapply(
taxa,
function(taxoni) {
df <- subset(mdg, taxon == taxoni)
model <- bayesglm(
formula(sprintf("y ~ %s", paste(vars, collapse = " + "))),
binomial, df, prior.scale = 1, prior.df = Inf
)
data.frame(
Taxon = taxoni, Region = "Greater Grampians", Var = vars,
summary(model)$coefficients[vars, 1:2]
)
}
)
observed_responses <- do.call(rbind, observed_responses)
Calculate the predicted responses of each species in each region based on the Grampians model and their trait values.
nsims <- 1000
sims <- fixef(sim(model_grampians, nsims))
predicted_responses <- function(taxon) {
ans <- vapply(
vars, function(x) {
rowSums(
sweep(sims[, grep(x, colnames(sims))], 2, c(1, traits[, taxon]), "*")
)
},
numeric(nsims)
)
t(
apply(
ans, 2, function(x) c(Prediction = mean(x), "Predicted..Error" = sd(x))
)
)
}
predicted_responses <- do.call(
rbind, sapply(taxa, predicted_responses, simplify = FALSE)
)
Plot of the observed vs. predicted responses for each covariate color-coded by region.
responses <- cbind(observed_responses, predicted_responses)
grampians_responses <- merge(
responses,
subset(perf, !random_effect & ibra_subregion == "Greater Grampians"),
by.x = c("Taxon", "Region"), by.y = c("taxon", "ibra_subregion")
)
ggplot(
subset(
grampians_responses[order(grampians_responses$AUC),],
Var %in% c("mlq", "twi")
)
) +
xlim(-3, 3) +
ylim(-1, 2) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
geom_abline(slope = 1, intercept = 0, lty = 2) +
aes(Estimate, Prediction) +
geom_point(aes(color = AUC), size = 2) +
scale_color_gradient(low = "white", high = "black") +
facet_wrap(
~ Var,
labeller = labeller(
Var = as_labeller(
c(
mlq = "Mean Moisture\nIndex Lowest\nQuarter",
twi = "Topographic\nWetness Index"
)
)
)
) +
theme_bw()

IycgLS0tCiMnIHRpdGxlOiAiSW50ZXJuYWwgdmFsaWRhdGlvbiBvZiB0aGUgbGluZWFyIGdyYW1waWFucyBtb2RlbCIKIycgYXV0aG9yOiAiV2lsbGlhbSBLLiBNb3JyaXMiCiMnIGRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKIycgb3V0cHV0OgojJyAgIHJtYXJrZG93bjo6aHRtbF9ub3RlYm9vazoKIycgICAgIGNvZGVfZm9sZGluZzogaGlkZQojJyAtLS0KCiMrIHNldHVwLCBtZXNzYWdlPUZBTFNFLCBmaWcua2VlcD0ibm9uZSIsIGZpZy5zaG93PSJoaWRlIgprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGUgPSBUUlVFLCBkZXYgPSBjKCJwbmciLCAicGRmIikpCmxpYnJhcnkoaGVyZSkKc291cmNlKGhlcmUoInNyYyIsICJtb2RlbF9saW5lYXJfdmFsaWRhdGlvbl9ncmFtcGlhbnMuUiIpKQpsaWJyYXJ5KGFybSkKbGlicmFyeShmb3JjYXRzKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkodGlkeXIpCgojKyBwbG90LWF1YywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDcuNSwgZmlnLmhlaWdodCA9IDMuNQpncmFtcHNfYXVjIDwtIHN1YnNldCgKICBwZXJmLCBpYnJhX3N1YnJlZ2lvbiA9PSAiR3JlYXRlciBHcmFtcGlhbnMiLAogIHNlbGVjdCA9IGModGF4b24sIHJhbmRvbV9lZmZlY3QsIEFVQywgYEFVQy1QUmApCikKCmdyYW1wc19hdWMgPC0gaW5uZXJfam9pbigKICBtdXRhdGUoZ3JhbXBzX2F1YywgaWJyYV9zdWJyZWdpb24gPSAiR3JlYXRlciBHcmFtcGlhbnMiKSwKICB0YXhvbl9yZWdpb25fcHJldmFsZW5jZQopCgpncmFtcHNfYXVjIDwtIG11dGF0ZShncmFtcHNfYXVjLCBgQVVQUkMgLyBwcmV2YWxlbmNlYCA9IGBBVUMtUFJgIC8gcHJldmFsZW5jZSkKCmdyYW1wc19hdWMgPC0gZHBseXI6OnNlbGVjdChncmFtcHNfYXVjLCAtYEFVQy1QUmApCgpncmFtcHNfYXVjIDwtIHJlbmFtZShncmFtcHNfYXVjLCBBVVJPQyA9IEFVQykKCmdyYW1wc19hdWMkdGF4b24gPC0gZmN0X3JlY29kZSgKICBncmFtcHNfYXVjJHRheG9uLAogIGBFdWNhbHlwdHVzIGdvbmlvY2FseXhgID0gIkV1Y2FseXB0dXMgKGdvbmlvY2FseXh8bm9ydG9uaWkpIiwKICBgRXVjYWx5cHR1cyB2aW1pbmFsaXMgc3Vic3AuIHZpbWluYWxpc2AgPQogICAgIkV1Y2FseXB0dXMgdmltaW5hbGlzIHN1YnNwLiAocHJ5b3JpYW5hfHZpbWluYWxpcykiCikKCmdyYW1wc19hdWMkdGF4b24gPC0gZ3N1YigiRXVjYWx5cHR1cyAiLCAgIiIsIGdyYW1wc19hdWMkdGF4b24pCgpncmFtcHNfYXVjIDwtIHBpdm90X2xvbmdlcigKICBncmFtcHNfYXVjLCBjb2xzID0gc3RhcnRzX3dpdGgoIkFVIiksIG5hbWVzX3RvID0gInR5cGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiCikKCmdyYW1wc19hdWMgPC0gcGl2b3Rfd2lkZXIoCiAgZ3JhbXBzX2F1YywgbmFtZXNfZnJvbSA9IHJhbmRvbV9lZmZlY3QsIHZhbHVlc19mcm9tID0gdmFsdWUKKQoKZ3JvYyA8LQogIGdncGxvdChmaWx0ZXIoZ3JhbXBzX2F1YywgdHlwZSA9PSAiQVVST0MiKSkgKwogIGFlcyhgRkFMU0VgLCBgVFJVRWAsIGxhYmVsID0gdGF4b24pICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyZXkiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3RleHRfcmVwZWwoZm9udGZhY2UgPSAiaXRhbGljIiwgc2l6ZSA9IDIpICsKICB4bGFiKCJBVVJPQyAobm8gcmFuZG9tIGVmZmVjdCkiKSArCiAgeWxhYigiQVVST0MgKHJhbmRvbSBlZmZlY3QgaW5jbHVkZWQpIikgKwogIHhsaW0oLjQsIDEpICsKICB5bGltKC40LCAxKSArCiAgdGhlbWVfYncoKQoKZ3ByYyA8LQogIGdncGxvdChmaWx0ZXIoZ3JhbXBzX2F1YywgdHlwZSAhPSAiQVVST0MiKSkgKwogIGFlcyhgRkFMU0VgLCBgVFJVRWAsIGxhYmVsID0gdGF4b24pICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMiIpICsgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzIiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmV5IikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGZvbnRmYWNlID0gIml0YWxpYyIsIHNpemUgPSAyKSArCiAgeGxhYigiQVVQUkMgLyBQcmV2YWxlbmNlIChubyByYW5kb20gZWZmZWN0KSIpICsKICB5bGFiKCJBVVBSQyAvIFByZXZhbGVuY2UgKHJhbmRvbSBlZmZlY3QgaW5jbHVkZWQpIikgKwogIHRoZW1lX2J3KCkKCmdyaWQuYXJyYW5nZShncm9jLCBncHJjLCBucm93ID0gMSwgd2lkdGhzID0gYyguNSwgLjUpKQoKdmFycyA8LSBjKCJtbHEiLCAidHdpIiwgInIxayIsICJ0biIpCnRheGEgPC0gdW5pcXVlKG1kZyR0YXhvbikKdHJhaXRzIDwtIHNhcHBseSgKICB0YXhhLAogIGZ1bmN0aW9uKHgpIHVubGlzdCh1bmlxdWUobWRnW21kZyR0YXhvbiA9PSB4LCBjKCJzbGEiLCAic20iLCAibWgiKV0pKQopCgojJyBDYWxjdWxhdGUgdGhlIHJlc3BvbnNlcyBvZiBlYWNoIHNwZWNpZXMgaW4gZWFjaCByZWdpb24gdXNpbmcKIycgc2luZ2xlLXNwZWNpZXMvc2luZ2xlLXJlZ2lvbiBnbG1zLgojKyBvYnNyZXNwCm9ic2VydmVkX3Jlc3BvbnNlcyA8LSBsYXBwbHkoCiAgdGF4YSwKICBmdW5jdGlvbih0YXhvbmkpIHsKICAgIGRmIDwtIHN1YnNldChtZGcsIHRheG9uID09IHRheG9uaSkKICAgIG1vZGVsIDwtIGJheWVzZ2xtKAogICAgICBmb3JtdWxhKHNwcmludGYoInkgfiAlcyIsIHBhc3RlKHZhcnMsIGNvbGxhcHNlID0gIiArICIpKSksCiAgICAgIGJpbm9taWFsLCBkZiwgcHJpb3Iuc2NhbGUgPSAxLCBwcmlvci5kZiA9IEluZgogICAgKQogICAgZGF0YS5mcmFtZSgKICAgICAgVGF4b24gPSB0YXhvbmksIFJlZ2lvbiA9ICJHcmVhdGVyIEdyYW1waWFucyIsIFZhciA9IHZhcnMsCiAgICAgIHN1bW1hcnkobW9kZWwpJGNvZWZmaWNpZW50c1t2YXJzLCAxOjJdCiAgICApCiAgfQopCgpvYnNlcnZlZF9yZXNwb25zZXMgPC0gZG8uY2FsbChyYmluZCwgb2JzZXJ2ZWRfcmVzcG9uc2VzKQoKIycgQ2FsY3VsYXRlIHRoZSBwcmVkaWN0ZWQgcmVzcG9uc2VzIG9mIGVhY2ggc3BlY2llcyBpbiBlYWNoIHJlZ2lvbiBiYXNlZCBvbiB0aGUKIycgR3JhbXBpYW5zIG1vZGVsIGFuZCB0aGVpciB0cmFpdCB2YWx1ZXMuCiMrIHByZWRyZXNwCm5zaW1zIDwtIDEwMDAKc2ltcyA8LSBmaXhlZihzaW0obW9kZWxfZ3JhbXBpYW5zLCBuc2ltcykpCgpwcmVkaWN0ZWRfcmVzcG9uc2VzIDwtIGZ1bmN0aW9uKHRheG9uKSB7CiAgYW5zIDwtIHZhcHBseSgKICAgIHZhcnMsIGZ1bmN0aW9uKHgpIHsKICAgICAgcm93U3VtcygKICAgICAgICBzd2VlcChzaW1zWywgZ3JlcCh4LCBjb2xuYW1lcyhzaW1zKSldLCAyLCBjKDEsIHRyYWl0c1ssIHRheG9uXSksICIqIikKICAgICAgKQogICAgfSwKICAgIG51bWVyaWMobnNpbXMpCiAgKQogIHQoCiAgICBhcHBseSgKICAgICAgYW5zLCAyLCBmdW5jdGlvbih4KSBjKFByZWRpY3Rpb24gPSBtZWFuKHgpLCAiUHJlZGljdGVkLi5FcnJvciIgPSBzZCh4KSkKICAgICkKICApCn0KCnByZWRpY3RlZF9yZXNwb25zZXMgPC0gZG8uY2FsbCgKICByYmluZCwgc2FwcGx5KHRheGEsIHByZWRpY3RlZF9yZXNwb25zZXMsIHNpbXBsaWZ5ID0gRkFMU0UpCikKCiMnIFBsb3Qgb2YgdGhlIG9ic2VydmVkIHZzLiBwcmVkaWN0ZWQgcmVzcG9uc2VzIGZvciBlYWNoIGNvdmFyaWF0ZSBjb2xvci1jb2RlZAojJyBieSByZWdpb24uCiMrIHBsb3RyZXNwb25zZSwgZmlnLndpZHRoPTMuNSwgZmlnLmhlaWdodD0yLjIKcmVzcG9uc2VzIDwtIGNiaW5kKG9ic2VydmVkX3Jlc3BvbnNlcywgcHJlZGljdGVkX3Jlc3BvbnNlcykKCmdyYW1waWFuc19yZXNwb25zZXMgPC0gbWVyZ2UoCiAgcmVzcG9uc2VzLAogIHN1YnNldChwZXJmLCAhcmFuZG9tX2VmZmVjdCAmIGlicmFfc3VicmVnaW9uID09ICJHcmVhdGVyIEdyYW1waWFucyIpLAogIGJ5LnggPSBjKCJUYXhvbiIsICJSZWdpb24iKSwgYnkueSA9IGMoInRheG9uIiwgImlicmFfc3VicmVnaW9uIikKKQoKZ2dwbG90KAogIHN1YnNldCgKICAgIGdyYW1waWFuc19yZXNwb25zZXNbb3JkZXIoZ3JhbXBpYW5zX3Jlc3BvbnNlcyRBVUMpLF0sCiAgICBWYXIgJWluJSBjKCJtbHEiLCAidHdpIikKICApCikgKwp4bGltKC0zLCAzKSArCnlsaW0oLTEsIDIpICsKZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwpnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCmdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwphZXMoRXN0aW1hdGUsIFByZWRpY3Rpb24pICsKZ2VvbV9wb2ludChhZXMoY29sb3IgPSBBVUMpLCBzaXplID0gMikgKwpzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gImJsYWNrIikgKwpmYWNldF93cmFwKAogIH4gVmFyLAogICAgbGFiZWxsZXIgPSBsYWJlbGxlcigKICAgICAgVmFyID0gYXNfbGFiZWxsZXIoCiAgICAgICAgYygKICAgICAgICAgIG1scSAgPSAiTWVhbiBNb2lzdHVyZVxuSW5kZXggTG93ZXN0XG5RdWFydGVyIiwKICAgICAgICAgIHR3aSAgPSAiVG9wb2dyYXBoaWNcbldldG5lc3MgSW5kZXgiCiAgICAgICAgKQogICAgICApCiAgICApCikgKwp0aGVtZV9idygpCg==