私は後方からサンプリングしたいと思います。ここでLambdaAとLambdaBはAとBの指数レートです。また、yはr.v.の観測値です。ギブスを使用したR - RWメトロポリスは失敗します
後部は
によって与えられ、数値的な理由から、私はこの機能のログを取っています。
データ:後方の
n<-100
y<- c(rexp(n))
対数:
dmix<-function(LambdaA,LambdaB,w){
ifelse(LambdaA<=0|LambdaB<=0|w<0|w>1 ,0,log(w*LambdaA*LambdaB*exp(-2*(LambdaA+LambdaB))*prod(w*LambdaA*exp(-
LambdaA*y) + (1-w)*LambdaB*exp(-LambdaB*y))))}
U値
U.lambdaB <- runif(1)
U.lambdaA<- runif(1)
U.w<- runif(1)
Countが
REJLambdaB <- 1
REJw <- 1
REJLambdaA<-1
ステップ
初期点
LambdaB <- LambdaA<- w<- numeric(n)
LambdaA[1]<-0.5
LambdaB[1] <- 0.5
w[1] <- 0.5
ランダムウォークMHアルゴリズム、一度に各コンポーネントを更新:私はlogalpha年代を評価する際に無限大または0のいずれかを取得しておくので、
for (t in 2:n){
LambdaBprop<- rnorm(1,LB[t-1],0.5)
wprop<- rnorm(1,w[t-1],0.5)
LambdaAprop<- rnorm(1,LB[t-1],0.5)
logalpha1 = dmix(LambdaAprop,LambdaB[t-1],w[t-1])-dmix(LambdaA[t-1],LambdaB[t-
1],w[t-1])
logalpha2 = dmix(LambdaA[t-1],LambdaBprop,w[t-1])-dmix(LA[t-1],LB[t-1],w[t-
1])
if (!is.null(log(U.lambdaB) > logalpha2))
{LambdaB[t] <- LambdaBprop} ## accepted
else{LambdaB[t] <- LambdaB[t-1] ##rejected
REJLambdaB<-REJLambdaB+1}
if (!is.null(log(U.lambdaA) > logalpha1))
{LambdaA[t]<-LambdaAprop}
else {LambdaA[t]<-LambdaA[t-1]
REJLambdaA<-REJLambdaA+1}
if (w[t]<0|w[t]>1)
{w[t]<-w[t-1]}
else {w[t]<-wprop
REJw<-REJw+1}
}
は最終的に、私は私の後部に問題が生じています。ログ log($ \ alpha(x '| x))$とlog(U)を比較することを検討しています。このコードを動作させる助けとなることはありますか?あなたが本当にrandom walkが
lambdB[t]<- lambdB[t-1] + runif(1)
w[t]<- w[t-1] + runif(1)
lambdA[t] <- lambdB[t-1] + runif(1)
を意味すると思われる場合
Rのコーディングではなく、メトロポリスアルゴリズムの理解に問題があるため、この質問は[X validated](https://stats.stackexchange.com/posts/316382/revisions)に戻されるべきだと思います。 。 –