Заказанная оценка пробита в стандарте

Я пытаюсь воспроизвести упорядоченную пробит-модель JAGS из книги Джона Крушке «Проведение байесовского анализа» (стр. 676) в Стэне:

Модель JAGS:

model {
    for ( i in 1:Ntotal ) {
      y[i] ~ dcat( pr[i,1:nYlevels] )
      pr[i,1] <- pnorm( thresh[1] , mu , 1/sigma^2 )
      for ( k in 2:(nYlevels-1) ) {
        pr[i,k] <- max( 0 ,  pnorm( thresh[ k ] , mu , 1/sigma^2 )
                           - pnorm( thresh[k-1] , mu , 1/sigma^2 ) )
      }
      pr[i,nYlevels] <- 1 - pnorm( thresh[nYlevels-1] , mu , 1/sigma^2 )
    }
    mu ~ dnorm( (1+nYlevels)/2 , 1/(nYlevels)^2 )
    sigma ~ dunif( nYlevels/1000 , nYlevels*10 )
    for ( k in 2:(nYlevels-2) ) {  # 1 and nYlevels-1 are fixed, not stochastic
      thresh[k] ~ dnorm( k+0.5 , 1/2^2 )
    }
  }

Пока что у меня есть следующее, которое работает, но не дает тех же результатов, что и в книге. Стандартная модель:

data{
  int<lower=1> n; // number of obs
  int<lower=3> n_levels; // number of categories

  int y[n]; // outcome var 
}

parameters{
  real mu; // latent mean
  real<lower=0> sigma; // latent sd
  ordered[n_levels] thresh; // thresholds

}

model{
  vector[n_levels] pr[n];

  mu ~ normal( (1+n_levels)/2 , 1/(n_levels)^2 );
  sigma ~ uniform( n_levels/1000 , n_levels*10 );


  for ( k in 2:(n_levels-2) ) // 1 and nYlevels-1 are fixed, not stochastic
    thresh[k] ~ normal( k+0.5 , 1/2^2 );

  for(i in 1:n) {

    pr[i, 1] = normal_cdf(thresh[1], mu, 1/sigma^2);

    for (k in 2:(n_levels-1)) {
      pr[i, k] = max([0.0, normal_cdf(thresh[k], mu, 1/sigma^2) - normal_cdf(thresh[k-1], mu, 1/sigma^2)]);
    }

    pr[i, n_levels] = 1 - normal_cdf(thresh[n_levels - 1], mu, 1/sigma^2);

    y[i] ~ categorical(pr[i, 1:n_levels]);
  }

}

Данные здесь:

list(n = 100L, n_levels = 7, y = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 7L))

Должно восстановиться mu 1.0 и sigma 2.5. Вместо этого я получаю mu из 3,98 и sigma из 1,25.

Я уверен, что делаю что-то не так в модели Стэна, но я новичок и не знаю, что делать дальше. Спасибо!


person Nick DiQuattro    schedule 27.11.2018    source источник
comment
Одна основная вещь, которую нужно проверить, - правильно ли вы указываете свои нормальные распределения - в отличие от JAGS, Стэн определяет нормальное распределение в терминах среднего и стандартного отклонения, а не среднего и точности (от: ling.uni-potsdam.de/~vasishth/JAGSStanTutorial/), поэтому вы хотите быть делать что-то вроде normal(mean, sd) вместо normal(mean, 1 / sd^2).   -  person Marius    schedule 27.11.2018
comment
Вы также должны быть осторожны с идентифицируемостью в этих моделях. У вас не может быть перехвата и совершенно разных точек отсечения. Вы запустили несколько цепочек и получили Rhat около 1 и приличный эффективный размер выборки?   -  person Bob Carpenter    schedule 01.12.2018
comment
Спасибо, @Marius! В качестве ответа я опубликовал новую модель, в которой используются ваши предложения.   -  person Nick DiQuattro    schedule 01.12.2018
comment
Спасибо @BobCarpenter! В качестве ответа я опубликовал новую модель, в которой используются ваши предложения.   -  person Nick DiQuattro    schedule 01.12.2018


Ответы (1)


Обновление: после просмотра Интернета (особая благодарность Конору Голду) I Я придумал это решение, которое довольно точно воспроизводит результаты книги. Конечно, любая обратная связь / лучшая факторизация модели все равно принесет общепринятый ответ!

data {
  real L;                     // Lower fixed thresholds
  real<lower=L> U;            // Upper fixed threshold

  int<lower=2> J;             // Number of outcome levels

  int<lower=0> N;             // Data length

  int<lower=1,upper=J> y[N];  // Ordinal responses
}

transformed data {
  real<lower=0> diff;         // difference between upper and lower fixed thresholds
  int<lower=1> K;             // Number of thresholds

  K = J - 1;
  diff = U - L;
}

parameters {
  simplex[K - 1] thresh_raw;      // raw thresholds
  real mu; // latent mean
  real<lower=0> sigma; // latent sd
}

transformed parameters {
  ordered[K] thresh;     // new thresholds with fixed first and last

  thresh[1] = L;
  thresh[2:K] = L + diff * cumulative_sum(thresh_raw);
  thresh[K] = U; // Overwrite last value to fix it
}

model{
  vector[J] theta;                  // local parameter for ordinal categories

  //priors
  mu ~ normal( (1+J)/2.0 , J );
  sigma ~ uniform( J/1000.0 , J*10 );

  for (i in 2:K-2)
    thresh[i] ~ normal(i + .05, 2);

  // likelihood statement
  for(n in 1:N) {

    // probability of ordinal category definitions
    theta[1] = normal_cdf( thresh[1] , mu, sigma );

    for (l in 2:K)
      theta[l] = fmax(0, normal_cdf(thresh[l], mu, sigma ) - normal_cdf(thresh[l-1], mu, sigma));

    theta[J] = 1 - normal_cdf(thresh[K] , mu, sigma);

    y[n] ~ categorical(theta);
  }
}
person Nick DiQuattro    schedule 30.11.2018
comment
Эти априорные значения жесткого интервала для sigma являются плохой идеей статистически (если какая-либо масса находится рядом с границей, вы получите проблемы с расчетом и оценкой смещения), и они нарушают основной принцип Стэна, согласно которому любое значение параметров, удовлетворяющее заявленным ограничениям параметров, должно иметь поддержка (здесь значения выше J * 10 удовлетворяют ограничению неотрицательности, но не имеют поддержки). - person Bob Carpenter; 02.12.2018
comment
Вторая проблема заключается в том, что применение fmax нарушает дифференцируемость, поэтому в руководстве это называется плохой вещью для применения к чему-либо в зависимости от параметров. Стэн работает, передавая информацию о градиенте из окончательного значения логарифмической плотности обратно в параметры, а fmax и другие дискретные операции эффективно сокращают эти производные до mu, `sigma и т. Д. Вместо этого проблема должна быть настроена так, чтобы можно было отличить нормальный-cdf не опускаются ниже нуля. Также может быть проще использовать упорядоченный набор точек разделения, чем масштабировать совокупные суммы симплексов. - person Bob Carpenter; 02.12.2018