недостаточное описание входных данных для отдельной модели маркировки-повторного захвата 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 . Что мне здесь не хватает? заранее спасибо

0 ответов

Другие вопросы по тегам