SLIDE 159 ❘ ❈♦❞❡ ❢♦r ●✐❜❜s ❙❛♠♣❧❡r
Gibbs Sampler for Probit-Normal Intercept Model
# Priors same as for probit and linear model with IW prior for (b1,b2) vbeta<-solve(T0+crossprod(X,X)) # Posterior Var(beta) -- can do outside loop # GIBBS SAMPLER for (i in 1:nsim) { # Binomial Model # Draw Latent Variable, z muz<-X%*%beta+rep(b1,nis) # Mean of z z[y1==0]<-qnorm(runif(N,0,pnorm(0,muz)),muz)[y1==0] z[y1==1]<-qnorm(runif(N,pnorm(0,muz),1),muz)[y1==1] # Update beta mbeta <- vbeta%*%(T0%*%beta0+crossprod(X,z-rep(b1,nis))) beta<-c(rmvnorm(1,mbeta,vbeta)) # Update b1|b2 taub12<-taub1/(1-rhob^2) # Prior precision of b1|b2 mb12<-rhob*sqrt(taub2/taub1)*b2 # Prior mean of b1|b2 vb1<-1/(nis+taub12) # Posterior var of b1|b2,y mb1<-vb1*(taub12*mb12+tapply(z-X%*%beta,id,sum)) # Posterior mean of b1|b2,y b1<-rnorm(n,mb1,sqrt(vb1)) # Linear Model # Update gamma vgam<-solve(G0+taue*crossprod(X)) # G0 is prior precision of gamma mgam<-vgam%*%(G0%*%gamma0 + taue*crossprod(X,y2-rep(b2,nis))) gamma<-c(rmvnorm(1,mgam,vgam)) # Update taue l<-l0+crossprod(y2-X%*%gamma-rep(b2,nis))/2 taue<-rgamma(1,d0+N/2,l) # Update b2|b1 taub21<-taub2/(1-rhob^2) # Prior precision of b2|b1 mb21<-rhob*sqrt(taub1/taub2)*b1 # Prior mean of b2|b1 vb2<-1/(taue*nis+taub21) # Posterior var of b2|b1 mb2<-vb2*(taub21*mb21+taue*tapply(y2-X%*%gamma,id,sum)) b2<-rnorm(n,mb2,sqrt(vb2)) b<-cbind(b1,b2) # Update variance components Sigmab<-riwish(nu0+n,c0+crossprod(b)) rhob<-Sigmab[1,2]/sqrt(Sigmab[1,1]*Sigmab[2,2]) taub1<-1/Sigmab[1,1] taub2<-1/Sigmab[2,2] } # 7.4 seconds to run 1000 iterations with n=1000 and N=5441
✶✺✾ ✴ ✶✻✵