2017-05-23 7 views
3

私は、平均、標準偏差、および各点の観測数がある(つまり、測定の精度に関する知識を持っている)一連のデータを持っています。私は手段でのみ見て、伝統的なpymc3モデルでは、私は、の線に沿って何かをすることがあります。pymc3モデルに不確かさを組み込む

x = data['mean'] 

with pm.Model() as m: 
    a = pm.Normal('a', mu=0, sd=1) 
    b = pm.Normal('b', mu=1, sd=1) 
    y = a + b*x 

    eps= pm.HalfNormal('eps', sd=1) 
    likelihood = pm.Normal('likelihood', mu=y, sd=eps, observed=x) 

モデルへの観測値の変動に関する情報を取り入れるための最良の方法は何ですか?明らかに、その結​​果は、高分散(あまり一定ではない)観測よりも低分散観測の方が重くなるはずです。

一つのアプローチ統計学者は、次の操作を実行することを示唆した。

x = data['mean'] # mean of observation 
x_sd = data['sd'] # sd of observation 
x_n = data['n'] # of measures for observation 
x_sem = x_sd/np.sqrt(x_n) 

with pm.Model() as m: 
    a = pm.Normal('a', mu=0, sd=1) 
    b = pm.Normal('b', mu=1, sd=1) 
    y = a + b*x 

    eps = pm.HalfNormal('eps', sd=1) 
    obs = mc.Normal('obs', mu=x, sd=x_sem, shape=len(x)) 
    likelihood = pm.Normal('likelihood', mu=y, eps=eps, observed=obs) 

しかし、私はこれを実行したときに私が手:

TypeError: observed needs to be data but got: <class 'pymc3.model.FreeRV'> 

私はpymc3のmasterブランチを実行しています(3.0には、いくつかを持っていますサンプル時間が非常に遅くなるパフォーマンス上の問題)。

+1

私が正しく理解していれば、あなたが見ていることを「変数の誤り」モデルと呼びます。 「ベイジアン・エラーの変数」をウェブで検索すると、ヒットが増えます。 pymc3を使用する必要がありますか?問題の理解を得るために、JAGSまたはStanの例を使って作業することを検討してください。 –

答えて

4

あなたは近いですが、ちょっとした変更が必要です。主な理由は、PyMC3のデータは常に一定であるということです。 mu_estの推定のためと可能性について:私は固定データを保持し、私は2つの点で観測された不確実性を導入よりも

with pm.Model() as m: 
    a = pm.Normal('a', mu=0, sd=1) 
    b = pm.Normal('b', mu=1, sd=1) 
    mu = a + b*x 

    mu_est = pm.Normal('mu_est', mu, x_sem, shape=len(x)) 

    likelihood = pm.Normal('likelihood', mu=mu_est, sd=x_sd, observed=x) 

注意:以下のコードをチェックしてください。もちろん、変数epsを使用したコードのように、x_semまたはx_sdを使用せず、代わりにそれらを見積もることは自由です。

PyMC3(少なくともいくつかのモデル)で動作するために使用された「ランダムデータ」のコードが、実際にそのように動作するように設計されていないとすれば、開発者は、データ、それはあなたが持っているメッセージを説明します。

関連する問題