Что является более эффективным в Стэне? - PullRequest
2 голосов
/ 19 октября 2019

Более эффективно объявить преобразованный параметр в блоке преобразованных параметров или в блоке модели, если я не требую, чтобы преобразованный параметр возвращался на выходе.

Например,

data {
  real<lower=0> tt[N]; 
  ...
}
parameters {
  real <lower = 0> mu;
  real <lower = 0> eta;
  ...
}
transformed parameters{
  real Mu[N];
  for(i in 1:N){
    Mu[i] = eta + mu*log(tt[i]);
  }
  ...
}

По сравнению с

data {
  real<lower=0> tt[N]; 
  ...
}
parameters {
  real <lower = 0> mu;
  real <lower = 0> eta;
  ...
}
model{
  real Mu[N];
  for(i in 1:N){
    Mu[i] = eta + mu*log(tt[i]);
  }
  ...
}

Требуется ли больше времени выполнения, чтобы сохранить все значения Mu в первом блоке кода(когда я объявляю Mu в преобразованном блоке параметров)?

1 Ответ

3 голосов
/ 20 октября 2019

Эффективность (по времени) практически одинакова. Если вы объявляете что-то в блоках transformed parameters, обычно требуется небольшое количество времени для проверки ограничений, которые вы объявляете для каждого преобразованного параметра. По сути, единственная ситуация, в которой проверка ограничений заметна, - это когда вы формируете корреляционную матрицу или ковариационную матрицу, которая должна учитывать, чтобы убедиться, что она положительно определена. В приведенном вами примере Mu не ограничен, поэтому проверять нечего. Если вас не интересуют промежуточные параметры, имеет смысл объявить их в блоке model, и в этом случае вы сэкономите некоторую оперативную память (в RStan или PyStan), не сохраняя их все и, возможно, немного времениизбегая соответствующего ввода / вывода.

...