knitr::opts_chunk$set(cache = TRUE, dev = c("png", "pdf"))
library(here)
source(here("src", "model_quadratic_validation_grampians.R"))

SAMPLING FOR MODEL 'continuous' NOW (CHAIN 1).
Chain 1: 
Chain 1: Gradient evaluation took 0.000644 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 6.44 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1: 
Chain 1: 
Chain 1: Iteration:   1 / 1000 [  0%]  (Warmup)
Chain 1: Iteration: 100 / 1000 [ 10%]  (Warmup)
Chain 1: Iteration: 200 / 1000 [ 20%]  (Warmup)
Chain 1: Iteration: 300 / 1000 [ 30%]  (Warmup)
Chain 1: Iteration: 400 / 1000 [ 40%]  (Warmup)
Chain 1: Iteration: 500 / 1000 [ 50%]  (Warmup)
Chain 1: Iteration: 501 / 1000 [ 50%]  (Sampling)
Chain 1: Iteration: 600 / 1000 [ 60%]  (Sampling)
Chain 1: Iteration: 700 / 1000 [ 70%]  (Sampling)
Chain 1: Iteration: 800 / 1000 [ 80%]  (Sampling)
Chain 1: Iteration: 900 / 1000 [ 90%]  (Sampling)
Chain 1: Iteration: 1000 / 1000 [100%]  (Sampling)
Chain 1: 
Chain 1:  Elapsed Time: 24.2374 seconds (Warm-up)
Chain 1:                8.41223 seconds (Sampling)
Chain 1:                32.6496 seconds (Total)
Chain 1: 

SAMPLING FOR MODEL 'continuous' NOW (CHAIN 2).
Chain 2: 
Chain 2: Gradient evaluation took 0.000509 seconds
Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 5.09 seconds.
Chain 2: Adjust your expectations accordingly!
Chain 2: 
Chain 2: 
Chain 2: Iteration:   1 / 1000 [  0%]  (Warmup)
Chain 2: Iteration: 100 / 1000 [ 10%]  (Warmup)
Chain 2: Iteration: 200 / 1000 [ 20%]  (Warmup)
Chain 2: Iteration: 300 / 1000 [ 30%]  (Warmup)
Chain 2: Iteration: 400 / 1000 [ 40%]  (Warmup)
Chain 2: Iteration: 500 / 1000 [ 50%]  (Warmup)
Chain 2: Iteration: 501 / 1000 [ 50%]  (Sampling)
Chain 2: Iteration: 600 / 1000 [ 60%]  (Sampling)
Chain 2: Iteration: 700 / 1000 [ 70%]  (Sampling)
Chain 2: Iteration: 800 / 1000 [ 80%]  (Sampling)
Chain 2: Iteration: 900 / 1000 [ 90%]  (Sampling)
Chain 2: Iteration: 1000 / 1000 [100%]  (Sampling)
Chain 2: 
Chain 2:  Elapsed Time: 21.9177 seconds (Warm-up)
Chain 2:                8.39957 seconds (Sampling)
Chain 2:                30.3172 seconds (Total)
Chain 2: 

SAMPLING FOR MODEL 'continuous' NOW (CHAIN 3).
Chain 3: 
Chain 3: Gradient evaluation took 0.000476 seconds
Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 4.76 seconds.
Chain 3: Adjust your expectations accordingly!
Chain 3: 
Chain 3: 
Chain 3: Iteration:   1 / 1000 [  0%]  (Warmup)
Chain 3: Iteration: 100 / 1000 [ 10%]  (Warmup)
Chain 3: Iteration: 200 / 1000 [ 20%]  (Warmup)
Chain 3: Iteration: 300 / 1000 [ 30%]  (Warmup)
Chain 3: Iteration: 400 / 1000 [ 40%]  (Warmup)
Chain 3: Iteration: 500 / 1000 [ 50%]  (Warmup)
Chain 3: Iteration: 501 / 1000 [ 50%]  (Sampling)
Chain 3: Iteration: 600 / 1000 [ 60%]  (Sampling)
Chain 3: Iteration: 700 / 1000 [ 70%]  (Sampling)
Chain 3: Iteration: 800 / 1000 [ 80%]  (Sampling)
Chain 3: Iteration: 900 / 1000 [ 90%]  (Sampling)
Chain 3: Iteration: 1000 / 1000 [100%]  (Sampling)
Chain 3: 
Chain 3:  Elapsed Time: 24.1555 seconds (Warm-up)
Chain 3:                8.38095 seconds (Sampling)
Chain 3:                32.5365 seconds (Total)
Chain 3: 
library(arm)
library(forcats)
library(ggrepel)
library(tidyr)
gramps_auc <- subset(
  perf, ibra_subregion == "Greater Grampians",
  select = c(taxon, random_effect, AUC)
)

gramps_auc$taxon <- fct_recode(
  gramps_auc$taxon,
  `Eucalyptus goniocalyx` = "Eucalyptus (goniocalyx|nortonii)",
  `Eucalyptus viminalis subsp. viminalis` =
    "Eucalyptus viminalis subsp. (pryoriana|viminalis)"
)

ggplot(spread(gramps_auc, random_effect, AUC)) +
aes(`FALSE`, `TRUE`, label = taxon) +
geom_abline(slope = 1, intercept = 0, color = "grey") +
geom_point() +
geom_text_repel(fontface = "italic", size = 3) +
xlab("AUC (no random effect)") +
ylab("AUC (random effect included)") +
xlim(.4, 1) +
ylim(.4, 1) +
theme_bw()

vars <- c("mlq", "mlq2", "twi", "twi2","r1k", "r1k2", "tn", "tn2")
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(
  grampians_responses[order(grampians_responses$AUC), ]
) +
xlim(-3, 3) +
ylim(-3, 3) +
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, 4) +
theme_bw()

IycgLS0tCiMnIHRpdGxlOiAiSW50ZXJuYWwgdmFsaWRhdGlvbiBvZiB0aGUgcXVhZHJhdGljIGdyYW1waWFucyBtb2RlbCIKIycgYXV0aG9yOiAiV2lsbGlhbSBLLiBNb3JyaXMiCiMnIGRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKIycgb3V0cHV0OgojJyAgIHJtYXJrZG93bjo6aHRtbF9ub3RlYm9vazoKIycgICAgIGNvZGVfZm9sZGluZzogaGlkZQojJyAtLS0KCiMrIHNldHVwLCBtZXNzYWdlPUZBTFNFLCBmaWcua2VlcD0ibm9uZSIsIGZpZy5zaG93PSJoaWRlIgprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGUgPSBUUlVFLCBkZXYgPSBjKCJwbmciLCAicGRmIikpCmxpYnJhcnkoaGVyZSkKc291cmNlKGhlcmUoInNyYyIsICJtb2RlbF9xdWFkcmF0aWNfdmFsaWRhdGlvbl9ncmFtcGlhbnMuUiIpKQpsaWJyYXJ5KGFybSkKbGlicmFyeShmb3JjYXRzKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkodGlkeXIpCgojKyBwbG90LWF1YywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDcuNSwgZmlnLmhlaWdodCA9IDcuNQpncmFtcHNfYXVjIDwtIHN1YnNldCgKICBwZXJmLCBpYnJhX3N1YnJlZ2lvbiA9PSAiR3JlYXRlciBHcmFtcGlhbnMiLAogIHNlbGVjdCA9IGModGF4b24sIHJhbmRvbV9lZmZlY3QsIEFVQykKKQoKZ3JhbXBzX2F1YyR0YXhvbiA8LSBmY3RfcmVjb2RlKAogIGdyYW1wc19hdWMkdGF4b24sCiAgYEV1Y2FseXB0dXMgZ29uaW9jYWx5eGAgPSAiRXVjYWx5cHR1cyAoZ29uaW9jYWx5eHxub3J0b25paSkiLAogIGBFdWNhbHlwdHVzIHZpbWluYWxpcyBzdWJzcC4gdmltaW5hbGlzYCA9CiAgICAiRXVjYWx5cHR1cyB2aW1pbmFsaXMgc3Vic3AuIChwcnlvcmlhbmF8dmltaW5hbGlzKSIKKQoKZ2dwbG90KHNwcmVhZChncmFtcHNfYXVjLCByYW5kb21fZWZmZWN0LCBBVUMpKSArCmFlcyhgRkFMU0VgLCBgVFJVRWAsIGxhYmVsID0gdGF4b24pICsKZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmV5IikgKwpnZW9tX3BvaW50KCkgKwpnZW9tX3RleHRfcmVwZWwoZm9udGZhY2UgPSAiaXRhbGljIiwgc2l6ZSA9IDMpICsKeGxhYigiQVVDIChubyByYW5kb20gZWZmZWN0KSIpICsKeWxhYigiQVVDIChyYW5kb20gZWZmZWN0IGluY2x1ZGVkKSIpICsKeGxpbSguNCwgMSkgKwp5bGltKC40LCAxKSArCnRoZW1lX2J3KCkKCnZhcnMgPC0gYygibWxxIiwgIm1scTIiLCAidHdpIiwgInR3aTIiLCJyMWsiLCAicjFrMiIsICJ0biIsICJ0bjIiKQp0YXhhIDwtIHVuaXF1ZShtZGckdGF4b24pCnRyYWl0cyA8LSBzYXBwbHkoCiAgdGF4YSwKICBmdW5jdGlvbih4KSB1bmxpc3QodW5pcXVlKG1kZ1ttZGckdGF4b24gPT0geCwgYygic2xhIiwgInNtIiwgIm1oIildKSkKKQoKIycgQ2FsY3VsYXRlIHRoZSByZXNwb25zZXMgb2YgZWFjaCBzcGVjaWVzIGluIGVhY2ggcmVnaW9uIHVzaW5nCiMnIHNpbmdsZS1zcGVjaWVzL3NpbmdsZS1yZWdpb24gZ2xtcy4KIysgb2JzcmVzcApvYnNlcnZlZF9yZXNwb25zZXMgPC0gbGFwcGx5KAogIHRheGEsCiAgZnVuY3Rpb24odGF4b25pKSB7CiAgICBkZiA8LSBzdWJzZXQobWRnLCB0YXhvbiA9PSB0YXhvbmkpCiAgICBtb2RlbCA8LSBiYXllc2dsbSgKICAgICAgZm9ybXVsYShzcHJpbnRmKCJ5IH4gJXMiLCBwYXN0ZSh2YXJzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLAogICAgICBiaW5vbWlhbCwgZGYsIHByaW9yLnNjYWxlID0gMSwgcHJpb3IuZGYgPSBJbmYKICAgICkKICAgIGRhdGEuZnJhbWUoCiAgICAgIFRheG9uID0gdGF4b25pLCBSZWdpb24gPSAiR3JlYXRlciBHcmFtcGlhbnMiLCBWYXIgPSB2YXJzLAogICAgICBzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHNbdmFycywgMToyXQogICAgKQogIH0KKQoKb2JzZXJ2ZWRfcmVzcG9uc2VzIDwtIGRvLmNhbGwocmJpbmQsIG9ic2VydmVkX3Jlc3BvbnNlcykKCiMnIENhbGN1bGF0ZSB0aGUgcHJlZGljdGVkIHJlc3BvbnNlcyBvZiBlYWNoIHNwZWNpZXMgaW4gZWFjaCByZWdpb24gYmFzZWQgb24gdGhlCiMnIEdyYW1waWFucyBtb2RlbCBhbmQgdGhlaXIgdHJhaXQgdmFsdWVzLgojKyBwcmVkcmVzcApuc2ltcyA8LSAxMDAwCnNpbXMgPC0gZml4ZWYoc2ltKG1vZGVsX2dyYW1waWFucywgbnNpbXMpKQoKcHJlZGljdGVkX3Jlc3BvbnNlcyA8LSBmdW5jdGlvbih0YXhvbikgewogIGFucyA8LSB2YXBwbHkoCiAgICB2YXJzLCBmdW5jdGlvbih4KSB7CiAgICAgIHJvd1N1bXMoCiAgICAgICAgc3dlZXAoc2ltc1ssIGdyZXAoeCwgY29sbmFtZXMoc2ltcykpXSwgMiwgYygxLCB0cmFpdHNbLCB0YXhvbl0pLCAiKiIpCiAgICAgICkKICAgIH0sCiAgICBudW1lcmljKG5zaW1zKQogICkKICB0KAogICAgYXBwbHkoCiAgICAgIGFucywgMiwgZnVuY3Rpb24oeCkgYyhQcmVkaWN0aW9uID0gbWVhbih4KSwgIlByZWRpY3RlZC4uRXJyb3IiID0gc2QoeCkpCiAgICApCiAgKQp9CgpwcmVkaWN0ZWRfcmVzcG9uc2VzIDwtIGRvLmNhbGwoCiAgcmJpbmQsIHNhcHBseSh0YXhhLCBwcmVkaWN0ZWRfcmVzcG9uc2VzLCBzaW1wbGlmeSA9IEZBTFNFKQopCgojJyBQbG90IG9mIHRoZSBvYnNlcnZlZCB2cy4gcHJlZGljdGVkIHJlc3BvbnNlcyBmb3IgZWFjaCBjb3ZhcmlhdGUgY29sb3ItY29kZWQKIycgYnkgcmVnaW9uLgojKyBwbG90cmVzcG9uc2UsIGZpZy53aWR0aD0zLjUsIGZpZy5oZWlnaHQ9OApyZXNwb25zZXMgPC0gY2JpbmQob2JzZXJ2ZWRfcmVzcG9uc2VzLCBwcmVkaWN0ZWRfcmVzcG9uc2VzKQoKZ3JhbXBpYW5zX3Jlc3BvbnNlcyA8LSBtZXJnZSgKICByZXNwb25zZXMsCiAgc3Vic2V0KHBlcmYsICFyYW5kb21fZWZmZWN0ICYgaWJyYV9zdWJyZWdpb24gPT0gIkdyZWF0ZXIgR3JhbXBpYW5zIiksCiAgYnkueCA9IGMoIlRheG9uIiwgIlJlZ2lvbiIpLCBieS55ID0gYygidGF4b24iLCAiaWJyYV9zdWJyZWdpb24iKQopCgpnZ3Bsb3QoCiAgZ3JhbXBpYW5zX3Jlc3BvbnNlc1tvcmRlcihncmFtcGlhbnNfcmVzcG9uc2VzJEFVQyksIF0KKSArCnhsaW0oLTMsIDMpICsKeWxpbSgtMywgMykgKwpnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCmdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCmFlcyhFc3RpbWF0ZSwgUHJlZGljdGlvbikgKwpnZW9tX3BvaW50KGFlcyhjb2xvciA9IEFVQyksIHNpemUgPSAyKSArCnNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAiYmxhY2siKSArCmZhY2V0X3dyYXAofiBWYXIsIDQpICsKdGhlbWVfYncoKQo=