使用 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 函数和一切 运行 顺利!
首先,让我们创建一些具有 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 函数和一切 运行 顺利!