使用OpenBUGS,R和R2OpenBUGS包的Dirichlet-Categorical共轭先验模型

时间:2015-12-08 12:43:27

标签: r bayesian

首先,让我们创建一些包含3个级别的样本分类数据。

y<-sample(c("A","B","C"),50,replace=TRUE)

我试图制定贝叶斯统计模型,其中y变量遵循参数theta1,theta2,theta3的分类分布。这些参数描述单个y [i]属于相应类别的概率。在贝叶斯的观点中,这些参数也是随机变量,我们用它们在它们之前用超参数alpha1,alpha2,alpha3分配一个dirichlet。

我似乎遇到了一些语法问题。

CODE

model<-function(){
  #likelihood
  for( i in 1:N){
  y[i]~ dcat(theta[])
  }
  #prior
  theta[1:3]~ ddirch(alpha[])
}
library(R2OpenBUGS) 
model.file <- file.path(tempdir(),"model.txt") 
write.model(model, model.file)
y<-sample(c("A","B","C"),50,replace=TRUE)
N<-50
alpha<-c(1,1,1)
data<-list('y','N','alpha')
params<-c('theta')
inits<-function(){theta=c(1/3,1/3,1/3)}

我们通过R调用OpenBUGS,错误函数

out<-bugs(data,inits,params,model.file,n.chains = 2
          ,n.iter=6000,codaPkg = TRUE,n.burnin = 1000,DIC = TRUE)

我已经尝试了不同的方法来语法表达上面的代码,运行错误并熟悉log.txt文件(即保存OpenBUGS输出的文件),直到此代码给我一个日志。当R仍有问题时,没有错误的txt。

R输出

  Error in bugs.run(n.burnin, OpenBUGS.pgm, debug = debug, WINE = WINE,  : 
  Look at the log file in  /tmp/Rtmpofdk0t  and
try again with 'debug=TRUE' to figure out what went wrong within OpenBUGS.
In addition: Warning message:
In FUN(X[[i]], ...) : class of 'x' was discarded

log.txt的

OpenBUGS version 3.2.3 rev 1012
model is syntactically correct
data loaded
model compiled
initial values generated, model initialized
1000 updates took 0 s
monitor set
monitor set
monitor set
monitor set
deviance set

提前感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我认为你应该用alpha1,alpha2,alpha3重命名theta1,theta2,theta3,因为你在函数ddirch中使用alpha1,...但是你永远不会声明它们。相反,你声明theta1等等,但从不使用它们。

如果还有其他问题,您可以查看日志文件,就像编译器建议的那样。

答案 1 :(得分:0)

经过多次实验,我发现由于某些原因,OpenBUGS无法接受像往常一样给出的因子变量。所以我用as.numeric R函数将数据(格式为“A”,“B”,“C”)更改为数字(格式1,2,3),一切运行顺利!