knitr::opts_chunk$set(cache = TRUE, dev = c("png", "pdf"))
library(blme)
library(digest)
library(eucs)
library(here)
library(openblasctl)
library(xtable)
Data
mdg <- transform(
modeldata_grampians,
y = occupancy,
mlq = scale.default(log(mean_moisture_index_of_low_qtr)),
twi = scale.default(log(topographic_wetness_index_3sec)),
r1k = scale.default(log(relief_1000m_radius)),
tn = scale.default(log(total_nitrogen)),
sla = scale.default(log(sla_mm2_per_mg)),
sm = scale.default(log(seed_mass_mg)),
mh = scale.default(log(max_height_m))
)
Model
call <- list(
formula =
y ~ mlq + twi + r1k + tn +
mlq:sla + mlq:sm + mlq:mh +
twi:sla + twi:sm + twi:mh +
r1k:sla + r1k:sm + r1k:mh +
tn:sla + tn:sm + tn:mh +
(mlq + twi + r1k + tn | taxon),
family = quote(binomial),
data = mdg,
fixef.prior = quote(normal(sd = 1)),
cov.prior = quote(
invwishart(
df = 5 + 4, scale = diag(sqrt((5 + 4) / 2), 5), common.scale = FALSE
)
),
control = quote(
glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e6))
)
)
file <- paste0(eucs_cache_path(), "/", digest(deparse(call)), ".rds")
call$data <- quote(mdg)
if (!file_test("-f", file)) {
openblas_set_num_threads(30)
saveRDS(do.call(bglmer, call), file)
openblas_set_num_threads(1)
}
model_grampians <- readRDS(file)
summary(model_grampians)
Cov prior : taxon ~ invwishart(df = 9, scale = c(2.1213, 0, 0, ...), posterior.scale = cov, common.scale = TRUE)
Fixef prior: normal(sd = c(1, ...), corr = c(0 ...), common.scale = FALSE)normal(sd = c(1, ...), corr = c(0 ...), common.scale = FALSE)
Prior dev : 25.4848
Generalized linear mixed model fit by maximum likelihood (Laplace
Approximation) [bglmerMod]
Family: binomial ( logit )
Formula: y ~ mlq + twi + r1k + tn + mlq:sla + mlq:sm + mlq:mh + twi:sla +
twi:sm + twi:mh + r1k:sla + r1k:sm + r1k:mh + tn:sla + tn:sm +
tn:mh + (mlq + twi + r1k + tn | taxon)
Data: mdg
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 1e+06))
AIC BIC logLik deviance df.resid
4454.0 4681.8 -2195.0 4390.0 9108
Scaled residuals:
Min 1Q Median 3Q Max
-2.0649 -0.3144 -0.1498 -0.0643 15.0957
Random effects:
Groups Name Variance Std.Dev. Corr
taxon (Intercept) 1.3668 1.1691
mlq 0.4941 0.7029 -0.21
twi 0.1453 0.3812 -0.02 0.43
r1k 0.2271 0.4765 -0.12 -0.36 -0.22
tn 0.1329 0.3645 0.05 -0.43 -0.26 0.16
Number of obs: 9140, groups: taxon, 20
Fixed effects:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.24440 0.26783 -12.114 < 2e-16 ***
mlq -0.25659 0.18456 -1.390 0.16444
twi 0.11136 0.10897 1.022 0.30681
r1k 0.39596 0.14860 2.665 0.00771 **
tn -0.10482 0.12962 -0.809 0.41869
mlq:sla -0.01301 0.35069 -0.037 0.97042
mlq:sm 0.20270 0.31765 0.638 0.52340
mlq:mh 0.05000 0.22033 0.227 0.82048
twi:sla 0.41885 0.20805 2.013 0.04409 *
twi:sm -0.10689 0.18786 -0.569 0.56939
twi:mh 0.03335 0.13206 0.253 0.80062
r1k:sla 0.47362 0.26187 1.809 0.07052 .
r1k:sm 0.62574 0.23248 2.692 0.00711 **
r1k:mh -0.03077 0.16454 -0.187 0.85164
tn:sla -0.24740 0.24130 -1.025 0.30523
tn:sm 0.09289 0.20842 0.446 0.65581
tn:mh -0.10817 0.14776 -0.732 0.46414
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Table of random effects.
covariate_nms <- c(
"MMI",
"TWI",
"R1k",
"TN"
)
vc <- summary(model_grampians)$varcor$taxon
stdev <- as.character(round(sqrt(diag(vc)), 1))
corr <- matrix(as.character(round(cov2cor(vc), 1)), 5)
corr[!lower.tri(corr)] <- ""
vtab <- cbind(stdev, corr)
vtab <- rbind(
c("$\\sigma$", "$\\rho$", "", "", "", ""),
rbind(c("", "$B_0$", covariate_nms)),
vtab
)
vtab <- cbind(
rownames(vtab) <- c("", "", "$B_0$", covariate_nms), vtab[, -6]
)
vtab <- xtable(
vtab, caption = "Random effects", label = "tab:varcovlin",
align = "lll|llll", digits = 1
)
dir.create(
here("notebooks/model_linear_grampians_files/figure-html"),
showWarnings = FALSE, recursive = TRUE
)
print(
vtab,
file = here(
"notebooks/model_linear_grampians_files/figure-html/vtab.tex"
),
include.rownames = FALSE,
table.placement = "htbp!",
caption.placement = "top",
hline.after = c(-1, 2, nrow(vtab)),
include.colnames = FALSE,
sanitize.text.function = identity
)
Table of fixed effects.
fe <- round(summary(model_grampians)$coefficients[, 1:2], 1)
rownames(fe) <- c(
"$B_0$",
covariate_nms,
paste(rep(covariate_nms, each = 3), c("SLA", "SM", "MH"), sep = "-")
)
colnames(fe) <- c("$\\mu$", "$\\sigma$")
fe <- xtable(
fe, caption = "Fixed effects", label = "tab:felin",
align = "lll", digits = 1
)
print(
fe,
file = here(
"notebooks/model_linear_grampians_files/figure-html/fetab.tex"
),
include.rownames = TRUE,
table.placement = "htbp!",
caption.placement = "top",
hline.after = c(-1, 1, 5, nrow(fe)),
include.colnames = TRUE,
sanitize.text.function = identity
)
IycgLS0tCiMnIHRpdGxlOiAiTW9kZWwgb2YgR3JhbXBpYW5zIE9jY3VwYW5jeSBhbmQgVHJhaXQgRGF0YSB3aXRoIGxpbmVhciByZWxhdGlvbnNoaXBzIgojJyBhdXRob3I6ICJXaWxsaWFtIEsuIE1vcnJpcyIKIycgZGF0ZTogImByIFN5cy5EYXRlKClgIgojJyBvdXRwdXQ6CiMnICAgcm1hcmtkb3duOjpodG1sX25vdGVib29rOgojJyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMnIC0tLQoKIysgc2V0dXAsIG1lc3NhZ2U9RkFMU0UKa25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gVFJVRSwgZGV2ID0gYygicG5nIiwgInBkZiIpKQpsaWJyYXJ5KGJsbWUpCmxpYnJhcnkoZGlnZXN0KQpsaWJyYXJ5KGV1Y3MpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShvcGVuYmxhc2N0bCkKbGlicmFyeSh4dGFibGUpCgojJyAjIyBEYXRhCiMrIGxvYWQtZGF0YQptZGcgPC0gdHJhbnNmb3JtKAogIG1vZGVsZGF0YV9ncmFtcGlhbnMsCiAgeSAgID0gb2NjdXBhbmN5LAogIG1scSA9IHNjYWxlLmRlZmF1bHQobG9nKG1lYW5fbW9pc3R1cmVfaW5kZXhfb2ZfbG93X3F0cikpLAogIHR3aSA9IHNjYWxlLmRlZmF1bHQobG9nKHRvcG9ncmFwaGljX3dldG5lc3NfaW5kZXhfM3NlYykpLAogIHIxayA9IHNjYWxlLmRlZmF1bHQobG9nKHJlbGllZl8xMDAwbV9yYWRpdXMpKSwKICB0biAgPSBzY2FsZS5kZWZhdWx0KGxvZyh0b3RhbF9uaXRyb2dlbikpLAogIHNsYSA9IHNjYWxlLmRlZmF1bHQobG9nKHNsYV9tbTJfcGVyX21nKSksCiAgc20gID0gc2NhbGUuZGVmYXVsdChsb2coc2VlZF9tYXNzX21nKSksCiAgbWggID0gc2NhbGUuZGVmYXVsdChsb2cobWF4X2hlaWdodF9tKSkKKQoKIycgIyMgTW9kZWwKIysgcnVuLW1vZGVsLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1GQUxTRQpjYWxsIDwtIGxpc3QoCiAgZm9ybXVsYSA9CiAgICB5IH4gbWxxICsgdHdpICsgcjFrICsgdG4gKwogICAgICBtbHE6c2xhICsgbWxxOnNtICsgbWxxOm1oICsKICAgICAgdHdpOnNsYSArIHR3aTpzbSArIHR3aTptaCArCiAgICAgIHIxazpzbGEgKyByMWs6c20gKyByMWs6bWggKwogICAgICB0bjpzbGEgKyB0bjpzbSArIHRuOm1oICsKICAgICAgKG1scSArIHR3aSArIHIxayArIHRuIHwgdGF4b24pLAogIGZhbWlseSA9IHF1b3RlKGJpbm9taWFsKSwKICBkYXRhID0gbWRnLAogIGZpeGVmLnByaW9yID0gcXVvdGUobm9ybWFsKHNkID0gMSkpLAogIGNvdi5wcmlvciA9IHF1b3RlKAogICAgaW52d2lzaGFydCgKICAgICAgZGYgPSA1ICsgNCwgc2NhbGUgPSBkaWFnKHNxcnQoKDUgKyA0KSAvIDIpLCA1KSwgY29tbW9uLnNjYWxlID0gRkFMU0UKICAgICkKICApLAogIGNvbnRyb2wgPSBxdW90ZSgKICAgIGdsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMWU2KSkKICApCikKZmlsZSA8LSBwYXN0ZTAoZXVjc19jYWNoZV9wYXRoKCksICIvIiwgZGlnZXN0KGRlcGFyc2UoY2FsbCkpLCAiLnJkcyIpCgpjYWxsJGRhdGEgPC0gcXVvdGUobWRnKQoKaWYgKCFmaWxlX3Rlc3QoIi1mIiwgZmlsZSkpIHsKICBvcGVuYmxhc19zZXRfbnVtX3RocmVhZHMoMzApCiAgc2F2ZVJEUyhkby5jYWxsKGJnbG1lciwgY2FsbCksIGZpbGUpCiAgb3BlbmJsYXNfc2V0X251bV90aHJlYWRzKDEpCn0KCm1vZGVsX2dyYW1waWFucyA8LSByZWFkUkRTKGZpbGUpCgpzdW1tYXJ5KG1vZGVsX2dyYW1waWFucykKCiMnICMjIFRhYmxlIG9mIHJhbmRvbSBlZmZlY3RzLgojK3JhbmVmCmNvdmFyaWF0ZV9ubXMgPC0gYygKICAiTU1JIiwKICAiVFdJIiwKICAiUjFrIiwKICAiVE4iCikKCnZjIDwtIHN1bW1hcnkobW9kZWxfZ3JhbXBpYW5zKSR2YXJjb3IkdGF4b24Kc3RkZXYgPC0gYXMuY2hhcmFjdGVyKHJvdW5kKHNxcnQoZGlhZyh2YykpLCAxKSkKY29yciA8LSBtYXRyaXgoYXMuY2hhcmFjdGVyKHJvdW5kKGNvdjJjb3IodmMpLCAxKSksIDUpCmNvcnJbIWxvd2VyLnRyaShjb3JyKV0gPC0gIiIKdnRhYiA8LSBjYmluZChzdGRldiwgY29ycikKdnRhYiA8LSByYmluZCgKICBjKCIkXFxzaWdtYSQiLCAiJFxccmhvJCIsICIiLCAiIiwgIiIsICIiKSwKICByYmluZChjKCIiLCAiJEJfMCQiLCBjb3ZhcmlhdGVfbm1zKSksCiAgdnRhYgopCnZ0YWIgPC0gY2JpbmQoCiAgcm93bmFtZXModnRhYikgPC0gYygiIiwgIiIsICIkQl8wJCIsIGNvdmFyaWF0ZV9ubXMpLCB2dGFiWywgLTZdCikKCnZ0YWIgPC0geHRhYmxlKAogIHZ0YWIsIGNhcHRpb24gPSAiUmFuZG9tIGVmZmVjdHMiLCBsYWJlbCA9ICJ0YWI6dmFyY292bGluIiwKICBhbGlnbiA9ICJsbGx8bGxsbCIsIGRpZ2l0cyA9IDEKKQoKZGlyLmNyZWF0ZSgKICBoZXJlKCJub3RlYm9va3MvbW9kZWxfbGluZWFyX2dyYW1waWFuc19maWxlcy9maWd1cmUtaHRtbCIpLAogIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFCikKCnByaW50KAogIHZ0YWIsCiAgZmlsZSA9IGhlcmUoCiAgICAibm90ZWJvb2tzL21vZGVsX2xpbmVhcl9ncmFtcGlhbnNfZmlsZXMvZmlndXJlLWh0bWwvdnRhYi50ZXgiCiAgKSwKICBpbmNsdWRlLnJvd25hbWVzID0gRkFMU0UsCiAgdGFibGUucGxhY2VtZW50ID0gImh0YnAhIiwKICBjYXB0aW9uLnBsYWNlbWVudCA9ICJ0b3AiLAogIGhsaW5lLmFmdGVyID0gYygtMSwgMiwgbnJvdyh2dGFiKSksCiAgaW5jbHVkZS5jb2xuYW1lcyA9IEZBTFNFLAogIHNhbml0aXplLnRleHQuZnVuY3Rpb24gPSBpZGVudGl0eQopCgojJyAjIyBUYWJsZSBvZiBmaXhlZCBlZmZlY3RzLgojK2ZpeGVmCmZlIDwtIHJvdW5kKHN1bW1hcnkobW9kZWxfZ3JhbXBpYW5zKSRjb2VmZmljaWVudHNbLCAxOjJdLCAxKQpyb3duYW1lcyhmZSkgPC0gYygKICAiJEJfMCQiLAogIGNvdmFyaWF0ZV9ubXMsCiAgcGFzdGUocmVwKGNvdmFyaWF0ZV9ubXMsIGVhY2ggPSAzKSwgYygiU0xBIiwgIlNNIiwgIk1IIiksIHNlcCA9ICItIikKKQpjb2xuYW1lcyhmZSkgPC0gYygiJFxcbXUkIiwgIiRcXHNpZ21hJCIpCgpmZSA8LSB4dGFibGUoCiAgZmUsIGNhcHRpb24gPSAiRml4ZWQgZWZmZWN0cyIsIGxhYmVsID0gInRhYjpmZWxpbiIsCiAgYWxpZ24gPSAibGxsIiwgZGlnaXRzID0gMQopCgpwcmludCgKICBmZSwKICBmaWxlID0gaGVyZSgKICAgICJub3RlYm9va3MvbW9kZWxfbGluZWFyX2dyYW1waWFuc19maWxlcy9maWd1cmUtaHRtbC9mZXRhYi50ZXgiCiAgKSwKICBpbmNsdWRlLnJvd25hbWVzID0gVFJVRSwKICB0YWJsZS5wbGFjZW1lbnQgPSAiaHRicCEiLAogIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIsCiAgaGxpbmUuYWZ0ZXIgPSBjKC0xLCAxLCA1LCBucm93KGZlKSksCiAgaW5jbHVkZS5jb2xuYW1lcyA9IFRSVUUsCiAgc2FuaXRpemUudGV4dC5mdW5jdGlvbiA9IGlkZW50aXR5CikKCg==