недостаточное описание входных данных для отдельной модели маркировки-повторного захвата CJS в руководстве пользователя stan
РЕДАКТИРОВАТЬ Эта проблема, по-видимому, возникла из-за того, что у rstan нет актуального синтаксиса stan из-за ограничений, которые CRAN накладывает на обновления пакетов. Более свежий пакет rstan, по-видимому, доступен в репозитории mc-stan, но в нем еще нет двоичных файлов для самой последней версии R (4.3).
Я не уверен, к чему именно идет этот вопрос, но больше нигде не нашел ответа, так что вот.
Мне нужно научиться stan запускать некоторые модели повторного захвата маркировки CJS, и для этого я работаю по руководству пользователя stan . Коллективная модель Кормака-Джолли-Себера работает нормально и довольно проста с точки зрения входящих в нее данных, но мне действительно нужно, чтобы работала версия отдельного CJS. Проблема в том, что руководство очень плохо описывает данные, входящие в модель, и данные не предоставляются. В результате, когда я запускаю пример модели с реальными данными, он продолжает выдавать ошибки, которые указывают на то, что с входными данными что-то не так.
Вот блок данных, для которого требуется матрица истории захвата y из I строк и T столбцов:
data {
int<lower=2> T;
int<lower=0> I;
int<lower=0,upper=1> y[I, T];
}
Из параметров я знаю, что для этого также требуются векторы phi и p длиной T-1 и T соответственно.
parameters {
vector<lower=0,upper=1>[T-1] phi;
vector<lower=0,upper=1>[T] p;
}
На данный момент это соответствует коллективной модели CJS и не должно вызывать проблем. Я также включил значения T и I , поскольку они включены в блок данных. Итак, мои входные данные выглядят так (я использую rstan, так что это игрушечная версия того, как это выглядит в r):
history.array<-list(y=matrix(c(1,0,0,1,0,0,0,0,1,0,0,1,
0,0,0,0,1,1,0,1,1,0,0,1,
1,1,0,0,1,1,0,0,0,0,0,0,
1,1,0,0,1,0,0,1), nrow=11),
phi=rep(.5,4-1),
p=rep(.5,4),
T = as.integer(4),
I = as.integer(11))
А вот полный код стана из руководства (который я сохранил как «individual_CJS.stan»).
data {
int<lower=2> T;
int<lower=0> I;
int<lower=0, upper=1> y[I,T];
}
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)) {
int k;
k = size(y_i) - k_rev;
if (y_i[k])
return k;
}
return 0;
}
vector prob_uncaptured(int T, vector p, vector phi) {
vector[T] chi;
chi[T] = 1.0;
for (t in 1:(T - 1)) {
int t_curr;
int t_next;
t_curr = T - t;
t_next = t_curr + 1;
chi[t_curr] = (1 - phi[t_curr])
+ phi[t_curr]
* (1 - p[t_next])
* chi[t_next];
}
return chi;
}
}
transformed data {
int<lower=0,upper=T> first[I];
int<lower=0,upper=T> last[I];
vector<lower=0,upper=I>[T] n_captured;
for (i in 1:I)
first[i] = first_capture(y[i]);
for (i in 1:I)
last[i] = last_capture(y[i]);
n_captured = rep_vector(0, T);
for (t in 1:T)
for (i in 1:I)
if (y[i, t])
n_captured[t] = n_captured[t] + 1;
}
parameters {
vector<lower=0,upper=1>[T-1] phi;
vector<lower=0,upper=1>[T] p;
}
transformed parameters {
vector<lower=0,upper=1>[T] chi;
chi = prob_uncaptured(T,p,phi);
}
model {
for (i in 1:I) {
if (first[i] > 0) {
for (t in (first[i]+1):last[i]) {
1 ~ bernoulli(phi[t - 1]);
y[i, t] ~ bernoulli(p[t]);
}
1 ~ bernoulli(chi[last[i]]);
}
}
}
generated quantities {
real beta;
vector<lower=0>[T] pop;
beta = phi[T - 1] * p[T];
pop = n_captured ./ p;
pop[1] = -1;
}
Но когда я пытаюсь запустить программу с этими входными данными:
warmups <- 1000
total_iterations <- 2000
max_treedepth <- 10
n_chains <- 4
n_cores <- 4
adapt_delta <- 0.95
test_ind_CJS<-stan(
file = "individual_CJS.stan",
chains = n_chains,
warmup = warmups,
data = history.array,
iter = total_iterations,
cores = n_cores,
refresh = 250,
control = list(max_treedepth = max_treedepth,
adapt_delta = adapt_delta)
),
Я получаю эту ошибку:
PARSER FAILED TO PARSE INPUT COMPLETELY
STOPPED AT LINE 10:
functions {
int first_capture(int[] y_i) {
for (k in 1:size(y_i))
if (y_i[k])
return k;
return 0;
}.......*the rest of the stan code is printed here*.......
Error in stanc(file = file, model_code = model_code, model_name = model_name, :
failed to parse Stan model 'individual_CJS' due to the above error.
Кажется, этой функции first_capture что-то нужно, но я не могу понять, что именно. y_i не нужно вводить, если это всего лишь i- я строка матрицы y . Что мне здесь не хватает? заранее спасибо