class: inverse, middle, left, my-title-slide, title-slide .title[ # Ecological forecasting with dynamic GAMs ] .author[ ### Nicholas Clark ] .institute[ ### School of Veterinary Science, University of Queensland, Australia ] .date[ ### November, 2023 ] --- class: middle center ###“Because all decision making is based on what will happen in the future, either under the status quo or different decision alternatives, decision making ultimately depends on forecasts” [Dietze et al. 2018](https://ecoforecast.org/about/) --- background-image: url('./resources/big_data.gif') background-size: contain background-color: #F2F2F2 --- ## Properties of ecological series Temporal autocorrelation Lagged effects Non-Gaussian data and missing observations Measurement error Time-varying effects Nonlinearities Multi-series clustering --- ## Properties of ecological series .grey[Temporal autocorrelation Lagged effects Non-Gaussian data and missing observations Measurement error Time-varying effects] .emphasize[*Nonlinearities*] .grey[Multi-series clustering] --- class: animated fadeIn <body><div id="pan"></div></body> --- background-image: url('./resources/basis_weights.gif') ## GAMs use splines... --- background-image: url('./resources/smooth_to_data.gif') ## ...penalized to fit data --- class: full-size ## Easy to fit in
<img align="center" width="306" height="464" src="resources/gam_book.jpg" style="float: right; margin: 10px;"> `$$\mathbb{E}(\boldsymbol{Y_t}|\boldsymbol{X_t})=g^{-1}(\alpha + \sum_{j=1}^{J}f(x_{jt}))$$` <br/> Where: - `\(g^{-1}\)` is the inverse of the link function - `\({\alpha}\)` is the intercept - `\(f(x)\)` are potentially nonlinear functions of the `\(J\)` predictors --- background-image: url('./EFI_talk_slidedeck_files/figure-html/complexity-1.svg') --- ## Need more on GAMs? --- class: inverse background-image: url('./resources/simpson_screenshot.png') background-size: cover ## Gavin has you covered
<img width="230" height="230" src="resources/simpson_qr_code.svg" style="position:absolute; bottom:0px; right:0px"> --- class: middle center ### GAMs are just fancy GLMs, where some (or all) of the predictor effects are estimated as (possibly nonlinear) smooth functions <br> ### But the complexity these smooth functions can handle is *enormous* --- ## What's the catch? <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-1-1.svg" style="display: block; margin: auto;" /> --- ## A spline of `time` ```r library(mgcv) *model <- gam(y ~ s(time, k = 20, bs = 'bs', m = 2), data = data, family = gaussian()) ``` A B-spline (`bs = 'bs'`) with `m = 2` sets the penalty on the second derivative --- ## Hindcasts
<img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-3-1.svg" style="display: block; margin: auto;" /> ``` ## No non-missing values in test_observations; cannot calculate forecast score ``` --- ## Extrapolate 2-steps ahead
<img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-4-1.svg" style="display: block; margin: auto;" /> --- ## 5-steps ahead
<img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-5-1.svg" style="display: block; margin: auto;" /> --- ## 20-steps ahead
<img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-6-1.svg" style="display: block; margin: auto;" /> --- background-image: url('./resources/basis_weights.gif') ## Basis functions ⇨ local knowledge --- ## Basis functions ⇨ local knowledge <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-7-1.svg" style="display: block; margin: auto;" /> --- ## Basis functions ⇨ local knowledge <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-8-1.svg" style="display: block; margin: auto;" /> --- ## Basis functions ⇨ local knowledge <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-9-1.svg" style="display: block; margin: auto;" /> --- ## Forecasts
<img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-10-1.svg" style="display: block; margin: auto;" /> --- ## We need *global knowledge* <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-11-1.svg" style="display: block; margin: auto;" /> --- ## We need *global knowledge* <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-12-1.svg" style="display: block; margin: auto;" /> --- ## We need *global knowledge* <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-13-1.svg" style="display: block; margin: auto;" /> --- ## We need *global knowledge* <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-14-1.svg" style="display: block; margin: auto;" /> --- ## Dynamic GAMs `$$\mathbb{E}(\boldsymbol{Y_t}|\boldsymbol{X_t})=g^{-1}(\alpha + \sum_{j=1}^{J}f(x_{jt}) + z_t)$$` <br/> Where: - `\(g^{-1}\)` is the inverse of the link function - `\({\alpha}\)` is the intercept - `\(f(x)\)` are potentially nonlinear functions of the `\(J\)` predictors - `\(z_t\)` is a .emphasize[*latent dynamic process*] --- ## Modelling with the [`mvgam` 📦](https://github.com/nicholasjclark/mvgam/tree/master) Bayesian framework to fit Dynamic GLMs and Dynamic GAMs - Hierarchical intercepts, slopes and smooths - Latent dynamic processes - State-Space models with measurement error Built off the [`mgcv` 📦](https://cran.r-project.org/web/packages/mgcv/index.html) to construct penalized smoothing splines Convenient and familiar
formula interface Uni- or multivariate series from a range of response distributions Uses [Stan](https://mc-stan.org/) for efficient Hamiltonian Monte Carlo sampling --- ## Observation families `gaussian()`, `student-t()` ⇨ real values in `\((-\infty, \infty)\)` `lognormal()`, `Gamma()` ⇨ positive real values in `\([0, \infty)\)` `betar()` ⇨ real values (proportional) in `\([0,1]\)` `poisson()`, `nb()` ⇨ non-negative integers in `\((0,1,2,...)\)` --- ## Extended predictor effects `s()` ⇨ Smoothing spline of one or more covariates `s(bs = 're')` ⇨ Hierarchical slopes or intercepts `te(), ti(), t2()` ⇨ Tensor product smoothing spline of two or more covariates `gp()` ⇨ Gaussian Process function (with squared exponential kernel) of one covariate `dynamic()` ⇨ Time-varying effect of one covariate --- class: middle center ### We can fit models that include random effects, nonlinear effects and complex multidimensional smooth functions. All these effects can operate .emphasize[*on both process and observation models*] <br> ### Can incorporate unobserved temporal dynamics; do not need to regress the outcome on its own past values <br> ### Very advantageous for ecological time series. But what kinds of dynamic processes are available in the `mvgam` 📦? --- ## Random Walk or AR(1-3) <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-15-1.svg" style="display: block; margin: auto;" /> --- ## Gaussian Process... <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-16-1.svg" style="display: block; margin: auto;" /> --- ## ...where length scale ⇨ *memory* <img src="EFI_talk_slidedeck_files/figure-html/unnamed-chunk-17-1.svg" style="display: block; margin: auto;" /> --- background-image: url('./resources/VAR.svg') background-size: contain ## VAR1 ⇨ Granger causality --- background-image: url('./resources/df_with_series.gif') ## Factors ⇨ induced correlations --- ## Example of the interface ```r model <- mvgam( formula = y ~ s(series, bs = 're') + s(x0, series, bs = 're') + x1 + gp() + te(x3, x4, bs = c('cr', 'tp')), data = data, family = poisson(), trend_model = 'AR1', burnin = 500, samples = 500, chains = 4, parallel = TRUE ) ``` --- ## Example data (long format) <table class=" lightable-minimal" style='font-family: "Trebuchet MS", verdana, sans-serif; width: auto !important; margin-left: auto; margin-right: auto;'> <thead> <tr> <th style="text-align:right;"> y </th> <th style="text-align:left;"> series </th> <th style="text-align:right;"> time </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 5 </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;"> 2 </td> </tr> </tbody> </table> --- ## Response (`NA`s allowed) <table class=" lightable-minimal" style='font-family: "Trebuchet MS", verdana, sans-serif; width: auto !important; margin-left: auto; margin-right: auto;'> <thead> <tr> <th style="text-align:right;"> y </th> <th style="text-align:left;"> series </th> <th style="text-align:right;"> time </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 2 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> NA </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> NA </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 3 </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 5 </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;"> 2 </td> </tr> </tbody> </table> --- ## Series indicator (as `factor`) <table class=" lightable-minimal" style='font-family: "Trebuchet MS", verdana, sans-serif; width: auto !important; margin-left: auto; margin-right: auto;'> <thead> <tr> <th style="text-align:right;"> y </th> <th style="text-align:left;"> series </th> <th style="text-align:right;"> time </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 2 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_1 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_2 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_3 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_4 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 1 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_1 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_2 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 3 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_3 </td> <td style="text-align:right;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 5 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> species_4 </td> <td style="text-align:right;"> 2 </td> </tr> </tbody> </table> --- ## Time indicator <table class=" lightable-minimal" style='font-family: "Trebuchet MS", verdana, sans-serif; width: auto !important; margin-left: auto; margin-right: auto;'> <thead> <tr> <th style="text-align:right;"> y </th> <th style="text-align:left;"> series </th> <th style="text-align:right;"> time </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1 </td> </tr> <tr> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 2 </td> </tr> <tr> <td style="text-align:right;"> 5 </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 2 </td> </tr> </tbody> </table> --- ## Any other predictors <table class=" lightable-minimal" style='font-family: "Trebuchet MS", verdana, sans-serif; width: auto !important; margin-left: auto; margin-right: auto;'> <thead> <tr> <th style="text-align:right;"> y </th> <th style="text-align:left;"> series </th> <th style="text-align:right;"> time </th> <th style="text-align:right;"> x0 </th> <th style="text-align:left;"> x1 </th> <th style="text-align:right;"> x2 </th> <th style="text-align:right;"> x3 </th> <th style="text-align:right;"> x4 </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 2 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.38 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> A </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.20 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1.18 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.72 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.71 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> A </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -2.67 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1.02 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.67 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.05 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> B </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.33 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.12 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1.50 </td> </tr> <tr> <td style="text-align:right;"> NA </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.77 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> B </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.65 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.86 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.49 </td> </tr> <tr> <td style="text-align:right;"> 1 </td> <td style="text-align:left;"> species_1 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.29 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> A </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.25 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1.18 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.82 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> <td style="text-align:left;"> species_2 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.34 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> A </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.15 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 2.12 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.20 </td> </tr> <tr> <td style="text-align:right;"> 3 </td> <td style="text-align:left;"> species_3 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.38 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> B </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.81 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1.33 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -1.15 </td> </tr> <tr> <td style="text-align:right;"> 5 </td> <td style="text-align:left;"> species_4 </td> <td style="text-align:right;"> 2 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1.32 </td> <td style="text-align:left;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> B </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 0.22 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> -0.72 </td> <td style="text-align:right;font-weight: bold;background-color: rgba(81, 36, 122, 0.13) !important;"> 1.36 </td> </tr> </tbody> </table> --- background-image: url('./resources/response_types.svg') background-size: contain ## Types of `mvgam` predictions <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> .small[modified from [Heiss 2022](https://www.andrewheiss.com/blog/2022/09/26/guide-visualizing-types-posteriors/)] --- ## Workflow in `mvgam` 📦 Fit models that can include nonlinear splines, GPs, and multivariate dynamic processes to ecological time series Use posterior predictive checks and Randomized Quantile (Dunn-Smyth) residuals to assess model failures Use `marginaleffects` 📦 to generate interpretable (and reportable) model predictions Produce probabilistic forecasts Evaluate forecasts from competing models with proper scoring rules --- ## More resources Vignette ⇨ [Overview of the package](https://nicholasjclark.github.io/mvgam/articles/mvgam_overview.html) Vignette ⇨ [Formatting data for use in `mvgam`](https://nicholasjclark.github.io/mvgam/articles/data_in_mvgam.html) Vignette ⇨ [Shared latent process models](https://nicholasjclark.github.io/mvgam/articles/shared_states.html) Vignette ⇨ [Time-varying effects](https://nicholasjclark.github.io/mvgam/articles/time_varying_effects.html) Vignette ⇨ [Multivariate State-Space models](https://nicholasjclark.github.io/mvgam/articles/trend_formulas.html) Motivating publication ⇨ Clark & Wells 2023 [*Methods in Ecology and Evolution*](https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.13974) --- class: inverse middle center big-subsection # Example --- class: animated fadeIn background-image: url('./resources/pp_image.jpg') background-size: cover --- class: animated fadeIn background-image: url('./resources/dm_image.png') background-size: cover --- class: animated fadeIn background-image: url('./resources/mouse_image.jpg') background-size: cover --- class: full-size ## Long-term rodent monitoring <img align="center" width="410" height="500" src="resources/portal_sampling.png" style="float: right; margin: 10px;"> Monthly trapping in Portal, AZ, from 1977 20 rodent species recorded Experimental evidence for interactions Both gradual and sudden regime transitions .emphasize[*What drives community dynamics?*] --- background-image: url('./resources/raw_series.jpg') background-size: contain --- background-image: url('./resources/model_definition.png') background-size: contain --- class: full-size ## Model components <img align="center" width="530" height="370" src="resources/crank.jpg" style="float: right; margin: 10px;"> .emphasize[*1. Multispecies temporal dynamics*] --- background-image: url('./resources/VAR.svg') background-size: contain ## VAR1 ⇨ Granger causality --- class: full-size ## Model components <img align="center" width="530" height="370" src="resources/crank.jpg" style="float: right; margin: 10px;"> 1. Multispecies temporal dynamics .emphasize[*2. Seasonal variation*] --- background-image: url('./resources/raw_acfs.jpg') background-size: contain --- background-image: url('./resources/dist_lag1.svg') background-size: contain --- background-image: url('./resources/dist_lag2.svg') background-size: contain --- class: full-size ## Model components <img align="center" width="530" height="370" src="resources/crank.jpg" style="float: right; margin: 10px;"> 1. Multispecies temporal dynamics 2. Seasonal variation .emphasize[*3. Vegetation associations*] --- background-image: url('./resources/vegetation.png') background-size: contain --- background-image: url('./resources/ndvi_hier.svg') background-size: contain --- background-image: url('./resources/krat_sketch.svg') background-size: contain ## What did we find? --- background-image: url('./resources/NDVI_contrasts.jpeg') background-size: contain --- background-image: url('./resources/krat_sketch.svg') background-size: contain ## What did we find? .emphasize[*1. Higher NDVI = more captures*] --- background-image: url('./resources/mintemp_conditionals.jpeg') background-size: contain --- background-image: url('./resources/krat_sketch.svg') background-size: contain ## What did we find? 1. Higher NDVI = more captures .emphasize[*2. Varying seasonal effects*] --- background-image: url('./resources/VAR_cors.jpeg') background-size: contain --- background-image: url('./resources/DM_imp_response.jpg') background-size: contain --- background-image: url('./resources/krat_sketch.svg') background-size: contain ## What did we find? 1. Higher NDVI = more captures 2. Varying seasonal effects .emphasize[*3. Complex dependencies*] --- background-image: url('./resources/all_fcs.jpeg') background-size: contain --- background-image: url('./resources/DM_OL_trends.jpeg') background-size: contain --- background-image: url('./resources/krat_sketch.svg') background-size: contain ## What did we find? 1. Higher NDVI = more captures 2. Varying seasonal effects 3. Complex dependencies .emphasize[*4. Improved forecasts*] --- class: inverse middle center big-subsection # Thank you. Questions?