Я новичок в PyMC3
и пытаюсь найти набор параметров, соответствующих данным эксперимента. Моя проблема в том, что моя функция правдоподобия зависит от предыдущих ответов участника.
Данные имеют следующую матричную форму:
participant | trial0 | trial1 | ... | trialn
p0 | x | x | ... | x
....
p1 | x | x | ... | x
где x кодирует ответы участников в этом испытании со значениями 0, 1, or 2
. Теперь мне нужно определить вероятные параметры для каждого участника p. Для простоты предположим, что участники могут быть одного из трех типов: t1, t2, t3, и что существует третий параметр l остается постоянным для всех этих типов. Я хочу сделать вывод о вероятном типе каждого участника, учитывая его поведение в ходе эксперимента, общее распределение типов среди участников и наилучшее соответствие l.
Проблема: моя функция правдоподобия, назовем ее lhs, является детерминированной; подключите тип участников (t={1,2,3}), значение для l и прошлые ответы участника, и это даст вам вероятность наблюдаемых данных x={0,1,2} в текущем испытании. Моя проблема в том, что я не знаю, как сообщить модели PyMC3, что для каждого ответа (0,1 или 2) в испытании n функция правдоподобия зависит от последовательности ответов в испытаниях до н. Мне это нужно, потому что после каждого испытания lhs обновляется значением испытания (участники учатся в эксперименте, поэтому вероятность того, что они продемонстрируют определенный ответ, также изменится.
Я предполагаю, что есть либо умный способ систематизировать ответы для каждого испытания таким образом, чтобы модель рекурсивно вычисляла функцию правдоподобия для каждого ответа в испытании n > 0
, либо что есть функция, сообщающая ей, что данные зависят от предыдущих данных. . Увы, мне не удалось найти примеров того, как может работать та или иная идея.
Вот что у меня есть:
import numpy as np
import pymc3 as pm
#data is a pandas dataframe where each row
#is a participant, each column a trial, and
#each cell has value 0,1, or 2.
with pm.Model() as model:
#Priors
l = pm.Gamma('lam',10,1.0/0.5) #my prior for the value of l
p_tau = pm.Dirichlet('p_tau',np.ones(3)) #unbiased prior over types
tau = pm.Categorical('tau', p=p_tau, shape=3) #distr. over types I want to infer
#data likelihood function
lhs = ... #likelihood function; takes l, tau,
#and sequentially observed data up to trial n-1
#to compute the likelihood of the response of trial n
#Here's the issue. data would be 0,1,2
#But lhs should depend on previous trials
pm.Categorical('obs', p=lhs, observed=data)
Будем очень признательны за предложения по модели, кодификации данных или примеры реализованных PyMC3
моделей, имеющих схожие характеристики.
Я оставил вероятность неопределенной, потому что она довольно длинная.