Я изучаю временные данные с нулевым уровнем счета. Я построил модель stan
, которая работает с этими данными с нулевым раздувом с помощью оператора if
в блоке model
. Это то, что они советуют в Справочном руководстве Стэна. например.,
model {
for (n in 1:N) {
if (y[n] == 0)
target += log_sum_exp(bernoulli_lpmf(1 | theta), bernoulli_lpmf(0 | theta) + poisson_lpmf(y[n] | lambda));
else
target += bernoulli_lpmf(0 | theta) + poisson_lpmf(y[n] | lambda);
}
}
Это утверждение if
явно необходимо, поскольку Стэн использует NUTS в качестве сэмплера, который не имеет дело с дискретными переменными (, и, таким образом, мы маргинализируем эту дискретную случайную переменную вместо выборки из нее ). У меня не было большого опыта работы с pymc3
, но я понимаю, что он может иметь дело с шагом обновления Гиббса (для выборки из дискретной вероятности Бернулли). Затем, при условии нулевого значения, он может выполнить обновление метрополиса или NUTS для параметров, которые зависят от вероятности Пуассона.
Мой вопрос: Можно ( и, если да, то как ) pymc3
использовать таким образом для выборки из дискретной переменной с нулевым раздувом с обновлениями для непрерывная переменная выполняется с обновлением NUTS? Если это возможно, значительно ли улучшится производительность по сравнению с приведенной выше реализацией в stan
(что исключает дискретную случайную переменную)? Кроме того, если pymc3
может поддерживать только обновление Gibbs + Metropolis, стоит ли учитывать это изменение по сравнению с NUTS?