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

The following is a validation of the predictions/inference from a trait-environment model of the Grampians Bioregion ~20 taxa dataset.

The following steps are undertaken:

mds <- local({
  nms1 <-   c(
    "mean_moisture_index_of_low_qtr", "topographic_wetness_index_3sec",
    "relief_1000m_radius", "total_nitrogen"
  )
  nms2 <- c("sla_mm2_per_mg", "seed_mass_mg", "max_height_m")
  vars <- lapply(nms1, function(x) log(grampians[[x]]))
  vars <- do.call(cbind, vars)
  vars <- cbind(
    vars, do.call(cbind, lapply(nms2, function(x) log(grampians[[x]])))
  )
  vars <- scale(vars)
  cntrs <- attr(vars, "scaled:center")
  scales <- attr(vars, "scaled:scale")

  vars_new_raw <- na.omit(southeast)
  vars_new <- lapply(seq_along(nms1), function(x) log(vars_new_raw[[nms1[x]]]))
  vars_new <- do.call(cbind, vars_new)
  vars_new <- cbind(
    vars_new, do.call(cbind, lapply(nms2, function(x) log(vars_new_raw[[x]])))
  )
  vars_new <- scale(vars_new, center = cntrs, scale = scales)

  setNames(
    data.frame(
      vars_new_raw[, c("occupancy", "taxon", "ibra_subregion")], vars_new
    ),
    c(
      "y", "taxon", "ibra_subregion", "mlq", "twi", "r1k", "tn", "sla", "sm",
      "mh"
    )
  )
})
perf <- local({
  perf <- mapply(
    function(f, re.form) {
      f(
        model_grampians, y, list(taxon, ibra_subregion),
        rbind(mds, mdg[names(mds)]), re.form
      )
    },
    f = rep(list(auroc, pred_inf, dev_explained), each = 2),
    re.form = list(~(mlq + twi + r1k + tn | taxon),  NA)
  )
  taxon <- sub("(.*)\\..*", "\\1", rownames(perf))
  ibra_subregion <- sub(".*\\.", "", rownames(perf))
  dim(perf) <- dim(perf) * c(2, .5)
  colnames(perf) <- c("AUC", "mean_predictive_info", "deviance_explained")
  cbind(
    taxon = rep(taxon, 2),
    ibra_subregion = rep(ibra_subregion, 2),
    random_effect = rep(c(TRUE, FALSE), each = nrow(perf) / 2),
    as.data.frame(perf)
  )
})
ggplot(
  transform(
    subset(perf, ibra_subregion != "Greater Grampians" & !random_effect),
    ibra_subregion = factor(
      ibra_subregion, names(sort(tapply(AUC, ibra_subregion, median)))
    )
  )
) +
aes(AUC) + geom_histogram() + facet_wrap(~ibra_subregion, 3) +
xlab("AUC") +
ylab("No. of taxa") +
ggtitle(
  paste(
    "Area Under Receiver Operator Curve for taxa within IBRA subregions of",
    "Southeast Australia"
  )
)

ggplot(
  transform(
    subset(perf, ibra_subregion != "Greater Grampians" & !random_effect),
    ibra_subregion = factor(
      ibra_subregion,
      names(sort(tapply(mean_predictive_info, ibra_subregion, median)))
    )
  )
) +
aes(mean_predictive_info) + geom_histogram() + facet_wrap(~ibra_subregion, 3) +
xlab("Mean Predictive Information") +
ylab("No. of taxa") +
ggtitle(
  paste(
    "Mean Predictive Information for taxa within IBRA subregions of",
    "Southeast Australia"
  )
)

ggplot(
  transform(
    subset(perf, taxon %in% mdg$taxon & random_effect),
    taxon = factor(
      taxon,
      names(
        sort(
          tapply(
            AUC[ibra_subregion == "Greater Grampians"],
            taxon[ibra_subregion == "Greater Grampians"],
            median
          )
        )
      )
    )
  )
) +
aes(
  AUC,
  mean_predictive_info,
  col = ifelse(
    ibra_subregion == "Greater Grampians",
    "Grampians",
    "Other Region"
  )
) +
geom_point() +
facet_wrap(~taxon, labeller = label_wrap_gen(40)) +
labs(col = NULL) +
xlab("AUC") +
ylab("Mean Predictive Information") +
ggtitle(
  paste(
    ""
  )
) +
theme(legend.position = "bottom")

IycgLS0tCiMnIHRpdGxlOiAiVmFsaWRhdGlvbiBvZiBsaW5lYXIgbW9kZWwgd2l0aCBsb2NhdGlvbiByYW5kb20gZWZmZWN0IgojJyBhdXRob3I6ICJXaWxsaWFtIEsuIE1vcnJpcyIKIycgZGF0ZTogImByIFN5cy5EYXRlKClgIgojJyBvdXRwdXQ6CiMnICAgcm1hcmtkb3duOjpodG1sX25vdGVib29rOgojJyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMnIC0tLQoKIysgc2V0dXAsIG1lc3NhZ2U9RkFMU0UKa25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gVFJVRSwgZGV2ID0gYygicG5nIiwgInBkZiIpKQpsaWJyYXJ5KGhlcmUpCnNvdXJjZShoZXJlKCJzcmMiLCAibW9kZWxfbGluZWFyX2xvY2FsaXR5X2dyYW1waWFucy5SIikpCmxpYnJhcnkoZ2dwbG90MikKCiMnIFRoZSBmb2xsb3dpbmcgaXMgYSB2YWxpZGF0aW9uIG9mIHRoZSBwcmVkaWN0aW9ucy9pbmZlcmVuY2UgZnJvbSBhCiMnIHRyYWl0LWVudmlyb25tZW50IG1vZGVsIG9mIHRoZSBHcmFtcGlhbnMgQmlvcmVnaW9uIH4yMCB0YXhhIGRhdGFzZXQuCiMnCiMnIFRoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHVuZGVydGFrZW46CiMnCiMnICogRml0IGEgbW9kZWwgdG8gR3JhbXBpYW5zIGRhdGEuCiMnICogQ2FsY3VsYXRlIFBlcmZvcm1hbmNlIE1ldHJpY3M6CiMnICAgICAqIFByZWRpY3QgcHJvYmFiaWxpdHkgb2Ygb2NjdXJyZW5jZQojJyAgICAgICAgICogUHJlZGljdCB3aXRoaW4gR3JhbXBpYW5zIHRyYWluaW5nIHNldDoKIycgICAgICAgICAgICAgKiBQcmVkaWN0IGZvciBlYWNoIHNwZWNpZXMgaW5jbHVkaW5nIHNwZWNpZXMgcmFuZG9tIGVmZmVjdHMuCiMnICAgICAgICAgICAgICogUHJlZGljdCBmb3IgZWFjaCBzcGVjaWVzIHdpdGhvdXQgc3BlY2llcyByYW5kb20gZWZmZWN0cy4KIycgICAgICAgICAqIFByZWRpY3QgdG8gdGhlIFNvdXRoLWVhc3QgdmFsaWRhdGlvbiBzZXQ6CiMnICAgICAgICAgICAgICogUHJlZGljdCB0byBlYWNoIElCUkEgc3VicmVnaW9uIHdpdGhpbiB0aGUgU291dGgtZWFzdDoKIycgICAgICAgICAgICAgICAgICogUHJlZGljdCBmb3IgZWFjaCBzcGVjaWVzIGNvbW1vbiB0byBHcmFtcGlhbnMgYW5kIFNvdXRoLWVhc3QKIycgICAgICAgICAgICAgICAgICAgc3VicmVnaW9uOgojJyAgICAgICAgICAgICAgICAgICAgICogUHJlZGljdCBpbmNsdWRpbmcgc3BlY2llcyByYW5kb20gZWZmZWN0cy4KIycgICAgICAgICAgICAgICAgICAgICAqIFByZWRpY3Qgd2l0aG91dCBzcGVjaWVzIHJhbmRvbSBlZmZlY3RzLgojJyAgICAgICAgICAgICAgICAgKiBQcmVkaWN0IGZvciBlYWNoIHNwZWNpZXMgbm90IGZvdW5kIGluIHRoZSBHcmFtcGlhbnMKIycgICAgICAgICAgICAgICAgICAgdHJhaW5pbmcgc2V0LgojJyAgICAgKiBGb3IgZWFjaCBwcmVkaWN0aW9uIHR5cGUgKHdpdGhpbi1zYW1wbGUvb3V0LW9mLXNhbXBsZSwKIycgICAgICAgd2l0aC1yZS93aXRob3V0LXJlLCBhbmQgbW9kZWxsZWQtc3BlY2llcy91bm1vZGVsbGVkLXNwZWNpZXMpLAojJyAgICAgICBiaW9yZWdpb24sIGFuZCBzcGVjaWVzIChhbmQgdGhlaXIgY29tYmluYXRpb25zKSBjYWxjdWxhdGUgcGVyZm9ybWFuY2UKIycgICAgICAgbWV0cmljcwoKIysgbWRzCm1kcyA8LSBsb2NhbCh7CiAgbm1zMSA8LSAgIGMoCiAgICAibWVhbl9tb2lzdHVyZV9pbmRleF9vZl9sb3dfcXRyIiwgInRvcG9ncmFwaGljX3dldG5lc3NfaW5kZXhfM3NlYyIsCiAgICAicmVsaWVmXzEwMDBtX3JhZGl1cyIsICJ0b3RhbF9uaXRyb2dlbiIKICApCiAgbm1zMiA8LSBjKCJzbGFfbW0yX3Blcl9tZyIsICJzZWVkX21hc3NfbWciLCAibWF4X2hlaWdodF9tIikKICB2YXJzIDwtIGxhcHBseShubXMxLCBmdW5jdGlvbih4KSBsb2coZ3JhbXBpYW5zW1t4XV0pKQogIHZhcnMgPC0gZG8uY2FsbChjYmluZCwgdmFycykKICB2YXJzIDwtIGNiaW5kKAogICAgdmFycywgZG8uY2FsbChjYmluZCwgbGFwcGx5KG5tczIsIGZ1bmN0aW9uKHgpIGxvZyhncmFtcGlhbnNbW3hdXSkpKQogICkKICB2YXJzIDwtIHNjYWxlKHZhcnMpCiAgY250cnMgPC0gYXR0cih2YXJzLCAic2NhbGVkOmNlbnRlciIpCiAgc2NhbGVzIDwtIGF0dHIodmFycywgInNjYWxlZDpzY2FsZSIpCgogIHZhcnNfbmV3X3JhdyA8LSBuYS5vbWl0KHNvdXRoZWFzdCkKICB2YXJzX25ldyA8LSBsYXBwbHkoc2VxX2Fsb25nKG5tczEpLCBmdW5jdGlvbih4KSBsb2codmFyc19uZXdfcmF3W1tubXMxW3hdXV0pKQogIHZhcnNfbmV3IDwtIGRvLmNhbGwoY2JpbmQsIHZhcnNfbmV3KQogIHZhcnNfbmV3IDwtIGNiaW5kKAogICAgdmFyc19uZXcsIGRvLmNhbGwoY2JpbmQsIGxhcHBseShubXMyLCBmdW5jdGlvbih4KSBsb2codmFyc19uZXdfcmF3W1t4XV0pKSkKICApCiAgdmFyc19uZXcgPC0gc2NhbGUodmFyc19uZXcsIGNlbnRlciA9IGNudHJzLCBzY2FsZSA9IHNjYWxlcykKCiAgc2V0TmFtZXMoCiAgICBkYXRhLmZyYW1lKAogICAgICB2YXJzX25ld19yYXdbLCBjKCJvY2N1cGFuY3kiLCAidGF4b24iLCAiaWJyYV9zdWJyZWdpb24iKV0sIHZhcnNfbmV3CiAgICApLAogICAgYygKICAgICAgInkiLCAidGF4b24iLCAiaWJyYV9zdWJyZWdpb24iLCAibWxxIiwgInR3aSIsICJyMWsiLCAidG4iLCAic2xhIiwgInNtIiwKICAgICAgIm1oIgogICAgKQogICkKfSkKCiMrIHBlcmYKcGVyZiA8LSBsb2NhbCh7CiAgcGVyZiA8LSBtYXBwbHkoCiAgICBmdW5jdGlvbihmLCByZS5mb3JtKSB7CiAgICAgIGYoCiAgICAgICAgbW9kZWxfZ3JhbXBpYW5zLCB5LCBsaXN0KHRheG9uLCBpYnJhX3N1YnJlZ2lvbiksCiAgICAgICAgcmJpbmQobWRzLCBtZGdbbmFtZXMobWRzKV0pLCByZS5mb3JtCiAgICAgICkKICAgIH0sCiAgICBmID0gcmVwKGxpc3QoYXVyb2MsIHByZWRfaW5mLCBkZXZfZXhwbGFpbmVkKSwgZWFjaCA9IDIpLAogICAgcmUuZm9ybSA9IGxpc3QofihtbHEgKyB0d2kgKyByMWsgKyB0biB8IHRheG9uKSwgIE5BKQogICkKICB0YXhvbiA8LSBzdWIoIiguKilcXC4uKiIsICJcXDEiLCByb3duYW1lcyhwZXJmKSkKICBpYnJhX3N1YnJlZ2lvbiA8LSBzdWIoIi4qXFwuIiwgIiIsIHJvd25hbWVzKHBlcmYpKQogIGRpbShwZXJmKSA8LSBkaW0ocGVyZikgKiBjKDIsIC41KQogIGNvbG5hbWVzKHBlcmYpIDwtIGMoIkFVQyIsICJtZWFuX3ByZWRpY3RpdmVfaW5mbyIsICJkZXZpYW5jZV9leHBsYWluZWQiKQogIGNiaW5kKAogICAgdGF4b24gPSByZXAodGF4b24sIDIpLAogICAgaWJyYV9zdWJyZWdpb24gPSByZXAoaWJyYV9zdWJyZWdpb24sIDIpLAogICAgcmFuZG9tX2VmZmVjdCA9IHJlcChjKFRSVUUsIEZBTFNFKSwgZWFjaCA9IG5yb3cocGVyZikgLyAyKSwKICAgIGFzLmRhdGEuZnJhbWUocGVyZikKICApCn0pCgojKyBwbG90LWF1YywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDExCmdncGxvdCgKICB0cmFuc2Zvcm0oCiAgICBzdWJzZXQocGVyZiwgaWJyYV9zdWJyZWdpb24gIT0gIkdyZWF0ZXIgR3JhbXBpYW5zIiAmICFyYW5kb21fZWZmZWN0KSwKICAgIGlicmFfc3VicmVnaW9uID0gZmFjdG9yKAogICAgICBpYnJhX3N1YnJlZ2lvbiwgbmFtZXMoc29ydCh0YXBwbHkoQVVDLCBpYnJhX3N1YnJlZ2lvbiwgbWVkaWFuKSkpCiAgICApCiAgKQopICsKYWVzKEFVQykgKyBnZW9tX2hpc3RvZ3JhbSgpICsgZmFjZXRfd3JhcCh+aWJyYV9zdWJyZWdpb24sIDMpICsKeGxhYigiQVVDIikgKwp5bGFiKCJOby4gb2YgdGF4YSIpICsKZ2d0aXRsZSgKICBwYXN0ZSgKICAgICJBcmVhIFVuZGVyIFJlY2VpdmVyIE9wZXJhdG9yIEN1cnZlIGZvciB0YXhhIHdpdGhpbiBJQlJBIHN1YnJlZ2lvbnMgb2YiLAogICAgIlNvdXRoZWFzdCBBdXN0cmFsaWEiCiAgKQopCgojKyBwbG90LXByZWQtaW5mbywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy53aWR0aCA9IDExCmdncGxvdCgKICB0cmFuc2Zvcm0oCiAgICBzdWJzZXQocGVyZiwgaWJyYV9zdWJyZWdpb24gIT0gIkdyZWF0ZXIgR3JhbXBpYW5zIiAmICFyYW5kb21fZWZmZWN0KSwKICAgIGlicmFfc3VicmVnaW9uID0gZmFjdG9yKAogICAgICBpYnJhX3N1YnJlZ2lvbiwKICAgICAgbmFtZXMoc29ydCh0YXBwbHkobWVhbl9wcmVkaWN0aXZlX2luZm8sIGlicmFfc3VicmVnaW9uLCBtZWRpYW4pKSkKICAgICkKICApCikgKwphZXMobWVhbl9wcmVkaWN0aXZlX2luZm8pICsgZ2VvbV9oaXN0b2dyYW0oKSArIGZhY2V0X3dyYXAofmlicmFfc3VicmVnaW9uLCAzKSArCnhsYWIoIk1lYW4gUHJlZGljdGl2ZSBJbmZvcm1hdGlvbiIpICsKeWxhYigiTm8uIG9mIHRheGEiKSArCmdndGl0bGUoCiAgcGFzdGUoCiAgICAiTWVhbiBQcmVkaWN0aXZlIEluZm9ybWF0aW9uIGZvciB0YXhhIHdpdGhpbiBJQlJBIHN1YnJlZ2lvbnMgb2YiLAogICAgIlNvdXRoZWFzdCBBdXN0cmFsaWEiCiAgKQopCgojKyBwbG90LWdyYW1waWFucy10YXhhLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLndpZHRoID0gMTEKZ2dwbG90KAogIHRyYW5zZm9ybSgKICAgIHN1YnNldChwZXJmLCB0YXhvbiAlaW4lIG1kZyR0YXhvbiAmIHJhbmRvbV9lZmZlY3QpLAogICAgdGF4b24gPSBmYWN0b3IoCiAgICAgIHRheG9uLAogICAgICBuYW1lcygKICAgICAgICBzb3J0KAogICAgICAgICAgdGFwcGx5KAogICAgICAgICAgICBBVUNbaWJyYV9zdWJyZWdpb24gPT0gIkdyZWF0ZXIgR3JhbXBpYW5zIl0sCiAgICAgICAgICAgIHRheG9uW2licmFfc3VicmVnaW9uID09ICJHcmVhdGVyIEdyYW1waWFucyJdLAogICAgICAgICAgICBtZWRpYW4KICAgICAgICAgICkKICAgICAgICApCiAgICAgICkKICAgICkKICApCikgKwphZXMoCiAgQVVDLAogIG1lYW5fcHJlZGljdGl2ZV9pbmZvLAogIGNvbCA9IGlmZWxzZSgKICAgIGlicmFfc3VicmVnaW9uID09ICJHcmVhdGVyIEdyYW1waWFucyIsCiAgICAiR3JhbXBpYW5zIiwKICAgICJPdGhlciBSZWdpb24iCiAgKQopICsKZ2VvbV9wb2ludCgpICsKZmFjZXRfd3JhcCh+dGF4b24sIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4oNDApKSArCmxhYnMoY29sID0gTlVMTCkgKwp4bGFiKCJBVUMiKSArCnlsYWIoIk1lYW4gUHJlZGljdGl2ZSBJbmZvcm1hdGlvbiIpICsKZ2d0aXRsZSgKICBwYXN0ZSgKICAgICIiCiAgKQopICsKdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCg==