使用 OpenBUGS、R 和包 R2OpenBUGS 的狄利克雷分类共轭先验模型

Dirichlet-Categorical conjugate prior model using OpenBUGS,R and the package R2OpenBUGS

首先,让我们创建一些具有 3 个级别的示例分类数据。

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

我试图建立一个贝叶斯统计模型,其中 y 变量服从参数 theta1、theta2、theta3 的分类分布。这些参数描述了单个 y[i] 属于相应类别的概率。从贝叶斯的角度来看,这些参数也是随机变量,我们使用超参数 alpha1,alpha2,alpha3 在它们之前分配一个 dirichlet。

我的语法似乎有些问题。

代码

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,带有bugs函数

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

我已经尝试了不同的方法来在语法上制定上述代码,逐步解决错误并熟悉 log.txt 文件(即保存 OpenBUGS 输出的文件),直到这段代码给了我一个log.txt 没有错误,而 R 仍然有问题。

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

在此先感谢您的帮助

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

如果有任何其他问题,您可能会按照编译器的建议查看日志文件。

经过多次实验,我发现由于某种原因,OpenBUGS 无法接受像往常一样给出的因子变量。所以我用 as.numeric R 函数和一切 运行 顺利!