2017-06-03 11 views
1

私はPyMC3を初めて使っていて、実験のデータに合ったパラメータのセットを見つけようとしています。私の問題は、私の尤度関数は参加者の以前の反応に条件付きであるということです。pymc3条件付き決定論的尤度関数

データは、以下の行列形式を有する:Xは、参加者が0, 1, or 2の値と、その試験に応答成文化

participant | trial0 | trial1 | ... | trialn 
p0 | x | x | ... | x 
.... 
p1 | x | x | ... | x 

。さて、各参加者の可能性の高いパラメータを推測することに興味がありますp。簡単にするために、想定参加者は3つのタイプ、T1T2T3であること、そして第三のパラメータLがあることをこれらのタイプ間一定に保持することができます。私は実験を通して彼女の行動、参加者よりもタイプの一般的な分布、そしてlのベストフィットを考慮して、各参加者の可能性のあるタイプを推測したいと思います。

問題:私の尤度関数、LHSそれを呼び出す、決定論的です。参加者のタイプ(t = {1,2,3})、lの値、および参加者の過去の応答を接続して、観察されたデータの確率を与えますx = {0、 1,2}となりました。私の問題は、PyMC3モデルに試行nの各応答(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モデルのモデル、データコード化または例についての提案は非常に感謝しています。

かなり長いので、私は不特定の可能性を残しました。

答えて

1

あなたがしようとしているのは、応答のシーケンスを与えられた各個人のタイプt1、t2またはt3の確率を推測することです(このモデルはマルコフチェーンのようなものかもしれません)。

モデルの可能性に関する考え方を得るために、モデルに関する尤度コードまたはドキュメントをここに投稿すると便利です。これは見た目がわかるまではっきりとした答えです尤度で

pymc3で条件を実行する最も簡単な方法は、Theanoのスイッチop(http://deeplearning.net/software/theano/tutorial/conditions.html)を使用することです。

基本的にスイッチは、theano.switch(condition, expression_if_true, expression_if_false)のように使用できます。スイッチを要素単位で使用することはできますが、ifelseでは使用できないため、pymc3の可能性ではなくifelseを使用します。

関連する問題