rstanまたは私のグリッド近似は正しくありません:ベイズ推定における分位点推定値の競合を決定する


8

私は、ベイズは人口規模推定達成するためのモデル持っているNと検出の確率θのみ観測されたオブジェクトの観測された数に基づいて、二項分布でのy

p(N,θ|y)Bin(y|N,θ)N
のために {N|NZNmax(y)}×(0,1)。簡単にするために、Nは各y_iに対して同じ未知の値に固定されていると仮定しyiます。この例では、y=53,57,66,67,73です。

このモデルをで推定するrstanと、事後のグリッド近似から得られた結果とは異なります。理由を突き止めようとしています。(興味を持った読者は、この質問は、後続の私の答えにあることを見つけるかもしれないここに。)

rstan 近似

参考までに、これはrstanコードです。

raftery.model   <- "
    data{
        int     I;
        int     y[I];
    }
    parameters{
        real<lower=max(y)>  N;
        simplex[2]      theta;
    }
    transformed parameters{
    }
    model{
        vector[I]   Pr_y;

        for(i in 1:I){
            Pr_y[i] <-  binomial_coefficient_log(N, y[i])
                        +multiply_log(y[i],         theta[1])
                        +multiply_log((N-y[i]),     theta[2]);
        }
        increment_log_prob(sum(Pr_y));
        increment_log_prob(-log(N));            
    }
"
raft.data           <- list(y=c(53,57,66,67,72), I=5)
system.time(fit.test    <- stan(model_code=raftery.model, data=raft.data,iter=10))
system.time(fit     <- stan(fit=fit.test, data=raft.data,iter=10000,chains=5))

theta2シンプレックスとしてキャストすることに注意してください。これは単純化のためです。関心のある量はtheta[1]、明らかtheta[2]に余分な情報です。

さらに、は実数値(勾配法であるため実数値パラメーターのみを受け入れます)なので、実数値の二項分布を作成しました。Nrstan

Rstanの結果

            mean se_mean       sd   2.5%    25%    50%    75%   97.5% n_eff Rhat
N        1078.75  256.72 15159.79  94.44 148.28 230.61 461.63 4575.49  3487    1
theta[1]    0.29    0.00     0.19   0.01   0.14   0.27   0.42    0.67  2519    1
theta[2]    0.71    0.00     0.19   0.33   0.58   0.73   0.86    0.99  2519    1
lp__      -19.88    0.02     1.11 -22.89 -20.31 -19.54 -19.09  -18.82  3339    1

グリッド近似

グリッド近似は以下のように作成されました。メモリの制約により、ノートパソコンでグリッドを細かくすることができません。

theta   <- seq(0+1e-10,1-1e-10, len=1e3)
N       <- round(seq(72, 5000, len=1e3)); N[2]-N[1]
grid    <- expand.grid(N,theta)
y   <- c(53,57,66,67,72)
raftery.prob    <- function(x, z=y){
    N       <- x[1]
    theta   <- x[2]
    exp(sum(dbinom(z, size=N, prob=theta, log=T)))/N
}

post        <- matrix(apply(grid, 1, raftery.prob), nrow=length(N), ncol=length(theta),byrow=F)    
post.norm   <- post/sum(post)

グリッド近似を使用して、事後密度のこの表示を生成しました。後部がバナナ型であることがわかります。この種の後部は、ユークリッドメトリックHMCにとって問題となる可能性があります。(バナナの形の重大度は、が対数スケールであるため、実際にはここでは抑制されています。)バナナの形を1分間考えると、線上にある必要があることがわかります。。(さらに、このグラフに表示されるグリッド近似は、明確にするために正規化されていません。それ以外の場合、バナナは少し狭すぎて明確に理解できません。)ˉ Y = θ NNy¯=θN

グリッド上

グリッド近似結果

do.call(cbind, lapply(c(0.025, .25, .5, .75, .975), function(quantile){
    approx(y=N, x=cumsum(rowSums(post.norm))/sum(post.norm), xout=quantile)
}))
  [,1]     [,2]     [,3]     [,4]     [,5]    
x 0.025    0.25     0.5      0.75     0.975   
y 92.55068 144.7091 226.7845 443.6359 2475.398

討論

の97.5%の分位数は、グリッド近似の場合よりも私のモデルではるかに大きくなっていますが、その分位点はそれ以外はグリッド近似に似ています。私はこれを、2つの方法が概ね一致していることを示していると解釈します。97.5%の分位数の不一致を解釈する方法はわかりません。Nrstan

グリッド近似とrstanHMC-NUTSサンプリングの結果の相違を説明できる可能性のある説明をいくつか作成しましたが、どちらか一方または両方の説明が正しいかどうかを理解する方法がわかりません。

  1. Rstanは間違っており、グリッドは正しいです。rstan特にがに向かってドリフトする ため、バナナの形の密度はに問題があるため、これらのテールの量は信頼できません。グリッドの後方のプロットから、値大きいと尾が非常に鋭いことがわかります。+ NN+N
  2. Rstanは正しく、グリッドは間違っています。グリッドは、結果を損なう可能性のある2つの近似を行います。まず、グリッドは事後部分空間上の点の有限セットにすぎないため、おおよその概算です。次に、これは有限の部分空間であるため、最大グリッド値より大きい値に対して事後確率が0であると誤って宣言しています。同様に、グリッドのテールに入るのに優れているので、テールの四分位点は正しいです。NNNrstan

Juhoの答えからポイントを明確にするために、さらにスペースが必要でした。私が正しく理解していれば、後部からを積分してベータ二項分布を取得できます: P Y | N α β = Nθ

p(y|N,α,β)=(Ny)Beta(y+α,Ny+β)Beta(α,β)

この例では、事前のユニフォームがあるため、およびです。後部はとなると思います。ここで、です。しかし、これはJuhoの回答とは大きく異なるようです。どこが間違っているのですか?β = 1α=1β=1θp(N|y)N1i=1Kp(yi|N,α=1,β=1)K=#(y)p(N)=N1

回答:


4

崖:Rstanは、を分析的に統合し、かなり大きなグリッドでを評価するアプローチに基づいて(近い)正しいようです。θP(N)P(yN)

の事後を取得するために、実際にを積分することが可能です: ここで、はの長さです。ここで、は事前にベータ(ここでは)を持ち、ベータは二項に共役であるため、もベータ分布に従います。したがって、はベータ二項です。θ P Y | N = P T 1 1 θ | N Y 1...Nθ

P(yN)=P(y1N)×P(y2N,y1)×P(y3N,y1,y2)×P(yKN,y1,,yK1)
KyθBeta(1,1)θN,y1,,ykyk+1N,y1,,ykガンマ関数の観点から確率の閉じた形の式が存在します。したがって、ベータ二項式の関連パラメータを計算し、ベータ二項確率を乗算することにより、評価できます。次のMATLABコードは、このアプローチを使用して、を計算し、正規化して事後を取得します。 P(yN)P(N)P(y|N)N=72,,500000
%The data
y = [53 57 66 67 72];

%Initialize
maxN = 500000;
logp = zeros(1,maxN); %log prior + log likelihood
logp(1:71) = -inf; 

for N = 72:maxN
    %Prior
    logp(N) = -log(N);

    %y1 has uniform distribution
    logp(N) = logp(N) - log(N+1);    
    a = 1;
    b = 1;

    %Rest of the measurements 
    for j = 2:length(y);
        %Update beta parameters
        a = a + y(j-1);
        b = b + N - y(j-1);

        %Log predictive probability of y_j (see Wikipedia article)
        logp(N) = logp(N) + gammaln(N+1) - gammaln(y(j) + 1) - ... 
         gammaln(N - y(j) + 1) + gammaln(y(j) + a) +  ...
         gammaln(N - y(j) + b) - gammaln(N + a + b) ...
            + gammaln(a+b) - gammaln(a) - gammaln(b);

    end
end

%Get the posterior of N
pmf = exp(logp - max(logp));
pmf = pmf/sum(pmf);
cdf = cumsum(pmf);

%Evaluate quantiles of interest
disp(cdf(5000))  %0.9763
for percentile = [0.025 0.25 0.5 0.75 0.975]
    disp(find(cdf>=percentile,1,'first'))
end

での累積分布関数は十分だと思いますが、最大を増やす感度を調べたいと思うかもしれません。の累積分布関数はないため、元のグリッドは実際に分位数を見つけるという目標と比較して、かなり有意なテール確率質量を逃しています。私が得た分位数は、 0.9990 N N = 5000 0.9763 0.975四分 0.025 0.25 0.5 0.75 0.975 N 95 149 235 478 4750N=1000000.9990maxN=500000NN=50000.97630.975

Quantile0.0250.250.50.750.975N951492354784750

免責事項:私はコードをあまりテストしませんでした、エラーが発生する可能性があります(そして、明らかにこのアプローチでも数値的な問題が発生する可能性があります)しかし、得られた分位数はRstanの結果に非常に近いので、かなり自信があります。


(+1)関心をお寄せいただきありがとうございます。私はあなたの手掛かりを取り、これらの結果をRで遊んで、あなたに連絡します。
Sycoraxは、モニカを復活させる

質問の最後に追加したものではなく、なぜベータ二項分布の事後があなたの表現であるのかを明確にしていただけませんか?事後は、単純にベータ二項尤度と事前確率の積であるように思えます。しかし、結果はかなり間違っているようです!
Sycorax氏は、モニカを2014

1
すべてのyは同じ共有するため、yが処理されるときにベータ分布のパラメーターを更新することが重要です。質問の最後の方程式は、異なるモデルであるごとに個別のを想定しています。θ Yθθy
トムミンカ2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.