I think I’m missing something obvious here, but it appears that my initial values are being ignored. I’m trying to initialize a nonlinear state space model where the state (biomass) must be positive. On the scale of depletion P_t (fraction of carrying capacity K), with catch C_t the system evolves as
\tilde{P}_t = P_{t-1} + r P_{t-1} (1 - P_{t-1}) - C_t / K,\quad t = 2,\dots,23
P_t \sim \operatorname{log\ Normal}(\log(\tilde{P}_t), \sigma^2)
I’ve declared the state variables P_t to be positive, but the median prediction \tilde{P}_t can go negative depending on the previous state, growth rate, carrying capacity, and catch (passed as data) values. Rather than setting \tilde{P}_t to some small positive number, I’d like to fit it by rejecting parameter values that give these predictions. We know a priori that this population does not go extinct, so these values are not possible. I understand that this violates the Reference Manual warning that “Rejection is not for constraints”, but given the nonlinear multiparametric nature of these constraints, I’m not sure there’s a better way.
This obviously requires carefully setting initial values. Using fits where I did set \tilde{F}_t to a small number if it went negative, I have plenty of reasonable starting values. For simplicity, here I just try to set them to the rough means of each parameter. Following the examples in the stan
help file, I defined
init_fn <- function() {
list(r = 0.3,
K = 250,
q = 0.28,
sigma2 = 0.0015,
tau2 = 0.02,
P = seq(1, 0.35, length.out = 22))
}
When I pass either of these to the stan
function I get
> fit <- stan("src/models_reject/01_centered.stan", data = tuna_data, chains = 1, init = init_fn)
SAMPLING FOR MODEL '01_centered' NOW (CHAIN 1).
Chain 1: Rejecting initial value:
Chain 1: Error evaluating the log probability at the initial value.
Chain 1: Exception: Negative depletion, P_med[2] = -4.58502 P[t - 1] = 0.756282 r = 3.39455 K = 2.66466 (in 'model66024d7dfcb6_01_centered' at line 28)
.
.
.
Chain 1:
Chain 1: Initialization between (-2, 2) failed after 100 attempts.
Chain 1: Try specifying initial values, reducing ranges of constrained values, or reparameterizing the model.
[1] "Error in sampler$call_sampler(args_list[[i]]) : Initialization failed."
error occurred during calling the sampler; sampling not done
Which appears that it’s using init = "random"
rather than the values from my passed function. The practical problem here is that K is on the order of 200, so init = "random"
gives values that are far too small, and result in infeasible values for \tilde{P}_t. A workaround is to declare K_scaled
as a parameter, then K = K * 200
as a transformed parameter
(I can get this to sample), but I’d prefer to get the initial values to pass correctly.
I’ve attached a (slightly) simplified copy of my model and an R script that reproduces this behavior.
example.R (1.0 KB)
example.stan (1.7 KB)
Is there some reason that the stan
function would ignore my init
s?