0

次のステートメントがあるとします。

for (i in 1:N) {
    pi[i,1] <- ....
    pi[i,2] <- ....
    pi[i,3] <- ....
    ...
    pi[i,100] <- ...
    Y[i] ~ dcat(p[i,])
}

としましょうY[1] = 5。ジャグはすべてのpi[1,1:100]ノードを評価しますか、それとも必要なノードのみを評価しpi[1,5]ますか?

私の経験から、JAGS はすべての親ノードを非効率的に評価しているようです。これは、dcat を取り除いた後、私のモデルが 3 倍高速化されたためです。のさまざまな結果のために、複数の for ループを使用する必要がありましたY[i]

dcatここで、JAGS では が実際には必要なくsum(pi[]) = 1、合計が 1 にdcatなるように正規化されることに気付きました。これは、すべてのノードを評価する必要があることを意味します。pi[]

これはとても悲しいことです。必要な唯一の親ノードのみを評価するスマートな同等物はありますか? dcatWinBUGS と Stan はどうですか?

4

2 に答える 2

0

あなたの例には、私が答えるのに十分な詳細がありません。右側にいくつかの式を追加しました。

for (i in 1:N) {
    pi[i,1] <- funx(alpha)
    pi[i,2] <- funy(alpha)
    pi[i,3] <- funz(beta)
    ...
    pi[i,100] <- funw(beta)
    Y[i] ~ dcat(p[i,])
}

ノード alpha を更新する場合、alpha の更新を担当するサンプラーは and を評価する必要がfunx(alpha)ありますが、 orは評価する必要はありfuny(alpha)ません(beta が alpha の決定論的関数ではない場合)。したがって、この場合、 andは評価されますが、orは評価されません。これらの他のノードは、現在の値を保持します。funz(beta)funw(beta)pi[i,1]pi[i,1]pi[i,3]pi[i,100]

ただし、尤度の計算では、合計を計算して p を正規化するために、すべてのノードの現在の値を逆参照する必要があります。逆参照は安価ですが、何度も行うと高価になります。たとえば、p[i,1]p[i,100]

for (i in 1:N) {
    for (j in 1:M) {
        pi[i,j] ~ dexp(1)
     }
    Y[i] ~ dcat(p[i,])
}

次に、N*M*M反復ごとに逆参照操作があり、すぐに追加できます。

したがって、あなたが求めているのはp[i,]、尤度計算の合計をキャッシュし、変更された要素のみに基づいて更新するサンプラーであり、他の要素を逆参照する必要がないと思います。これは JAGS では利用できませんが、将来のバージョンで対応できる可能性があります。

于 2014-11-28T18:13:00.050 に答える
-1

dbern を使用するだけで、求めていることを実行できると思います。

for(i in 1:N){
    pi[i,1] <- ...
    ...
    pi[i,100] <- ...

    Ones[i] ~ dbern(pi[i,Y[i])
}

ここで、Ones[] は data で長さ 1 の N ベクトルとして指定されます。

ただし、すべての pi[] は引き続き計算されます。これは、モデル内のノードであり、JAGS (または WinBUGS/stan) には、関心のあるノードとそうでないノードを判断する方法がないためです。各 i に対して pi[] の値を 1 つ持ち、Y[i] インデックスの使用を pi[i] 方程式の右側にシフトすることで、これを回避できる場合があります。これが可能かどうかを判断するのに十分な詳細を提供してください。

マット

于 2014-11-30T15:59:18.817 に答える