pymc3 Условная детерминированная функция правдоподобия

Я новичок в 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 моделей, имеющих схожие характеристики.

Я оставил вероятность неопределенной, потому что она довольно длинная.


person Brox    schedule 03.06.2017    source источник


Ответы (1)


Кажется, что вы пытаетесь сделать вывод о вероятности типа t1, t2 или t3 для каждого человека с учетом последовательности ответов (я чувствую, что эта модель может быть чем-то вроде цепи Маркова).

Было бы полезно опубликовать код вероятности или некоторую документацию о модели здесь, чтобы мы могли получить представление о том, как она может быть реализована — это будет немного расплывчатый ответ, пока я не смогу взглянуть на вероятность.

Самый простой способ сделать условное выражение в pymc3 — это использовать операцию переключения Theano, которая описана здесь: http://deeplearning.net/software/theano/tutorial/conditions.html.

В основном переключатель можно использовать как: theano.switch(condition, expression_if_true, expression_if_false). Вы хотите использовать это, а не ifelse в вероятностях pymc3, поскольку switch можно использовать поэлементно, но ifelse нельзя.

person tmm13    schedule 08.06.2017