Current state of the model - vvandermeersch/climategrowthshifts GitHub Wiki
1. Baseline growth
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| Global intercept |
mu_alpha |
Constant |
Global |
mu_alpha ~ normal(0, log(10)/2.32); |
| Stand intercepts |
alpha_stand |
Constant |
Stand |
sigma_alpha_stand ~ normal(0, log(10)/2.32); alpha_stand ~ normal(mu_alpha, sigma_alpha_stand); |
2. GP component for short-term trajectories (canopy dynamics, microenvironment etc.)
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| Length scale |
rho_short |
Constant |
Global (was Species before) |
rho_short ~ lognormal(log(2.5), 0.3); |
| Marginal variation |
log_gamma_short |
Constant |
Global (was Species before) |
log_gamma_short ~ normal(log(0.22), 0.58); |
3. GP component for long-term trajectories (allometry, etc.)
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| Length scale |
log_delta_rho |
Constant |
Species |
mu_log_delta_rho ~ normal(log(30), 0.5); sigma_log_delta_rho ~ normal(0, 0.5); log_delta_rho ~ normal(mu_log_delta_rho, sigma_log_delta_rho); rho_long = rho_short + exp(log_delta_rho); |
| Marginal variation |
log_gamma_long |
Constant |
Species |
mu_log_gamma_long ~ normal(log(0.42), 0.58); sigma_log_gamma_long ~ normal(0, 0.5); log_gamma_long ~ normal(mu_log_gamma_long, sigma_log_gamma_long); |
| Individual functional behavior |
f_ind |
GP |
Tree |
f_ind ~ multi_normal_cholesky(0, L_cov_ind[sp]); |
The two GPs are not marginalized (because of missing rings).
Each tree gets its own functional behavior, with a non-centered parametrization, i.e. something like:
f_tilde_ind ~ normal(0, 1);
array[N_species] matrix[N_all_years, N_all_years] L_cov_ind;
{
for(sp in 1:N_species){
matrix[N_all_years, N_all_years] cov_ind
= gp_exp_quad_cov(all_years, gamma_short, rho_short)
+ gp_exp_quad_cov(all_years, gamma_long[sp], rho_long[sp])
+ diag_matrix(rep_vector(1e-8, N_all_years));
L_cov_ind[sp] = cholesky_decompose(cov_ind);
}
}
f_ind = L_cov_ind[sp] * f_tilde_ind;
4. Climate regression
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| GDD slope |
beta_gdd |
Constant |
Species |
mu_beta_gdd ~ normal(0, log(1.3) / 2.57); sigma_beta_gdd ~ normal(0, log(1.3) / 2.57); beta_gdd ~ normal(mu_beta_gdd, sigma_beta_gdd); |
| Winter prec. slope |
beta_pre |
Constant |
Species |
mu_beta_pre ~ normal(0, log(1.3) / 2.57); sigma_beta_pre ~ normal(0, log(1.3) / 2.57); beta_pre ~ normal(mu_beta_pre, sigma_beta_pre); |
| VPD slope |
beta_vpd |
Constant |
Species |
mu_beta_vpd ~ normal(0, log(1.3) / 2.57); sigma_beta_vpd ~ normal(0, log(1.3) / 2.57); beta_vpd ~ normal(mu_beta_vpd, sigma_beta_vpd); |
| Climate regression |
... |
Linear combination |
Species x Stand (scale of climate) x Year |
beta_gdd[sp] * (gdd_obs[stand,year] - gdd0) + beta_pre[sp] * (pre_obs[stand,year] - pre0) + beta_vpd[sp] * (vpd_obs[stand,year] - vpd0) |
5. "Missing" mesoenvironment
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| Amplitude |
tau_clim |
Constant |
Global |
tau_clim ~ normal(0, log(2)/2.57); |
| Autoregressive parameter |
rho_clim |
Constant |
Global |
rho_prim_clim ~ beta(4, 2); rho_clim = rho_prim_clim*2-1; |
| Intercepts |
delta_clim |
Constant |
Stand x Years |
delta_clim[s][1] = 0; delta_clim[s][i] = rho_clim * delta_clim[s][i-1] + tau_clim * delta_tilde_clim[s][i-1]; |
| Species sensitivity |
kappa_clim |
Constant |
Species |
log_kappa_clim ~ normal(0, 0.3 / 2.57); kappa_clim = exp(log_kappa_clim); |
The stand x years intercepts are scaled by kappa_clim[sp], as some stands have several species that might not respond in a similar way to these variations. I also defined sum_to_zero_vector[N_species] log_kappa_clim; as a sum_to_zero vector, so the baseline is set to a virtual species of reference with kappa_clim = 1. Maybe it was a bad idea, and I could also pick one of the species of the dataset as a reference and set kappa_clim = 1 for this species (i.e. estimating only [N_species-1] log_kappa_clim;).
5. Idiosyncratic abrupt deviations (and missing rings)
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| Amplitude |
tau_idio |
Constant |
Global |
tau_idio ~ normal(0, log(5) / 2.57); |
| Simplex |
thetas_idio |
Constant |
Tree |
thetas_baseline = [100, 20, 1]'; omega_thetas = 10; alphas = thetas_baseline / omega_thetas + ones; thetas_idio[t] ~ dirichlet(alphas); |
thetas_idio[t][2] is the probability of an abrupt deviation ("idiosyncratic shock"), thetas_idio[t][3] is the probability of a missing ring ("idiosyncratic shutdown").
5. Concordant shocks (and shutdowns)
5.1. Stand-level extreme event
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| Baseline probability of stand-level event (intercept) |
logit_phi_sck |
Constant |
Stand |
mu_phi ~ normal(-2.17, 0.35); sigma_phi ~ normal(0, 0.7); logit_phi_sck ~ normal(mu_phi, sigma_phi); |
| VPD slope |
beta_phi_vpd |
Constant |
Global |
beta_phi_vpd ~ normal(0, 0.3); |
| Winter precipitation slope |
beta_phi_pre |
Constant |
Global |
beta_phi_pre ~ normal(0, 0.3); |
| Stand-level event probability |
phi_sck |
Linear combination |
Stand x Year |
phi_sck = inv_logit(mu_phi + logit_phi_sck[st] + beta_phi_vpd * (vpd_obs[stand,year] - vpd0) + beta_phi_pre * (pre_obs[stand,year] - pre0)); |
Oct. 8: I spotted a huge mistake.
mu_phi is applied both in logit_phi_sck ~ normal(mu_phi, sigma_phi); AND in phi_sck = inv_logit(mu_phi + ...)...
I will run the correct model again and finish this...
5.2. Tree-level concordant response
| Short description |
Name |
Mathematical form |
Domain |
Prior model |
| Shock amplitude |
tau_conc |
Constant |
Species |
mu_log_tau_conc ~ normal(log(1), 0.5); sigma_log_tau_conc ~ normal(0, 0.5); tau_conc ~ lognormal(mu_log_tau_conc, sigma_log_tau_conc); |
| Baseline concordance |
mu_omega_conc |
Constant |
Global |
mu_omega_conc ~ normal(-1.5, 0.28); |
| Species-level concordance |
alpha_omega_species |
Constant |
Species |
sigma_omega_species ~ normal(0, 0.45); alpha_omega_species ~ normal(0, sigma_omega_species); |
| Stand-level concordance |
alpha_omega_stand |
Constant |
Stand |
sigma_omega_stand ~ normal(0, 0.45); alpha_omega_stand ~ normal(0, sigma_omega_stand); |
| Probability of concordant response (given a stand-level event) |
omega_conc_sck |
Constant |
Stand x Species |
omega_conc_sck = inv_logit(mu_omega_conc + alpha_omega_species[sp] + alpha_omega_stand[st]); |