比率の違いに関する階層ベイズ分析


8

なぜ階層的なのか?:私はこの問題を調査してみましたが、私が理解しているところによると、これは「階層的な」問題です。なぜなら、あなたはその集団から直接観察するのではなく、集団からの観察について観察しているからです。リファレンス: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 Iu1,u2,u3...uNTABpiTi{1...N}iTpiAと相関している可能性があります。piB

分析を実行可能にするために、(a)分布p Bはそれぞれベータ分布などの特定の分布のファミリーのインスタンスであると想定し、(b)ハイパーパラメーターのいくつかの以前の分布を選択します。pApB

モデルの例

マジック8ボールの大きなバッグを持っています。各8ボールを振ると、「はい」または「いいえ」が表示されます。また、ボールを上下逆さまにしたり、上下逆さまに振ったりすることもできます(Magic 8 Ballが上下逆さまに動作すると仮定します...)。ボールの向きが完全に「はい」か「いいえ」で結果の確率を変更することがあり(つまり、最初にあなたがいることを全く信じていないと相関しているのp のi Bを)。piApiB

質問:

誰かが集団から無作為にのユニットをサンプリングし、各ユニットについて、処理Aの下で任意の数の観測値と処理Bの下で任意の数の観測値を取得して記録しました。(実際には、私たちのデータセットでは、ほとんどのユニットは1つの処理でのみ観測されます)nAB

このデータから、次の質問に答える必要があります。

  1. 母集団からランダムに新しい単位を取得する場合、p x Ap x Bの同時事後分布を(分析的または確率的に)どうやって計算できますか?(主に、予想される比率の差を決定できるようにするため、Δ = p x Ap x BuxpxApxBΔ=pxApxB
  2. 特定のユニットのY { 1 2 3 ... N }の観察と、S Y成功とF yの障害、どのようにするための結合事後分布(分析的又は確率的に)計算することができ、PのY軸Aそして、PのY軸B、再び配布構築するために、Δ Yの比率の差のp個のYのA - のP のY Bをuyy{1,2,3...,n}syfypyApyBΔypyApyB

おまけの質問:私たちは本当にp Bが非常に相関していることを期待していますが、それを明示的にモデル化していません。確率的な解決策の可能性の高いケースでは、これにより、ギブスを含む一部のサンプラーが事後分布の調査にあまり効果がなくなると考えています。これに該当します。その場合、別のサンプラーを使用し、相関関係を別の変数としてモデル化し、p分布を変換して無相関にするか、サンプラーをより長く実行しますか?pApBp

回答基準

私はその答えを探しています:

  • できればPython / PyMCを使用するコード、または実行できないコード(JAGS)がある

  • 数千単位の入力を処理できます

  • pApBΔ

  • pApBΔ

  • 答えが私が投稿した最後のJAGSモデルに類似している場合は、なぜそれがdpar(0.5,1)事前では機能するが事前では機能しないのか説明してdgamma(2,20)ください。JAGSモデルのエラーを見つけてくれたJAGSフォーラムの Martyn Plummerに感謝します。Gamma(Shape = 2、Scale = 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

Excelファイルに含まれる4つのデータセットの視覚化

これまでに試みた/部分的な解決策

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によって生成されたユニット/ページには多くの訪問/データがありますが、個々のユニットには少数の観測しかありません。


xpxxoxoxxpx
whuber

xoxpx

質問の最後に、私が何をしようとしているのかを明確に理解できる例を追加しました。
Fabio Beltramini 2013

ありがとう。しかし、質問は紛らわしいままです。この例では、順序付けされた値のペア(ロールされた時間と成功)を監視しています。では、どのような「流通」についてお聞きしているのですか?サイコロの大きな袋のどのプロパティに正確に対応しますか?
whuber

1
値のペア(ロールと成功)は、潜在変数pに関する情報を伝えます。私が欲しい分布はバッグの中のpの分布です。もちろん、それが属している分布のクラスを想定しない場合、任意に多くの可能性がありますが、pがたとえばベータ分布であると言う場合、これに最適なパラメーターを選択することになります分布のクラス。それが助け場合は、今や各オブジェクトはベータ版など(2,2)...またはベータ(4,4)、からAPを持っていることを、P = 1 / 4,1 / 6,1 / 8とサイコロの代わりに考えます
ファビオベルトラミニ2013

回答:


2

バウンティの期限が切れて回答が得られなかったので、思いついた回答を投稿しますが、ベイジアン推論に関する私の限られた経験から、これは健全な量の懐疑論で取られるべきであることが示唆されています。

I)セットアップ

  1. JAGS 3.4とR 3.0.1をダウンロードしてインストールしました
  2. Rを開始し、install.packages(pkgname)を使用して、パッケージrjagsおよびcodaをインストールしました

II)モデルとデータ-質問で既に詳述されているモデルとデータファイルを使用しました。質問1に答えるために、4つの変数すべてを0として、データに1つの追加の観測を追加しました。

III)質問に答える

  1. モデル/データでJAGSを実行しました(コマンドラインを開き、ファイルのあるディレクトリに移動し、> jags-terminal Command.cmdと入力します。実行していくつかのファイルを出力します
  2. Rでは、次のコマンドを使用しました。
    • library( "rjags")はインストールされたパッケージ(および必要なパッケージcoda)をロードします
    • setwd()は、出力ファイルがあったディレクトリに移動します
    • results = read.coda( "STEMchain1.txt"、 "STEMindex.txt")
  3. 最初の質問に答えるには:
    • PDFプロットとして、「plot(results [、3 * N])」
    • 分位数として、「quantile(results [、3 * N]、c(0.025,0.25,0.5,0.75,0.975))」
    • ここで、Nは観測数であり、最後の観測は「すべて0」の観測の位置に対応します。(1からnは変数p_A用、n + 1から2nはp_B用、2n + 1から3nはデルタ用)
  4. 2番目の質問に答えるには、上記と同じですが、3 * N-> 2 * N + yを変更します

これが答えを得る正しい方法であるかどうか、または特に相関の場合に、より複雑なモデルがより良い結果をもたらすかどうかはわかりませんが、最終的にはより経験豊富な誰かがうまくいくと思います...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.