简体   繁体   中英

Gibbs Sampler (Albert and Chib) for Binary Probit (rbprobitGibbs) A precision matrix

Presently, I am working through the above in the RStudio help file, which contains the following sample:

##
## rbprobitGibbs example
##
if(nchar(Sys.getenv("LONG_TEST")) != 0) {R=2000} else {R=10}

set.seed(66)    
simbprobit = function(X,beta) {
    ##  function to simulate from binary probit including x variable
    y=ifelse((X%*%beta+rnorm(nrow(X)))<0,0,1)
    list(X=X,y=y,beta=beta)
}

nobs=200
X=cbind(rep(1,nobs),runif(nobs),runif(nobs))
beta=c(0,1,-1)
nvar=ncol(X)
simout=simbprobit(X,beta)

Data1=list(X=simout$X,y=simout$y)
Mcmc1=list(R=R,keep=1)

out=rbprobitGibbs(Data=Data1,Mcmc=Mcmc1)

summary(out$betadraw,tvalues=beta)

if(0){
    ## plotting example
    plot(out$betadraw,tvalues=beta)
}

When I step through the code, I don't see anywhere that the A matrix is set. It is only when I reach this line:

out=rbprobitGibbs(Data=Data1,Mcmc=Mcmc1)

That I see the A matrix displayed in the output, which I understand has to be ak * k matrix, where betabar is k * 1 matrix.

Prior Parms: 
betabar
# [1] 0 0 0
A
#      [,1] [,2] [,3]
# [1,] 0.01 0.00 0.00
# [2,] 0.00 0.01 0.00
# [3,] 0.00 0.00 0.01

So I can understand how A gets its dimensions; however, what is not clear to my is how the values in A are set to 0.01 . I am trying to figure out how I can allow a user calling the rbprobitGibbs function to set the precision via A to whatever they like. I can see where A is output, but how are its values based on some input? Does anyone have any suggestions? TIA.

UPDATE:

Here is the output produced, but as far as I can determine it is identical whether I use prior = list(rep(0,3), .2*diag(3)) or not:

> out
$betadraw
           [,1]      [,2]       [,3]
 [1,] 0.3565099 0.6369436 -0.9859025
 [2,] 0.4705437 0.7211755 -1.1955608
 [3,] 0.1478930 0.6538157 -0.6989660
 [4,] 0.4118663 0.7910846 -1.3919411
 [5,] 0.0385419 0.9421720 -0.7359932
 [6,] 0.1091359 0.7991905 -0.7731041
 [7,] 0.4072556 0.5183280 -0.7993501
 [8,] 0.3869478 0.8116237 -1.2831395
 [9,] 0.8893555 0.5448905 -1.8526630
[10,] 0.3165972 0.6484716 -0.9857531
attr(,"class")
[1] "bayesm.mat" "mcmc"      
attr(,"mcpar")
[1]  1 10  1

It gets this factor by a scaling constant on the prior precision matrix. In the source, you will note that if you do not supply a prior precision then it will generate a square k matrix and multiply it by .1. Nothing fancy here. These scaling parameters for all of the various functions in bayesm can be found in the ./bayesm/R/bayesmConstants.R file .

    if (is.null(Prior$A)) {
        A = BayesmConstant.A * diag(nvar)
    }

Should you like to you could supply your own constant, say .2 , you could do so as follows, prior = list(rep(0,k), .2*diag(k)) , or even introduce some relational information into the prior.

Very late to the party, but I ran across this same issue and just figured it out. In order to change the A matrix and prior matrix you have to name them as well since all of your other input variables are named.

For example your code should be,

rbprobitGibbs(Data=Data1, Prior=list(betabar=betabar1, A=A1), Mcmc=Mcmc1)

If you do that, you are able to set your own values for betabar and A.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM