なぜ階層的なのか?:私はこの問題を調査してみましたが、私が理解しているところによると、これは「階層的な」問題です。なぜなら、あなたはその集団から直接観察するのではなく、集団からの観察について観察しているからです。リファレンス:http : //www.econ.umn.edu/~bajari/iosp07/rossi1.pdf
なぜベイジアンなのか?:また、各セルに十分な観測値が割り当てられている「実験計画」には漸近/頻出解が存在する可能性があるため、ベイジアンとしてタグ付けしましたが、実際の目的では、実世界/非実験データセット(または最小のもの)はまばらに移入されています 集計データは多数ありますが、個々のセルが空白であるか、観測値が少ない場合があります。
抽象的モデル:
Uを単位母集団とする。。。u NのそれぞれにAまたはBのいずれかの処理Tを適用でき、それぞれから1または0の別名の成功と失敗のiid観測を観測します。ましょうP I TのためのI ∈ { 1 ... Nは}オブジェクトから観察する確率であるI処置下Tの成功をもたらします。なお、P Iと相関している可能性があります。
分析を実行可能にするために、(a)分布とp Bはそれぞれベータ分布などの特定の分布のファミリーのインスタンスであると想定し、(b)ハイパーパラメーターのいくつかの以前の分布を選択します。
モデルの例
マジック8ボールの大きなバッグを持っています。各8ボールを振ると、「はい」または「いいえ」が表示されます。また、ボールを上下逆さまにしたり、上下逆さまに振ったりすることもできます(Magic 8 Ballが上下逆さまに動作すると仮定します...)。ボールの向きが完全に「はい」か「いいえ」で結果の確率を変更することがあり(つまり、最初にあなたがいることを全く信じていないと相関しているのp のi Bを)。
質問:
誰かが集団から無作為にのユニットをサンプリングし、各ユニットについて、処理Aの下で任意の数の観測値と処理Bの下で任意の数の観測値を取得して記録しました。(実際には、私たちのデータセットでは、ほとんどのユニットは1つの処理でのみ観測されます)
このデータから、次の質問に答える必要があります。
- 母集団からランダムに新しい単位を取得する場合、p x Aとp x Bの同時事後分布を(分析的または確率的に)どうやって計算できますか?(主に、予想される比率の差を決定できるようにするため、Δ = p x A − p x B)
- 特定のユニットの、Y ∈ { 1 、2 、3 ... 、N }の観察と、S Y成功とF yの障害、どのようにするための結合事後分布(分析的又は確率的に)計算することができ、PのY軸Aそして、PのY軸B、再び配布構築するために、Δ Yの比率の差のp個のYのA - のP のY Bを
おまけの質問:私たちは本当にとp Bが非常に相関していることを期待していますが、それを明示的にモデル化していません。確率的な解決策の可能性の高いケースでは、これにより、ギブスを含む一部のサンプラーが事後分布の調査にあまり効果がなくなると考えています。これに該当します。その場合、別のサンプラーを使用し、相関関係を別の変数としてモデル化し、p分布を変換して無相関にするか、サンプラーをより長く実行しますか?
回答基準
私はその答えを探しています:
できればPython / PyMCを使用するコード、または実行できないコード(JAGS)がある
数千単位の入力を処理できます
答えが私が投稿した最後のJAGSモデルに類似している場合は、なぜそれがJAGSモデルのエラーを見つけてくれたJAGSフォーラムの Martyn Plummerに感謝します。Gamma(Shape = 2、Scale = 20)の事前値を設定しようとして、dpar(0.5,1)
事前では機能するが事前では機能しないのか説明してdgamma(2,20)
ください。dgamma(2,20)
実際にGamma(Shape = 2、InverseScale = 20)= Gamma(Shape = 2、Scale = 0.05)の事前値を設定する呼び出しをしていました。
チャレンジデータセット
Excelでいくつかのサンプルデータセットを生成しました。考えられるシナリオはいくつかあり、p分布の緊密さ、それらの間の相関を変更し、他の入力を簡単に変更できるようにしています。 https://docs.google.com/file/d/0B_rPBjs4Cp0zLVBybU1nVnd0ZFU/edit?usp=sharing(〜8Mb)
これまでに試みた/部分的な解決策
1) Python 2.7とPyMC 2.2をダウンロードしてインストールしました。最初は実行するモデルが正しくありませんでしたが、モデルを再定式化しようとすると、拡張機能がフリーズしました。コードを追加/削除することにより、フリーズをトリガーするコードはmc.Binomial(...)であると判断しましたが、この関数は最初のモデルでは機能しました。そのため、モデル。
import pymc as mc
import numpy as np
import scipy.stats as stats
from __future__ import division
cases=[0,0]
for case in range(2):
if case==0:
# Taken from the sample datasets excel sheet, Focused Correlated p's
c_A_arr, n_A_arr, c_B_arr, n_B_arr=np.loadtxt("data/TightCorr.tsv", unpack=True)
if case==1:
# Taken from the sample datasets excel sheet, Focused Uncorrelated p's
c_A_arr, n_A_arr, c_B_arr, n_B_arr=np.loadtxt("data/TightUncorr.tsv", unpack=True)
scale=20.0
alpha_A=mc.Uniform("alpha_A", 1,scale)
beta_A=mc.Uniform("beta_A", 1,scale)
alpha_B=mc.Uniform("alpha_B", 1,scale)
beta_B=mc.Uniform("beta_B", 1,scale)
p_A=mc.Beta("p_A",alpha=alpha_A,beta=beta_A)
p_B=mc.Beta("p_B",alpha=alpha_B,beta=beta_B)
@mc.deterministic
def delta(p_A=p_A,p_B=p_B):
return p_A-p_B
obs_n_A=mc.DiscreteUniform("obs_n_A",lower=0,upper=20,observed=True, value=n_A_arr)
obs_n_B=mc.DiscreteUniform("obs_n_B",lower=0,upper=20,observed=True, value=n_B_arr)
obs_c_A=mc.Binomial("obs_c_A",n=obs_n_A,p=p_A, observed=True, value=c_A_arr)
obs_c_B=mc.Binomial("obs_c_B",n=obs_n_B,p=p_B, observed=True, value=c_B_arr)
model = mc.Model([alpha_A,beta_A,alpha_B,beta_B,p_A,p_B,delta,obs_n_A,obs_n_B,obs_c_A,obs_c_B])
cases[case] = mc.MCMC(model)
cases[case].sample(24000, 12000, 2)
lift_samples = cases[case].trace('delta')[:]
ax = plt.subplot(211+case)
figsize(12.5,5)
plt.title("Posterior distributions of lift from 0 to T")
plt.hist(lift_samples, histtype='stepfilled', bins=30, alpha=0.8,
label="posterior of lift", color="#7A68A6", normed=True)
plt.vlines(0, 0, 4, color="k", linestyles="--", lw=1)
plt.xlim([-1, 1])
2) JAGS 3.4をダウンロードしてインストールしました。JAGSフォーラムから私の前の修正を取得した後、正常に実行されるこのモデルができました。
型番
var alpha_A, beta_A, alpha_B, beta_B, p_A[N], p_B[N], delta[N], n_A[N], n_B[N], c_A[N], c_B[N];
model {
for (i in 1:N) {
c_A[i] ~ dbin(p_A[i],n_A[i])
c_B[i] ~ dbin(p_B[i],n_B[i])
p_A[i] ~ dbeta(alpha_A,beta_A)
p_B[i] ~ dbeta(alpha_B,beta_B)
delta[i] <- p_A[i]-p_B[i]
}
alpha_A ~ dgamma(1,0.05)
alpha_B ~ dgamma(1,0.05)
beta_A ~ dgamma(1,0.05)
beta_B ~ dgamma(1,0.05)
}
データ
"N" <- 60
"c_A" <- structure(c(0,6,0,3,0,8,0,4,0,6,1,5,0,5,0,7,0,3,0,7,0,4,0,5,0,4,0,5,0,4,0,2,0,4,0,5,0,8,2,7,0,6,0,3,0,3,0,8,0,4,0,4,2,6,0,7,0,3,0,1))
"c_B" <- structure(c(5,0,2,2,2,0,2,0,2,0,0,0,5,0,4,0,3,1,2,0,2,0,2,0,0,0,3,0,6,0,4,1,5,0,2,0,6,0,1,0,2,0,4,0,4,1,1,0,3,0,5,0,0,0,5,0,2,0,7,1))
"n_A" <- structure(c(0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3))
"n_B" <- structure(c(9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3,9,0,9,0,9,0,3,0,9,0,9,0,9,3))
コントロール
model in Try1.bug
data in Try1.r
compile, nchains(2)
initialize
update 400
monitor set p_A, thin(3)
monitor set p_B, thin(3)
monitor set delta, thin(3)
update 1000
coda *, stem(Try1)
むしろモデルを分解したい人のための実際のアプリケーション:)
Webでは、一般的なA / Bテストでは、1つのページまたはコンテンツユニットからのコンバージョン率への影響を、さまざまなバリエーションを考慮して検討します。典型的な解決策には、帰無仮説または2つの等しい比率に対する古典的な有意性検定、または最近のベータ分布を共役事前分布として活用する分析的なベイズ解が含まれます。
私がテストに興味を持っている各ユニットに多くの訪問者を必要とするこの単一のコンテンツ単位アプローチの代わりに、コンテンツの複数のユニットを生成するプロセスのバリエーションを比較したいと思います(珍しいシナリオではありません) ...)。したがって、全体として、プロセスAまたはBによって生成されたユニット/ページには多くの訪問/データがありますが、個々のユニットには少数の観測しかありません。