PyMCの2つの正規分布の近似モデル


10

私はソフトウェアエンジニアなので、始める前に私を許さなければならないより多くの統計を学ぼうとしているので、これは深刻な新しい領域です...

私はPyMCを学び、いくつかの本当に(本当に)単純な例に取り組んできました。私が作業を開始できない(そして関連する例を見つけることができない)1つの問題は、2つの正規分布から生成されたデータにモデルを適合させることです。

1000個の値があるとします。500から発生Normal(mean=100, stddev=20)し、別の500から生成されましたNormal(mean=200, stddev=20)

モデルをそれらに適合させたい場合、つまり、PyMCを使用して2つの平均と単一標準偏差を決定します。私はそれが...

mean1 = Uniform('mean1', lower=0.0, upper=200.0)
mean2 = Uniform('mean2', lower=0.0, upper=200.0)
precision = Gamma('precision', alpha=0.1, beta=0.1)

data = read_data_from_file_or_whatever()

@deterministic(plot=False)
def mean(m1=mean1, m2=mean2):
    # but what goes here?

process = Normal('process', mu=mean, tau=precision, value=data, observed=True)

つまり、生成プロセスは通常ですが、muは2つの値のいずれかです。私はちょうど値はから来ているかどうかの間で「決定」を表す方法を知らないm1かをm2

多分私はこれをモデリングするために間違ったアプローチを完全に取っていますか?誰かが私に例を指摘できますか?私はバグとジャグを読むことができるので、何でも本当に大丈夫です。

回答:


11

半分が1つのディストリビューションから来て、残りの半分が他のディストリビューションから来たということは絶対に確かですか?そうでない場合は、比率を確率変数としてモデル化できます(これは非常にベイズ的なことです)。

以下は私がすることです、いくつかのヒントが埋め込まれています。

from pymc import *

size = 10
p = Uniform( "p", 0 , 1) #this is the fraction that come from mean1 vs mean2

ber = Bernoulli( "ber", p = p, size = size) # produces 1 with proportion p.

precision = Gamma('precision', alpha=0.1, beta=0.1)

mean1 = Normal( "mean1", 0, 0.001 ) #better to use normals versus Uniforms (unless you are certain the value is  truncated at 0 and 200 
mean2 = Normal( "mean2", 0, 0.001 )

@deterministic
def mean( ber = ber, mean1 = mean1, mean2 = mean2):
    return ber*mean1 + (1-ber)*mean2


#generate some artificial data   
v = np.random.randint( 0, 2, size)
data = v*(10+ np.random.randn(size) ) + (1-v)*(-10 + np.random.randn(size ) )


obs = Normal( "obs", mean, precision, value = data, observed = True)

model = Model( {"p":p, "precision": precision, "mean1": mean1, "mean2":mean2, "obs":obs} )

2
恥知らずプロモーション:私はちょうどベイズとpyMCに関するブログ記事を書いた、文字通り、私はそれをチェックアウトすることを勧めますので、あなたが、この投稿を前に1分。ベイズの素晴らしいパワー-パート1
Cam.Davidson.Pilon

驚くばかり!この2つの手段の混合に対するアプローチは、まさに私が頭を動かそうとしていたものです。
マットケルシー

mean1とmean2が均一ではなく正規分布であると言うことの真のモデリングの利点を完全に理解しているわけではありません(正確に言うと、精度は正直ですが、「他の誰かが行った」以来、ガンマを使用しています)。学ぶことはたくさんあります:)
mat kelcey

元の例のように均一を使用すると、平均が特定の値を超えないことが確実にわかることになります。これはやや病的です。すべての実数を考慮することができるため、法線を使用することをお勧めします。
Cam.Davidson.Pilon

1
ガンマの選択には数学的な理由があります。ガンマは精度より前共役です。ここの
Cam.Davidson.Pilon

6

上記の議論に関連するいくつかのポイント:

  1. 拡散法線とユニフォームのどちらを選択するかは、(a)共役が心配である場合(ノーマルを使用する場合)または(b)真の値がユニフォームのエンドポイントの外側にある可能性がある合理的な可能性がない限り、かなり学術的です。 。PyMCでは、特にギブスサンプラーを使用する場合を除いて、活用について心配する必要はありません。

  2. ガンマは実際には、分散/精度パラメーターの前の情報がない場合には最適な選択肢ではありません。それはあなたが考えるより有益なものになるかもしれません。より良い選択は、標準偏差を前に均一にしてから、逆二乗で変換することです。詳細については、Gelman 2006を参照してください。


1
ああfonnesbeckはpymcのコア開発者の一人です!ポイント2のコーディング方法の例を示していただけますか?
Cam.Davidson.Pilon

fonnesbeckに感謝します。ポイント2の簡単な例:)
mat kelcey

1
実際、私はあなたが... gist.github.com/4404631に沿って何かを意味していると思いますか?
mat kelcey

はい、正確に。:あなたはより簡潔に少し変形行うことができますtau = std_dev**-2
fonnesbeck

この精度とstd_devの関係がどこから来ているのかについて、どこを読むべきでしょうか?
user979 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.