Код Rstan для простой многомерной линейной модели

Я пытаюсь использовать Rstan, чтобы соответствовать модели из примеров Байесовских идей и анализа данных Кристенсена, Джонсона, Бранскума и Хэнсона: Введение для ученых и статистиков. Авторы используют WinBUGS, поэтому необходима некоторая адаптация. Данные находятся здесь, а код WinBUGS скопирован в внизу этого поста. Это очень простая модель, но я полный новичок и не могу понять, как обойти полученную ошибку. Мой код Stan выглядит следующим образом:

data {
  int N_subjects;
  int N_items;
  matrix[N_subjects,N_items] y;
}

parameters {
  vector[N_items] mu;
  real<lower=0> sigma;
  real<lower=-1,upper=1> rho;
}

transformed parameters {
  cov_matrix[N_items] Sigma;
  for (j in 1:N_items)
    for (k in 1:N_items)
      Sigma[j,k] <- pow(sigma,2)*pow(rho,step(abs(j-k)-0.5));
}

model {
  sigma ~ uniform(0,100);
  rho ~ uniform(0,1);
  mu ~ multi_normal(0,100);
  for (i in 1:N_subjects)
    y[i] ~ multi_normal(mu,Sigma);
}

Парсер выдает следующую ошибку:

Error in stanc(file = file, model_code = model_code, model_name = model_name,  : 
  failed to parse Stan model 'model' with error message:
SYNTAX ERROR, MESSAGE(S) FROM PARSER:
no matches for function name="multi_normal_log"
    arg 0 type=vector
    arg 1 type=int
    arg 2 type=int
available function signatures for multi_normal_log:
0.  multi_normal_log(vector, vector, matrix) : real
1.  multi_normal_log(vector, row vector, matrix) : real
2.  multi_normal_log(row vector, vector, matrix) : real
3.  multi_normal_log(row vector, row vector, matrix) : real
4.  multi_normal_log(vector, vector[1], matrix) : real
5.  multi_normal_log(vector, row vector[1], matrix) : real
6.  multi_normal_log(row vector, vector[1], matrix) : real
7.  multi_normal_log(row vector, row vector[1], matrix) : real
8.  multi_normal_log(vector[1], vector, matrix) : real
9.  multi_normal_log(vector[1], row vector, matrix) : real
10.  multi_normal_log(row vector[1], vector, matrix) : real
11.  multi_normal_log(row vector[1], row vector, matrix) : real
12.  multi_normal_log(vector[1], vector

(Я думаю) Я понимаю, что синтаксический анализатор сообщает мне, что я пытаюсь передать несоответствующие типы данных функции multi_normal в блоке модели, но я не могу понять, откуда это происходит. Я подозреваю, что я что-то делаю неправильно, определяя ковариационную матрицу, но похоже, что несколько аргументов имеют неправильный тип данных ...

Код WinBUGS, на котором я моделирую свой код Стэна:

model{
for(i in 1:30){
for(j in 1:6){
logy[i,j] <- log(y[i,j])
}
}
for(i in 1:30){logy[i,1:6]~dmnorm(m[1:6],precision[1:6,1:6])}
for(j in 1:6){
for(k in 1:6){
covariance[j,k] <- sigma2*pow(rho, step(abs(j-k)-0.5))
}
}
for(i in 1:6){ m[i] <- mu }
precision[1:6,1:6] <- inverse(covariance[1:6,1:6])
sigma ~ dunif(0,100)
mu ~ dnorm(0,0.001)
L <- -1/(6-1)
rho ~ dunif(L,1)
sigma2 <- sigma*sigma
tau <- 1/sigma2
}

person psychometriko    schedule 05.04.2015    source источник


Ответы (1)


Ошибка исходит из

mu ~ multi_normal(0,100);

поскольку вы передаете вектор mu, целое число 0 и целое число 100. Я полагаю, вы хотите

mu ~ normal(0,100);

который рассматривает элементы mu как независимые и одинаково нормально распределенные со средним значением 0 и стандартным отклонением 100.

person jaradniemi    schedule 06.04.2015
comment
Ооо! Спасибо! Я знал, что это что-то настолько простое, что просто смотрел мимо него ... - person psychometriko; 06.04.2015