首先,让我们创建一些包含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
提前感谢您的帮助
答案 0 :(得分:1)
我认为你应该用alpha1,alpha2,alpha3重命名theta1,theta2,theta3,因为你在函数ddirch中使用alpha1,...但是你永远不会声明它们。相反,你声明theta1等等,但从不使用它们。
如果还有其他问题,您可以查看日志文件,就像编译器建议的那样。
答案 1 :(得分:0)
经过多次实验,我发现由于某些原因,OpenBUGS无法接受像往常一样给出的因子变量。所以我用as.numeric
R函数将数据(格式为“A”,“B”,“C”)更改为数字(格式1,2,3),一切运行顺利!