Что эквивалентно R-функции rep (x, each = n) в Stan? - PullRequest
1 голос
/ 23 марта 2020

В своем коде Stan я хочу добавить ICAR-термин (phi) в следующую ковариатическую модель:

// covariate models with logit link
  vector[total_surveys] logit_p = (X_p * beta_p) + phi[ii_sampled]; 

Однако dim(X_p) = (1900, 3) и dim(beta_p) = 3

Таким образом dim(X_p * beta_p = 1900

В то время как dim(phi[ii_sampled]) равно 95

Поэтому я бы хотел do:

phi_p <- rep(phi[ii_sampled], each = 20)

По сути, моя проблема сводится к выполнению (пример с разными размерами):

phi <- c(1.2, -0.5, 2.1, -0.7)
phi_p <- rep(phi, each = 3)

phi_p
>(1.2, 1.2, 1.2, -0.5, -0.5, -0.5, 2.1, 2.1, 2.1, -0.7, -0.7, -0.7)

в Stan

К сожалению, rep() функция недоступна в Стэн. Вместо этого вы должны будете сделать al oop.

Как бы выглядел такой al oop?

1 Ответ

1 голос
/ 24 марта 2020

Следующее является простым и эффективным в Stan, поскольку циклы в Stan компилируются в эффективные циклы C ++. Это можно сделать короче, но это будет менее эффективно и, вероятно, менее понятно.

functions {
  vector rep_each(vector x, int K) {
    int N = rows(x);
    vector[N * K] y;
    int pos = 1;
    for (n in 1:N) {
      for (k in 1:K) {
        y[pos] = x[n];
        pos += 1;
      }
    }
    return y;
  }
}
transformed data {
  print("rep_each([1, 10, 100]', 4) = ",
        rep_each([1, 10, 100]', 4));
}

Запуск этой печати

rep_each([1, 10, 100]', 4) = [1,1,1,1,10,10,10,10,100,100,100,100]
...