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:
- Fit a model to Grampians data.
- Calculate Performance Metrics:
- Predict probability of occurrence
- Predict within Grampians training set:
- Predict for each species including species random effects.
- Predict for each species without species random effects.
- Predict to the South-east validation set:
- Predict to each IBRA subregion within the South-east:
- Predict for each species common to Grampians and South-east subregion:
- Predict including species random effects.
- Predict without species random effects.
- Predict for each species not found in the Grampians training set.
- For each prediction type (within-sample/out-of-sample, with-re/without-re, and modelled-species/unmodelled-species), bioregion, and species (and their combinations) calculate performance metrics
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==