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==