Несколько наблюдаемых
PyMC3 поддерживает несколько наблюдаемых, то есть вы можете добавить несколько объектов RandomVariable
к графику с установленным аргументом observed
.
Single Trial
В вашем первом случае это дало бы некоторую ясность модели:
counts=[countforPattime0, countforPattime1, ...]
with pm.Model() as single_trial:
# priors
k = pm.Uniform('k', 0, 20)
B = pm.Uniform('B', 0, 1000)
P = pm.Uniform('P', 0, 1000)
# transformed RVs
rate = pm.Deterministic('exprate', k*B)
mu = P*pm.math.exp(-rate*ts)
# observations
B_obs = pm.Poisson('B_obs', mu=B, observed=countforB)
Y_obs = pm.Poisson('Y_obs', mu=mu, observed=counts)
Multiple Trials
С этой дополнительной гибкостью,надеюсь, это делает переход к нескольким испытаниям более очевидным.Он должен выглядеть примерно так:
B_cts = np.array(...) # shape (N, 1)
Y_cts = np.array(...) # shape (N, M)
ts = np.array(...) # shape (1, M)
with pm.Model() as multi_trial:
# priors
k = pm.Uniform('k', 0, 20)
B = pm.Uniform('B', 0, 1000, shape=B_cts.shape)
P = pm.Uniform('P', 0, 1000, shape=B_cts.shape)
# transformed RVs
rate = pm.Deterministic('exprate', k*B)
mu = P*pm.math.exp(-rate*ts)
# observations
B_obs = pm.Poisson('B_obs', mu=B, observed=B_cts)
Y_obs = pm.Poisson('Y_obs', mu=mu, observed=Y_cts)
Может быть несколько дополнительных синтаксических элементов для правильного умножения матриц, но это по крайней мере включает в себя правильные формы.
Приоры
Как только вы запустите эту настройку, вам будет интересно пересмотреть приоры.Я подозреваю, что у вас есть больше информации о типичных значениях для тех, которые включены в настоящее время, тем более что это похоже на химическую или физическую модель.
Например, сейчас модель говорит:
Мы полагаем, что истинное значение B
остается неизменным на протяжении всего испытания, но между испытаниями является совершенно произвольным значением в диапазоне от 0 до 1000 , и его повторное измерение в ходе испытания будет распределено по Пуассону..
Как правило, следует избегать усечений, если они не исключают бессмысленные значения.Следовательно, нижняя граница 0 хороша, но верхние оценки произвольны.Я бы порекомендовал взглянуть на Stan Wiki по выбору приоров .