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

vars <- c("mlq", "twi", "r1k", "tn")
taxa <- unique(mds$taxon)
taxa_x_region <- unique(mds[, c("taxon", "ibra_subregion")])
traits <- sapply(
  taxa,
  function(x) unlist(unique(mds[mds$taxon == x, c("sla", "sm", "mh")]))
)

Calculate the responses of each species in each region using single-species/single-region glms.

observed_responses <- mapply(
  function(taxoni, region) {
    df <- subset(mds, taxon == taxoni & ibra_subregion == region)
    model <- bayesglm(
      formula(sprintf("y ~ %s", paste(vars, collapse = " + "))),
      binomial, df, prior.scale = 1, prior.df = Inf
    )
    data.frame(
      Taxon = taxoni, Region = region, Var = vars,
      summary(model)$coefficients[vars, 1:2]
    )
  },
  taxa_x_region[, 1], taxa_x_region[, 2],
  SIMPLIFY = FALSE
)

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)[taxa_x_region[, 1]]
)

Plot of the observed vs. predicted responses for each covariate color-coded by region.

responses <- cbind(observed_responses, predicted_responses)

ggplot(responses) +
aes(Prediction, Estimate, color = Region) +
xlim(-7, 7) +
ylim(-7, 7) +
geom_errorbar(
  aes(
    ymin = Estimate - Std..Error * 1.96,
    ymax = Estimate + Std..Error * 1.96
  ),
  alpha = .1
) +
geom_errorbarh(
  aes(
    xmin = Prediction - Predicted..Error * 1.96,
    xmax = Prediction + Predicted..Error * 1.96
  ),
  alpha = .1
) +
geom_point(alpha = .5) +
facet_wrap(vars(Var))

Calculate the correlation between predicted vs observed response coefficients for each covariate among all taxa within a region.

correlations <- lapply(
  vars,
  function(var) {
    ans <- sapply(
      rgn_names,
      function(region) {
        ss <- subset(responses, Region == region & Var == var)
        cor(ss$Estimate, ss$Prediction)
      }
    )
    data.frame(
      var = var, region = names(ans), cor = ans, stringsAsFactors = FALSE,
      row.names = NULL
    )
  }
)

correlations <- do.call(rbind, correlations)

correlations <- data.frame(
  correlations,
  KLD = kldists[correlations$region],
  GD = dists[correlations$region],
  stringsAsFactors = FALSE
)

correlations <- merge(correlations, kldists_univariate)

Plot the correlations vs. the KL distance of the regions environment from the Grampians.

ggplot(correlations) +
aes(KLD, cor) +
geom_point() +
geom_smooth(method = "lm") +
xlim(0, 35) +
ylim(-1, 1) +
facet_wrap("var")

Plot the correlations vs. the univariate KL distance of the regions environment from the Grampians.

ggplot(correlations) +
aes(kldist_var, cor) +
geom_point() +
geom_smooth(method = "lm") +
ylim(-1, 1) +
facet_wrap("var", scales = "free_x")

Plot the correlations vs. the geographic (centroid) distance of the region to the Grampians.

ggplot(correlations) +
aes(GD, cor) +
geom_point() +
geom_smooth(method = "lm") +
xlim(0, 1000) +
ylim(-1, 1) +
facet_wrap("var")

IycgLS0tCiMnIHRpdGxlOiAiVmFsaWRhdGluZyB0aGUgc3BlY2llcyByZXNwb25zZXMgZm9yIGdyYW1waWFucyB0cmFpdC1lbnZpcm9ubWVudAojJyAgIG1vZGVsIHdpdGggbGluZWFyIHJlbGF0aW9uc2hpcHMgYW5kIGxvY2F0aW9uIHJhbmRvbSBlZmZlY3QiCiMnIGF1dGhvcjogIldpbGxpYW0gSy4gTW9ycmlzIgojJyBkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCiMnIG91dHB1dDoKIycgICBybWFya2Rvd246Omh0bWxfbm90ZWJvb2s6CiMnICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKIycgLS0tCgojKyBzZXR1cCwgbWVzc2FnZT1GQUxTRSwgZmlnLmtlZXA9Im5vbmUiLCBmaWcuc2hvdz0iaGlkZSIKa25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gVFJVRSwgZGV2ID0gYygicG5nIiwgInBkZiIpKQpsaWJyYXJ5KGhlcmUpCnNvdXJjZShoZXJlKCJzcmMiLCAiZW52aXJvbm1lbnRhbF9kaXN0YW5jZV9tZXRyaWNzLlIiKSkKc291cmNlKGhlcmUoInNyYyIsICJtb2RlbF9saW5lYXJfbG9jYWxpdHlfdmFsaWRhdGlvbl9ncmFtcGlhbnMuUiIpKQpsaWJyYXJ5KGFybSkKbGlicmFyeShnZ3Bsb3QyKQoKdmFycyA8LSBjKCJtbHEiLCAidHdpIiwgInIxayIsICJ0biIpCnRheGEgPC0gdW5pcXVlKG1kcyR0YXhvbikKdGF4YV94X3JlZ2lvbiA8LSB1bmlxdWUobWRzWywgYygidGF4b24iLCAiaWJyYV9zdWJyZWdpb24iKV0pCnRyYWl0cyA8LSBzYXBwbHkoCiAgdGF4YSwKICBmdW5jdGlvbih4KSB1bmxpc3QodW5pcXVlKG1kc1ttZHMkdGF4b24gPT0geCwgYygic2xhIiwgInNtIiwgIm1oIildKSkKKQoKIycgQ2FsY3VsYXRlIHRoZSByZXNwb25zZXMgb2YgZWFjaCBzcGVjaWVzIGluIGVhY2ggcmVnaW9uIHVzaW5nCiMnIHNpbmdsZS1zcGVjaWVzL3NpbmdsZS1yZWdpb24gZ2xtcy4KIysgb2JzcmVzcApvYnNlcnZlZF9yZXNwb25zZXMgPC0gbWFwcGx5KAogIGZ1bmN0aW9uKHRheG9uaSwgcmVnaW9uKSB7CiAgICBkZiA8LSBzdWJzZXQobWRzLCB0YXhvbiA9PSB0YXhvbmkgJiBpYnJhX3N1YnJlZ2lvbiA9PSByZWdpb24pCiAgICBtb2RlbCA8LSBiYXllc2dsbSgKICAgICAgZm9ybXVsYShzcHJpbnRmKCJ5IH4gJXMiLCBwYXN0ZSh2YXJzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLAogICAgICBiaW5vbWlhbCwgZGYsIHByaW9yLnNjYWxlID0gMSwgcHJpb3IuZGYgPSBJbmYKICAgICkKICAgIGRhdGEuZnJhbWUoCiAgICAgIFRheG9uID0gdGF4b25pLCBSZWdpb24gPSByZWdpb24sIFZhciA9IHZhcnMsCiAgICAgIHN1bW1hcnkobW9kZWwpJGNvZWZmaWNpZW50c1t2YXJzLCAxOjJdCiAgICApCiAgfSwKICB0YXhhX3hfcmVnaW9uWywgMV0sIHRheGFfeF9yZWdpb25bLCAyXSwKICBTSU1QTElGWSA9IEZBTFNFCikKCm9ic2VydmVkX3Jlc3BvbnNlcyA8LSBkby5jYWxsKHJiaW5kLCBvYnNlcnZlZF9yZXNwb25zZXMpCgojJyBDYWxjdWxhdGUgdGhlIHByZWRpY3RlZCByZXNwb25zZXMgb2YgZWFjaCBzcGVjaWVzIGluIGVhY2ggcmVnaW9uIGJhc2VkIG9uIHRoZQojJyBHcmFtcGlhbnMgbW9kZWwgYW5kIHRoZWlyIHRyYWl0IHZhbHVlcy4KIysgcHJlZHJlc3AKbnNpbXMgPC0gMTAwMApzaW1zIDwtIGZpeGVmKHNpbShtb2RlbF9ncmFtcGlhbnMsIG5zaW1zKSkKCnByZWRpY3RlZF9yZXNwb25zZXMgPC0gZnVuY3Rpb24odGF4b24pIHsKICBhbnMgPC0gdmFwcGx5KAogICAgdmFycywgZnVuY3Rpb24oeCkgewogICAgICByb3dTdW1zKAogICAgICAgIHN3ZWVwKHNpbXNbLCBncmVwKHgsIGNvbG5hbWVzKHNpbXMpKV0sIDIsIGMoMSwgdHJhaXRzWywgdGF4b25dKSwgIioiKQogICAgICApCiAgICB9LAogICAgbnVtZXJpYyhuc2ltcykKICApCiAgdCgKICAgIGFwcGx5KAogICAgICBhbnMsIDIsIGZ1bmN0aW9uKHgpIGMoUHJlZGljdGlvbiA9IG1lYW4oeCksICJQcmVkaWN0ZWQuLkVycm9yIiA9IHNkKHgpKQogICAgKQogICkKfQoKcHJlZGljdGVkX3Jlc3BvbnNlcyA8LSBkby5jYWxsKAogIHJiaW5kLCBzYXBwbHkodGF4YSwgcHJlZGljdGVkX3Jlc3BvbnNlcywgc2ltcGxpZnkgPSBGQUxTRSlbdGF4YV94X3JlZ2lvblssIDFdXQopCgojJyBQbG90IG9mIHRoZSBvYnNlcnZlZCB2cy4gcHJlZGljdGVkIHJlc3BvbnNlcyBmb3IgZWFjaCBjb3ZhcmlhdGUgY29sb3ItY29kZWQKIycgYnkgcmVnaW9uLgojKyBwbG90cmVzcG9uc2UsIGZpZy53aWR0aD0xMApyZXNwb25zZXMgPC0gY2JpbmQob2JzZXJ2ZWRfcmVzcG9uc2VzLCBwcmVkaWN0ZWRfcmVzcG9uc2VzKQoKZ2dwbG90KHJlc3BvbnNlcykgKwphZXMoUHJlZGljdGlvbiwgRXN0aW1hdGUsIGNvbG9yID0gUmVnaW9uKSArCnhsaW0oLTcsIDcpICsKeWxpbSgtNywgNykgKwpnZW9tX2Vycm9yYmFyKAogIGFlcygKICAgIHltaW4gPSBFc3RpbWF0ZSAtIFN0ZC4uRXJyb3IgKiAxLjk2LAogICAgeW1heCA9IEVzdGltYXRlICsgU3RkLi5FcnJvciAqIDEuOTYKICApLAogIGFscGhhID0gLjEKKSArCmdlb21fZXJyb3JiYXJoKAogIGFlcygKICAgIHhtaW4gPSBQcmVkaWN0aW9uIC0gUHJlZGljdGVkLi5FcnJvciAqIDEuOTYsCiAgICB4bWF4ID0gUHJlZGljdGlvbiArIFByZWRpY3RlZC4uRXJyb3IgKiAxLjk2CiAgKSwKICBhbHBoYSA9IC4xCikgKwpnZW9tX3BvaW50KGFscGhhID0gLjUpICsKZmFjZXRfd3JhcCh2YXJzKFZhcikpCgojJyBDYWxjdWxhdGUgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gcHJlZGljdGVkIHZzIG9ic2VydmVkIHJlc3BvbnNlIGNvZWZmaWNpZW50cwojJyBmb3IgZWFjaCBjb3ZhcmlhdGUgYW1vbmcgYWxsIHRheGEgd2l0aGluIGEgcmVnaW9uLgojKyBjYWxjY29yCmNvcnJlbGF0aW9ucyA8LSBsYXBwbHkoCiAgdmFycywKICBmdW5jdGlvbih2YXIpIHsKICAgIGFucyA8LSBzYXBwbHkoCiAgICAgIHJnbl9uYW1lcywKICAgICAgZnVuY3Rpb24ocmVnaW9uKSB7CiAgICAgICAgc3MgPC0gc3Vic2V0KHJlc3BvbnNlcywgUmVnaW9uID09IHJlZ2lvbiAmIFZhciA9PSB2YXIpCiAgICAgICAgY29yKHNzJEVzdGltYXRlLCBzcyRQcmVkaWN0aW9uKQogICAgICB9CiAgICApCiAgICBkYXRhLmZyYW1lKAogICAgICB2YXIgPSB2YXIsIHJlZ2lvbiA9IG5hbWVzKGFucyksIGNvciA9IGFucywgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLAogICAgICByb3cubmFtZXMgPSBOVUxMCiAgICApCiAgfQopCgpjb3JyZWxhdGlvbnMgPC0gZG8uY2FsbChyYmluZCwgY29ycmVsYXRpb25zKQoKY29ycmVsYXRpb25zIDwtIGRhdGEuZnJhbWUoCiAgY29ycmVsYXRpb25zLAogIEtMRCA9IGtsZGlzdHNbY29ycmVsYXRpb25zJHJlZ2lvbl0sCiAgR0QgPSBkaXN0c1tjb3JyZWxhdGlvbnMkcmVnaW9uXSwKICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UKKQoKY29ycmVsYXRpb25zIDwtIG1lcmdlKGNvcnJlbGF0aW9ucywga2xkaXN0c191bml2YXJpYXRlKQoKIycgUGxvdCB0aGUgY29ycmVsYXRpb25zIHZzLiB0aGUgS0wgZGlzdGFuY2Ugb2YgdGhlIHJlZ2lvbnMgZW52aXJvbm1lbnQgZnJvbSB0aGUKIycgR3JhbXBpYW5zLgojKyBwbG90Y29yczEsIGZpZy53aWR0aD0xMQpnZ3Bsb3QoY29ycmVsYXRpb25zKSArCmFlcyhLTEQsIGNvcikgKwpnZW9tX3BvaW50KCkgKwpnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCnhsaW0oMCwgMzUpICsKeWxpbSgtMSwgMSkgKwpmYWNldF93cmFwKCJ2YXIiKQoKIycgUGxvdCB0aGUgY29ycmVsYXRpb25zIHZzLiB0aGUgdW5pdmFyaWF0ZSBLTCBkaXN0YW5jZSBvZiB0aGUgcmVnaW9ucwojJyBlbnZpcm9ubWVudCBmcm9tIHRoZSBHcmFtcGlhbnMuCiMrIHBsb3Rjb3JzMiwgZmlnLndpZHRoPTExCmdncGxvdChjb3JyZWxhdGlvbnMpICsKYWVzKGtsZGlzdF92YXIsIGNvcikgKwpnZW9tX3BvaW50KCkgKwpnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCnlsaW0oLTEsIDEpICsKZmFjZXRfd3JhcCgidmFyIiwgc2NhbGVzID0gImZyZWVfeCIpCgojJyBQbG90IHRoZSBjb3JyZWxhdGlvbnMgdnMuIHRoZSBnZW9ncmFwaGljIChjZW50cm9pZCkgZGlzdGFuY2Ugb2YgdGhlIHJlZ2lvbgojJyB0byB0aGUgR3JhbXBpYW5zLgojKyBwbG90Y29yczMsIGZpZy53aWR0aD0xMQpnZ3Bsb3QoY29ycmVsYXRpb25zKSArCmFlcyhHRCwgY29yKSArCmdlb21fcG9pbnQoKSArCmdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKeGxpbSgwLCAxMDAwKSArCnlsaW0oLTEsIDEpICsKZmFjZXRfd3JhcCgidmFyIikKCgo=