2015-01-12 8 views
2

В настоящее время я пытаюсь перенести некоторые модели JAGS в STAN. Я получаю некоторые странные ошибки »stan :: prob :: exponential_log (N4stan5agrad3varE): Случайная переменная - nan: 0, но не должна быть назой!» и отлаживать те, которые я хотел бы знать значения некоторых локальных параметров.Как контролировать локальные переменные в STAN?

В JAGS я могу настроить мониторы для любой переменной. STAN контролирует только параметры. Но параметр не может иметь назначений (если я его правильно понимаю).

Как я могу контролировать промежуточные переменные?

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

Model: 

data { 
    int y[11]; // 
    int reps[11]; 
    real soas[11]; 

} 
parameters { 
    real<lower=0.001,upper=0.200> v1; 
    real<lower=0.001,upper=0.200> v2; 

} 


model { 
    int dif[11,96]; 
    real cf[11]; 

    real p[11]; 

    real t1[11,96]; 
    real t2[11,96]; 

    for (i in 1:11){ 
     for (r in 1:reps[i]){  
      t1[i,r] ~ exponential(v1); 
      t2[i,r] ~ exponential(v2); 
      dif[i,r] <- (t1[i,r]+soas[i]<=(t2[i,r])); 

      } 
     cf[i] <- sum(dif[i]); 
     p[i] <-cf[i]/reps[i]; 
     y[i] ~ binomial(reps[i],p[i]); 
    } 

} 

Вот некоторые фиктивные данные:

psy_dat = { 
     'soas' : numpy.array(range(-100,101,20)), 
      'y' : [47, 46, 62, 50, 59, 47, 36, 13, 7, 2, 1], 
     'reps' : [48, 48, 64, 64, 92, 92, 92, 64, 64, 48, 48] 
      } 

ответ

6

В данном случае проблема заключается в том, что t1t2 по этому вопросу) инициализируются NaN и не изменился ни к чему, прежде чем использовать exponential вероятность. Я предполагаю, что t1 и t2 должны быть в блоке generated quantities, если вы намереваетесь нарисовать их из своего последующего прогнозирующего распределения.

Чтобы ответить на ваш вопрос, как указано, вы можете использовать оператор print() в блоке модели для отладки проблемной программы Stan. И если вы действительно хотите хранить промежуточные продукты, вам нужно объявить и определить их в блоке transformed parameters программы Stan.

+0

Большое спасибо! Я попробую это. –

+0

К сожалению, это не сработает. В блоке генерируемых величин не может быть проведена выборка. Поэтому я попытался пробовать значения в блоке модели, назначить их переменным в блоке сгенерированных величин и попытался использовать их снова в блоке модели. Но это тоже невозможно. Я попробую еще несколько вещей, но любые идеи или подсказки приветствуются. –

+0

Еще одна вещь: я также получаю это наиболее вероятное предупреждение: 'Предупреждение (не фатальное): Левая часть оператора выборки (~) содержит нелинейное преобразование параметра или локальной переменной. Вы должны вызвать increment_log_prob() с абсолютным определителем журнала якобиана преобразования. Сэмплирование Заявление левого выражения: get_base1 (get_base1 (t1, i, "t1", 1), r, "t1", 2) ~ exponential_log (...) ', о котором я не могу понять. Тем не менее, все это не имеет никакого отношения к мониторингу переменных, поэтому я думаю, что я должен начать новую тему с этим. –