The collapse of environmental predictability erodes reproductive success in a tropical seabird
  • GitHub
  • References
  1. Main analysis
  2. S5. Full model summaries
  • Phenological mismatch in the Blue-footed Booby
  • Main analysis
    • S1. Chlorophyll-a bloom detection
    • S2. Phenological mismatch
    • S3. Model fitting workflow
    • S4. Model diagnostics and selection
    • S5. Full model summaries
  • Appendices
    • Sensitivity analyses: Bloom onset thresholds
    • Code for figures

Table of contents

  • S5.1 Bloom timing
  • S5.2 Best-supported individual-based models
  • Reproducibility
  • View source
  • Report an issue
  1. Main analysis
  2. S5. Full model summaries

S5. Full model summaries

Posterior summaries for best-supported models

This chapter reports full posterior summaries for the best-supported models from the primary analyses. These outputs are provided as a transparent record of model structure, parameter estimates, uncertainty, and sampling diagnostics for the models retained after model comparison.

NoteVariable definition
  • X5MISMATCH: Phenological mismatch calculated using the 5% bloom threshold (days).

  • CLUTCH_SIZE: Number of eggs laid in a nest (ordinal).

  • FLEDS: Number of chicks successfully fledged (ordinal).

  • TIME: Chronological time (calendar year), centered by subtracting the mean year.

  • ZX5MISMATCH: Centered phenological mismatch (5% threshold).

  • AGE: Age of the focal individual (years), centered.

  • AFR: Age at first reproduction (years), centered.

  • LONGEVITY: Age at last observation (proxy for lifespan; years), centered.

  • YEAR: Calendar year of the observation (factor).

  • RING: Individual identifier (factor).

Best-supported models for phenological mismatch and number of fledglings were selected using leave-one-out cross-validation (LOO-CV; see S4). The summaries below are shown in full to document posterior estimates, group-level variation, and sampling diagnostics for the final supported models.

S5.1 Bloom timing

The bloom timing analysis was based on a Gaussian location–scale model for bloom onset estimated at the 5% threshold.

# Load the model
model_bloom <- readRDS(here::here("..","Rdata", "model_delta5.rds"))

# Print the full model summary
print(summary(model_bloom),digits = 4)
 Family: gaussian 
  Links: mu = identity; sigma = log 
Formula: delta5 ~ 1 + TIME 
         sigma ~ 1 + TIME
   Data: data (Number of observations: 21) 
  Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
         total post-warmup draws = 16000

Regression Coefficients:
                Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
Intercept         6.9011    3.2695   0.9788  13.7707 1.0010     6118     7692
sigma_Intercept   2.5968    0.1732   2.2825   2.9614 1.0002     7678     8641
TIME              0.5324    0.4735  -0.3822   1.4697 1.0011     5927     8014
sigma_TIME        0.1145    0.0347   0.0483   0.1849 1.0010     7058     7653

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

S5.2 Best-supported individual-based models

The following summaries correspond to the best-supported individual-based models for phenological mismatch and fledging success, shown separately for females and males.

  • Females
  • Males
  • Phenological Mismatch
  • Number of Fledglings
# Load the model
model_pm_female_best <- readRDS(here::here("..","Rdata", "female_fit_m11.rds"))

# Print the full model summary
print(summary(model_pm_female_best),digits=4)
 Family: gaussian 
  Links: mu = identity; sigma = log 
Formula: X5MISMATCH ~ AGE + I(AGE^2) + TIME + AFR + LONGEVITY + (1 + AGE | q | RING) + (1 | YEAR) 
         sigma ~ 1 + AGE + I(AGE^2) + TIME + (1 | q | RING)
   Data: data (Number of observations: 8378) 
  Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
         total post-warmup draws = 16000

Multilevel Hyperparameters:
~RING (Number of levels: 2581) 
                               Estimate Est.Error l-95% CI u-95% CI   Rhat
sd(Intercept)                   10.0431    0.6118   8.8390  11.2487 1.0028
sd(AGE)                          1.0681    0.1958   0.6794   1.4406 1.0019
sd(sigma_Intercept)              0.4156    0.0157   0.3853   0.4470 1.0002
cor(Intercept,AGE)               0.4547    0.1420   0.1808   0.7295 1.0066
cor(Intercept,sigma_Intercept)   0.8059    0.0460   0.7110   0.8913 1.0063
cor(AGE,sigma_Intercept)         0.0456    0.1281  -0.1986   0.3058 1.0044
                               Bulk_ESS Tail_ESS
sd(Intercept)                      2048     4410
sd(AGE)                            1295     4164
sd(sigma_Intercept)                4479     7870
cor(Intercept,AGE)                  732     2803
cor(Intercept,sigma_Intercept)     1022     2150
cor(AGE,sigma_Intercept)           3086     5501

~YEAR (Number of levels: 21) 
              Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
sd(Intercept)  46.6221    8.1437  34.0081  65.5280 1.0002     3842     6762

Regression Coefficients:
                Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
Intercept        48.4414   10.5394  27.9738  69.8830 1.0035     2078     3999
sigma_Intercept   3.2609    0.0170   3.2274   3.2942 1.0004     5891    11106
AGE              -0.9421    0.1394  -1.2167  -0.6665 1.0005     9839    11736
IAGEE2            0.3342    0.0222   0.2916   0.3775 1.0002    11910    12036
TIME             -1.9677    1.7148  -5.3674   1.3996 1.0004     2503     4662
AFR               1.1357    0.2533   0.6447   1.6369 1.0002    12633    13126
LONGEVITY        -0.1536    0.1063  -0.3592   0.0561 1.0000    10312    11779
sigma_AGE        -0.0133    0.0034  -0.0200  -0.0067 1.0001     7905    11815
sigma_IAGEE2      0.0031    0.0006   0.0019   0.0043 1.0004    13297    13077
sigma_TIME        0.0232    0.0025   0.0183   0.0280 1.0000     7132    12347

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
# Load the model
model_fs_female_best <- readRDS(here::here("..","Rdata", "female_fit_Q17.rds"))

# Print the full model summary
print(summary(model_fs_female_best), digits =4)
 Family: cumulative 
  Links: mu = probit; disc = log 
Formula: FLEDS ~ ZX5MISMATCH + I(ZX5MISMATCH^2) + TIME + AGE + I(AGE^2) + AFR + LONGEVITY + (1 | q | RING) + (1 | YEAR) 
         disc ~ 1 + ZX5MISMATCH + AGE + TIME + (1 | q | RING)
   Data: data (Number of observations: 8378) 
  Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
         total post-warmup draws = 16000

Multilevel Hyperparameters:
~RING (Number of levels: 2581) 
                              Estimate Est.Error l-95% CI u-95% CI   Rhat
sd(Intercept)                   1.8909    0.8119   0.7784   3.8606 1.0012
sd(disc_Intercept)              0.0860    0.0325   0.0165   0.1460 1.0024
cor(Intercept,disc_Intercept)  -0.6603    0.2868  -0.9876   0.0525 1.0014
                              Bulk_ESS Tail_ESS
sd(Intercept)                     1647     2035
sd(disc_Intercept)                1729     1961
cor(Intercept,disc_Intercept)     2267     3587

~YEAR (Number of levels: 21) 
              Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
sd(Intercept)   5.1440    2.2301   2.1279  10.7479 1.0008     1839     2272

Regression Coefficients:
                 Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
Intercept[1]      -3.9201    1.9162  -8.5121  -1.1799 1.0004     1795     2400
Intercept[2]       6.0271    2.9720   2.1222  13.5084 1.0014     1690     2314
Intercept[3]      18.3228    7.9706   7.6417  37.7938 1.0011     1616     1993
disc_Intercept    -1.8928    0.3997  -2.6801  -1.1180 1.0010     1600     1881
ZX5MISMATCH       -0.1842    0.0776  -0.3742  -0.0780 1.0009     1605     1889
IZX5MISMATCHE2    -0.0003    0.0002  -0.0007  -0.0001 1.0007     2072     2858
TIME              -0.4192    0.2657  -1.0733  -0.0349 1.0006     1933     2605
AGE                0.3663    0.1598   0.1507   0.7599 1.0010     1702     2025
IAGEE2            -0.0759    0.0326  -0.1567  -0.0317 1.0010     1657     1977
AFR               -0.3755    0.1778  -0.8172  -0.1373 1.0007     1941     2383
LONGEVITY          0.0163    0.0366  -0.0516   0.0985 1.0001    11067     5787
disc_ZX5MISMATCH  -0.0012    0.0005  -0.0021  -0.0002 1.0008     5392    10707
disc_AGE          -0.0015    0.0034  -0.0082   0.0051 1.0000    19878    13181
disc_TIME         -0.0151    0.0027  -0.0203  -0.0099 1.0006    14019    12049

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
  • Phenological Mismatch
  • Number of Fledglings
# Load the model
model_pm_male_best <- readRDS(here::here("..","Rdata", "male_fit_m11.rds"))

# Print the full model summary
print(summary(model_pm_male_best),digits=4)
 Family: gaussian 
  Links: mu = identity; sigma = log 
Formula: X5MISMATCH ~ AGE + I(AGE^2) + TIME + AFR + LONGEVITY + (1 + AGE | q | RING) + (1 | YEAR) 
         sigma ~ 1 + AGE + I(AGE^2) + TIME + (1 | q | RING)
   Data: data (Number of observations: 8962) 
  Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
         total post-warmup draws = 16000

Multilevel Hyperparameters:
~RING (Number of levels: 2910) 
                               Estimate Est.Error l-95% CI u-95% CI   Rhat
sd(Intercept)                    7.4408    0.5209   6.4101   8.4544 1.0026
sd(AGE)                          1.0790    0.2090   0.6591   1.4731 1.0028
sd(sigma_Intercept)              0.4231    0.0158   0.3923   0.4538 1.0005
cor(Intercept,AGE)               0.5223    0.1317   0.2506   0.7592 1.0053
cor(Intercept,sigma_Intercept)   0.7723    0.0512   0.6702   0.8704 1.0068
cor(AGE,sigma_Intercept)         0.0106    0.1266  -0.2296   0.2629 1.0020
                               Bulk_ESS Tail_ESS
sd(Intercept)                      2865     5959
sd(AGE)                            2062     2125
sd(sigma_Intercept)                4431     8434
cor(Intercept,AGE)                  959     2665
cor(Intercept,sigma_Intercept)      758     1470
cor(AGE,sigma_Intercept)           2799     3118

~YEAR (Number of levels: 21) 
              Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
sd(Intercept)  46.8384    8.0174  34.1769  65.9187 1.0009     3412     6100

Regression Coefficients:
                Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
Intercept        50.7086   10.2537  30.1020  70.6948 1.0014     2287     4094
sigma_Intercept   3.3046    0.0162   3.2729   3.3362 1.0006     7660    11383
AGE              -1.0962    0.1399  -1.3699  -0.8238 1.0001    14066    12628
IAGEE2            0.2832    0.0248   0.2354   0.3323 1.0003    13293    12808
TIME             -1.8333    1.6934  -5.1376   1.4567 1.0004     2970     4887
AFR               0.7859    0.2415   0.3073   1.2551 1.0001    13462    12476
LONGEVITY        -0.0411    0.1003  -0.2409   0.1529 1.0000    14682    12481
sigma_AGE        -0.0127    0.0035  -0.0195  -0.0058 1.0005     9578    12187
sigma_IAGEE2      0.0045    0.0006   0.0033   0.0058 1.0000    13334    12867
sigma_TIME        0.0279    0.0024   0.0232   0.0326 1.0002    13678    12881

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
# Load the model
model_fs_male_best <- readRDS(here::here("..","Rdata", "male_fit_Q17.rds"))

# Print the full model summary
print(summary(model_fs_male_best),digits=4)
 Family: cumulative 
  Links: mu = probit; disc = log 
Formula: FLEDS ~ ZX5MISMATCH + I(ZX5MISMATCH^2) + TIME + AGE + I(AGE^2) + AFR + LONGEVITY + (1 | q | RING) + (1 | YEAR) 
         disc ~ 1 + ZX5MISMATCH + AGE + TIME + (1 | q | RING)
   Data: data (Number of observations: 8962) 
  Draws: 4 chains, each with iter = 6000; warmup = 2000; thin = 1;
         total post-warmup draws = 16000

Multilevel Hyperparameters:
~RING (Number of levels: 2910) 
                              Estimate Est.Error l-95% CI u-95% CI   Rhat
sd(Intercept)                   2.0334    0.9083   0.8077   4.2718 1.0033
sd(disc_Intercept)              0.0651    0.0284   0.0080   0.1191 1.0020
cor(Intercept,disc_Intercept)  -0.7416    0.2748  -0.9920   0.0242 1.0019
                              Bulk_ESS Tail_ESS
sd(Intercept)                     1116     1269
sd(disc_Intercept)                1836     2020
cor(Intercept,disc_Intercept)     2919     3606

~YEAR (Number of levels: 21) 
              Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
sd(Intercept)   5.2764    2.3821   2.0527  11.1960 1.0023     1212     1488

Regression Coefficients:
                 Estimate Est.Error l-95% CI u-95% CI   Rhat Bulk_ESS Tail_ESS
Intercept[1]      -2.4703    1.5113  -6.0732  -0.2258 1.0036     1388     2413
Intercept[2]       7.8816    3.8238   2.8906  17.6050 1.0031     1151     1266
Intercept[3]      20.8332    9.3814   8.3437  44.4817 1.0033     1093     1188
disc_Intercept    -1.9580    0.4162  -2.7811  -1.1422 1.0036     1064     1191
ZX5MISMATCH       -0.1936    0.0849  -0.4059  -0.0779 1.0035     1066     1218
IZX5MISMATCHE2    -0.0002    0.0001  -0.0005  -0.0000 1.0019     1992     2168
TIME              -0.4833    0.3031  -1.2461  -0.0663 1.0011     1356     1663
AGE                0.1714    0.0909   0.0542   0.4018 1.0032     1365     1472
IAGEE2            -0.0399    0.0191  -0.0883  -0.0148 1.0030     1225     1343
AFR               -0.2441    0.1363  -0.5861  -0.0618 1.0021     1567     1529
LONGEVITY          0.0267    0.0413  -0.0477   0.1181 1.0005     7158     5030
disc_ZX5MISMATCH  -0.0012    0.0005  -0.0021  -0.0003 1.0001     5149    10678
disc_AGE           0.0025    0.0035  -0.0043   0.0091 1.0004    19611    12319
disc_TIME         -0.0164    0.0025  -0.0215  -0.0115 1.0001    12064    11356

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

Reproducibility

TipSession information
R version 4.5.2 (2025-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26200)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=English_Guernsey.utf8  LC_CTYPE=English_Guernsey.utf8   
[3] LC_MONETARY=English_Guernsey.utf8 LC_NUMERIC=C                     
[5] LC_TIME=English_Guernsey.utf8    

time zone: America/Edmonton
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] brms_2.23.0 Rcpp_1.1.1  here_1.0.2 

loaded via a namespace (and not attached):
 [1] gtable_0.3.6          tensorA_0.36.2.1      QuickJSR_1.9.0       
 [4] xfun_0.56             ggplot2_4.0.1         htmlwidgets_1.6.4    
 [7] processx_3.8.6        inline_0.3.21         lattice_0.22-7       
[10] vctrs_0.7.1           tools_4.5.2           ps_1.9.1             
[13] generics_0.1.4        stats4_4.5.2          parallel_4.5.2       
[16] sandwich_3.1-1        tibble_3.3.1          pacman_0.5.1         
[19] cmdstanr_0.9.0.9000   pkgconfig_2.0.3       Matrix_1.7-4         
[22] checkmate_2.3.3       RColorBrewer_1.1-3    S7_0.2.1             
[25] distributional_0.6.0  RcppParallel_5.1.11-1 lifecycle_1.0.5      
[28] compiler_4.5.2        farver_2.1.2          stringr_1.6.0        
[31] Brobdingnag_1.2-9     codetools_0.2-20      htmltools_0.5.9      
[34] bayesplot_1.15.0      yaml_2.3.12           pillar_1.11.1        
[37] MASS_7.3-65           StanHeaders_2.32.10   bridgesampling_1.2-1 
[40] abind_1.4-8           multcomp_1.4-29       nlme_3.1-168         
[43] posterior_1.6.1       rstan_2.32.7          tidyselect_1.2.1     
[46] digest_0.6.39         mvtnorm_1.3-3         stringi_1.8.7        
[49] reshape2_1.4.5        dplyr_1.1.4           splines_4.5.2        
[52] rprojroot_2.1.1       fastmap_1.2.0         grid_4.5.2           
[55] cli_3.6.5             magrittr_2.0.4        loo_2.9.0            
[58] pkgbuild_1.4.8        survival_3.8-6        TH.data_1.1-5        
[61] scales_1.4.0          backports_1.5.0       estimability_1.5.1   
[64] rmarkdown_2.30        matrixStats_1.5.0     emmeans_2.0.1        
[67] otel_0.2.0            gridExtra_2.3         zoo_1.8-15           
[70] coda_0.19-4.1         evaluate_1.0.5        knitr_1.51           
[73] rstantools_2.6.0      rlang_1.1.7           xtable_1.8-4         
[76] glue_1.8.0            rstudioapi_0.18.0     jsonlite_2.0.0       
[79] plyr_1.8.9            R6_2.6.1             
S4. Model diagnostics and selection
Sensitivity analyses: Bloom onset thresholds
Source Code
---
title: "S5. Full model summaries"
subtitle: "Posterior summaries for best-supported models"
unnumbered: true
toc: true
toc-depth: 2
---

::: lead
This chapter reports full posterior summaries for the best-supported models from the primary analyses. These outputs are provided as a transparent record of model structure, parameter estimates, uncertainty, and sampling diagnostics for the models retained after model comparison.
:::

```{r}
#| label: setup-final-summaries
#| include: false

# Load libraries needed for this chapter
pacman::p_load(here, brms)
```

::: {.callout-note title="Variable definition"}
-   `X5MISMATCH`: Phenological mismatch calculated using the 5% bloom threshold (days).

-   `CLUTCH_SIZE`: Number of eggs laid in a nest (ordinal).

-   `FLEDS`: Number of chicks successfully fledged (ordinal).

-   `TIME`: Chronological time (calendar year), centered by subtracting the mean year.

-   `ZX5MISMATCH`: Centered phenological mismatch (5% threshold).

-   `AGE`: Age of the focal individual (years), centered.

-   `AFR`: Age at first reproduction (years), centered.

-   `LONGEVITY`: Age at last observation (proxy for lifespan; years), centered.

-   `YEAR`: Calendar year of the observation (factor).

-   `RING`: Individual identifier (factor).
:::

Best-supported models for phenological mismatch and number of fledglings were selected using leave-one-out cross-validation (LOO-CV; see S4). The summaries below are shown in full to document posterior estimates, group-level variation, and sampling diagnostics for the final supported models.

## S5.1 Bloom timing

The bloom timing analysis was based on a Gaussian location–scale model for bloom onset estimated at the 5% threshold.

```{r}
#| label: summary-bloom
#| eval: true
#| size: "footnotesize"


# Load the model
model_bloom <- readRDS(here::here("..","Rdata", "model_delta5.rds"))

# Print the full model summary
print(summary(model_bloom),digits = 4)

```

## S5.2 Best-supported individual-based models

The following summaries correspond to the best-supported individual-based models for phenological mismatch and fledging success, shown separately for females and males. 


::::: panel-tabset 

## Females

::: panel-tabset
## Phenological Mismatch

```{r}
#| label: summary-pm-female-final
#| eval: true
#| size: "footnotesize"


# Load the model
model_pm_female_best <- readRDS(here::here("..","Rdata", "female_fit_m11.rds"))

# Print the full model summary
print(summary(model_pm_female_best),digits=4)

```

## Number of Fledglings

```{r}
#| label: summary-fs-female-final
#| eval: true
#| size: "footnotesize"


# Load the model
model_fs_female_best <- readRDS(here::here("..","Rdata", "female_fit_Q17.rds"))

# Print the full model summary
print(summary(model_fs_female_best), digits =4)
```
:::

## Males

::: panel-tabset
## Phenological Mismatch

```{r}
#| label: summary-pm-male-final
#| eval: true
#| size: "footnotesize"


# Load the model
model_pm_male_best <- readRDS(here::here("..","Rdata", "male_fit_m11.rds"))

# Print the full model summary
print(summary(model_pm_male_best),digits=4)
```

## Number of Fledglings

```{r}
#| label: summary-fs-male-final
#| eval: true
#| size: "footnotesize"


# Load the model
model_fs_male_best <- readRDS(here::here("..","Rdata", "male_fit_Q17.rds"))

# Print the full model summary
print(summary(model_fs_male_best),digits=4)
```
:::
:::::
## Reproducibility

::: {.callout-tip appearance="simple" icon="false"} 

## Session information

```{r}
#| echo: false
#| warning: false
#| message: false
utils::sessionInfo()
```

:::
  • View source
  • Report an issue