This vignette describes how to set manual priors on parameters with the coevolve package. It describes the default priors that are used by the package and how users can specify their own priors.
If the user does not explicitly declare any priors using the
prior argument in coev_fit(), then the model
will default to the following priors:
| Parameter label | Parameter description | Default prior | Constraint |
|---|---|---|---|
A_diag |
Autoregressive selection effects | std_normal() |
Negative |
A_offdiag |
Cross selection effects | std_normal() |
|
L_R |
Cholesky factor for drift matrix | lkj_corr_cholesky(4) |
|
Q_sigma |
Drift standard deviations | std_normal() |
Positive |
eta_anc |
Root ancestral states | std_normal() |
|
c |
Ordinal cutpoints | normal(0, 2) |
|
shape |
Shape parameters (gamma distribution) | gamma(0.01, 0.01) |
Positive |
sigma_dist |
Standard deviations for spatial GPs | exponential(1) |
Positive |
rho_dist |
Rho parameters for spatial GPs | exponential(5) |
Positive |
sigma_residual |
Residual standard deviations | exponential(1) |
Positive |
L_residual |
Cholesky factor for residual correlations | lkj_corr_cholesky(4) |
In addition, the default prior for phi (the
overdispersion parameter for the negative-binomial distribution) is
scaled automatically based on the variance of the data.
These default priors were chosen to be weakly regularising, which
improves model fitting and conservatism in parameter estimates. However,
we recommend that users assess the suitability of these default priors
by fitting the model with coev_fit(..., prior_only = TRUE)
and then plotting prior predictive checks for all variables using the
coev_plot_predictive_check() function.
When the package writes the underlying Stan code for the model, it sets these default priors in the model block. For example, we can extract the section of the Stan code that sets the priors from an example model:
# generate the stan code with default priors
stan_code_default <-
coev_make_stancode(
data = authority$data,
variables = list(
religious_authority = "ordered_logistic",
political_authority = "ordered_logistic"
),
id = "language",
tree = authority$phylogeny
)
# extract the priors section from the model block
cat(substr(stan_code_default, 8739, 9088)) // priors
b ~ std_normal();
for (t in 1:N_tree) {
eta_anc[t] ~ std_normal();
for (i in 1:(N_seg - 1)) z_drift[t, i] ~ std_normal();
to_vector(terminal_drift[t]) ~ std_normal();
}
A_offdiag ~ std_normal();
A_diag ~ std_normal();
Q_sigma ~ std_normal();
L_R ~ lkj_corr_cholesky(4);
c1 ~ normal(0, 2);
c2 ~ normal(0, 2);
If we wanted to set manual priors to replace some of these, we need
only declare our manual priors as Stan-readable strings using the
prior argument. This argument accepts a named list of
priors for the model:
# generate the stan code with manual priors
stan_code_manual <-
coev_make_stancode(
data = authority$data,
variables = list(
religious_authority = "ordered_logistic",
political_authority = "ordered_logistic"
),
id = "language",
tree = authority$phylogeny,
prior = list(
A_diag = "normal(0, 2.5)",
A_offdiag = "normal(0, 2.5)",
Q_sigma = "exponential(3)",
c = "normal(0, 3)"
)
)
# extract the priors section from the model block
cat(substr(stan_code_manual, 8739, 9093)) // priors
b ~ std_normal();
for (t in 1:N_tree) {
eta_anc[t] ~ std_normal();
for (i in 1:(N_seg - 1)) z_drift[t, i] ~ std_normal();
to_vector(terminal_drift[t]) ~ std_normal();
}
A_offdiag ~ normal(0, 2.5);
A_diag ~ normal(0, 2.5);
Q_sigma ~ exponential(3);
L_R ~ lkj_corr_cholesky(4);
c1 ~ normal(0, 3);
c2 ~ normal(0, 3);
We could fit the model with these manual priors by setting the same
prior argument when running the coev_fit()
function.
Because of the way the Stan code is written, priors are currently set
globally. For example, it is not possible to set one prior for one
cross-selection effect and a different prior for another cross-selection
effect. Users must set a global prior for all cross-selection effects by
setting prior = list(A_offdiag = ...). To set different
priors for different parameters, we recommend that users generate the
Stan code and modify it manually to suit their needs.