Dear All,
I am new to Stan and I am using the RStan models from Kéry and Schaub 2012 as kindly provided by Hiroki Itô. I am currently using a time-varying CJS model, and would like to adjust my quarterly (3 month) survival estimates to account for an uneven sampling event of 2 months followed by a period of 4 months.
I think I want to estimate a monthly survival, which can then be multiplied to calculate survival for the 2 month and 4 month periods.
phi_month = exp(log(3_month_phi)/3)
phi_2_months = phi_month^2
phi_4_months = phi_month^4
There are also a few incidences of missed sampling.
The unaltered model.
functions {
int first_capture(int[] y_i) {
for (k in 1:size(y_i))
if (y_i[k])
return k;
return 0;
}
int last_capture(int[] y_i) {
for (k_rev in 0:(size(y_i) - 1)) {
// Compoud declaration was enabled in Stan 2.13
int k = size(y_i) - k_rev;
// int k;
// k = size(y_i) - k_rev;
if (y_i[k])
return k;
}
return 0;
}
matrix prob_uncaptured(int nind, int n_occasions,
matrix p, matrix phi) {
matrix[nind, n_occasions] chi;
for (i in 1:nind) {
chi[i, n_occasions] = 1.0;
for (t in 1:(n_occasions - 1)) {
// Compoud declaration was enabled in Stan 2.13
int t_curr = n_occasions - t;
int t_next = t_curr + 1;
/*
int t_curr;
int t_next;
t_curr = n_occasions - t;
t_next = t_curr + 1;
*/
chi[i, t_curr] = (1 - phi[i, t_curr])
+ phi[i, t_curr] * (1 - p[i, t_next - 1]) * chi[i, t_next];
}
}
return chi;
}
}
data {
int<lower=0> nind; // Number of individuals
int<lower=2> n_occasions; // Number of capture occasions
int<lower=0,upper=1> y[nind, n_occasions];
int<lower=0,upper=1> p_deploy[24];
}
transformed data {
int n_occ_minus_1;
// Compoud declaration is enabled in Stan 2.13
// int n_occ_minus_1 = n_occasions - 1;
int<lower=0,upper=n_occasions> first[nind];
int<lower=0,upper=n_occasions> last[nind];
n_occ_minus_1 = n_occasions - 1;
for (i in 1:nind)
first[i] = first_capture(y[i]);
for (i in 1:nind)
last[i] = last_capture(y[i]);
}
parameters {
vector<lower=0,upper=1> [n_occ_minus_1] alpha; // Mean survival
vector<lower=0,upper=1>[n_occ_minus_1] beta; // Mean recapture
}
transformed parameters {
matrix<lower=0,upper=1>[nind, n_occ_minus_1] phi;
matrix<lower=0,upper=1>[nind, n_occ_minus_1] p;
matrix<lower=0,upper=1>[nind, n_occasions] chi;
// Constraints
for (i in 1:nind) {
for (t in 1:(first[i] - 1)) {
phi[i, t] = 0;
p[i, t] = 0;
}
for (t in first[i]:n_occ_minus_1) {
phi[i, t] = alpha[t];
p[i, t] = beta[t];
}
}
chi = prob_uncaptured(nind, n_occasions, p, phi);
}
model {
// Priors
// Uniform priors are implicitly defined.
// alpha ~ uniform(0, 1);
// beta ~ uniform(0, 1);
// Likelihood
for (i in 1:nind) {
if (first[i] > 0) {
for (t in (first[i] + 1):last[i]){
1 ~ bernoulli(phi[i, t - 1]);
y[i, t] ~ bernoulli(p[i, t - 1]);
}
1 ~ bernoulli(chi[i, last[i]]);
}
}
}
generated quantities{
vector[nind] log_lik;
for (i in 1:nind) {
log_lik[i] = 0;
if (first[i] > 0) {
for (t in (first[i] + 1):last[i]) {
log_lik[i] = log_lik[i] + bernoulli_lpmf(1|phi[i, t - 1]);
log_lik[i] = log_lik[i] + bernoulli_lpmf(y[i, t]|p[i, t - 1]);
}
log_lik[i] = log_lik[i] + bernoulli_lpmf(1|chi[i, last[i]]);
}
}
}
I’m uncertain of my solution which is to include a line in the constraints, something like…
// Constraints
for (i in 1:nind) {
for (t in 1:(first[i] - 1)) {
phi[i, t] = 0;
p[i, t] = 0;
}
for (t in first[i]:n_occ_minus_1) {
phi[i, t] = exp(phi_int[t]*(log(alpha[t])/3)); // phi_int[i, t] is a vector of time intervals e.g. 3,3,3,2,4,3,,,
p[i, t] = beta[t]*p_deploy[t]; // p_deploy is a vector of 1s and 0s as there is some missed sampling
}
}
Any help forum members could offer that would help me clarify my thinking on this would be very much appreciated.