用于二进制Probit的Gibbs采样器(Albert和Chib)(rbprobitGibbs)精度矩阵

时间:2016-07-29 01:59:10

标签: r bayesian

目前,我正在使用RStudio帮助文件中的上述内容,其中包含以下示例:

##
## 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)
}

当我单步执行代码时,我看不到A矩阵设置的任何地方。只有当我到达这条线时:

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

我看到输出中显示的A矩阵,我理解必须是k * k矩阵,其中betabar是k * 1矩阵。

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

所以我可以理解A是如何得到它的尺寸的;但是,我不清楚的是A中的值是如何设置为0.01的。我试图找出如何允许用户调用rbprobitGibbs函数通过A将精度设置为他们喜欢的任何东西。我可以看到A输出的位置,但它的值是如何基于某些输入的?有没有人有什么建议? TIA。

更新:

以下是产生的输出,但据我所知,无论我是否使用prior = list(rep(0,3), .2*diag(3)),它都是相同的:

> 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

2 个答案:

答案 0 :(得分:1)

它通过先前精度矩阵的缩放常数得到此因子。在源代码中,您将注意到如果您不提供先前的精度,那么它将生成一个方形k矩阵并将其乘以.1。没什么好看的。可以在./bayesm/R/bayesmConstants.R file中找到bayesm中所有各种功能的缩放参数。

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

如果您愿意提供自己的常量,比如说.2,您可以按照以下方式prior = list(rep(0,k), .2*diag(k))执行此操作,或者甚至将一些关系信息引入先前。

答案 1 :(得分:0)

参加聚会很晚,但是我遇到了同样的问题,只是想出了办法。为了更改A矩阵和先前的矩阵,您还必须命名它们,因为所有其他输入变量都已命名。

例如您的代码应该是

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

如果这样做,则可以为betabar和A设置自己的值。