2016-09-28 53 views
0

我对R和OpenBugs相对较新,并且花了很多时间对这个模型进行故障排除。我可以通过在线资源自己找出相当数量的这些资源,但是我一直在困扰这个错误。它说这是“节点dummyy [1]的多重定义”。我在网上读到,这个错误通常是由于试图在没有索引的for循环中定义一个变量而引起的,但是我的变量是这样做的。我基于资源here创建了此模型。R - OpenBugs - 关于节点错误的多重定义 - 自定义分配

我努力寻找错误。下面列出的代码应该会产生我看到的同样的错误。我还包括我在OpenBugs上看到的日志错误。感谢您花时间帮助我。

数据:

library(R2OpenBUGS) 
n1=20 ; k1=1 ; m1=5; R.x=c(3,3,3,3,3); x=c(1.008195, 1.212885, 1.349857, 1.909607, 7.134668) 
n2=20 ; k2=1 ; m2=5; R.y=c(3,3,3,3,3); y=c(0.7507421, 1.3103649, 1.5022302, 1.7875087, 3.1900460) 

型号:

mtemp<-function(){ 
    for (i in 1:m1) 
    { 
    dummyx[i]<-0 
    dummyx[i] ~ dloglik(logLikex[i]) 
    logLikex[i] <- -log(a)-log(c)-(c-1.0)*log(x[i])+(a*k1*(R.x[i]+1.0)+1.0)*log(1.0 + pow(x[i],c)) 
    for(j in 1:m2){ 
    dummyy[j]<-0 
    dummyy[j] ~ dloglik(logLikey[j]) 
    logLikey[j] <- -log(b)-log(c)-(c-1.0)*log(y[j])+(b*k2*(R.y[j]+1.0)+1.0)*log(1.0 + pow(y[j],c)) 
    } 
    a ~ dgamma(0.001, 0.0001) 
    b ~ dgamma(0.001, 0.0001) 
    c ~ dgamma(0.001, 0.0001) 
    } 
} 

model.file <- file.path(tempdir(), "model.txt") #create temporary directory 
write.model(mtemp, model.file) #write to temporary directory 

file.show(model.file) #verify model was created 

datatemp<- list("x","y","R.x","k1","m1","R.y","k2","m2") 
    initstemp<-function(){list(a=7.0,b=7.0,c=4.5)} 
    bugstemp = bugs(data=datatemp,inits=initstemp,parameters=c("a","b","c"),model.file=model.file, 
        n.chains=3,n.iter= 10000, n.burnin=1000,n.thin=1, debug=T) 

日志报告:

model is syntactically correct 
data loaded 
multiple definitions of node dummyy[1] 
model must have been compiled but not updated to be able to change RN generator 
BugsCmds:NoCompileInits 
BugsCmds:NoCompileInits 
BugsCmds:NoCompileInits 
model must be compiled before generating initial values 
model must be initialized before updating 
model must be initialized before monitors used 
model must be initialized before monitors used 
model must be initialized before monitors used 
model must be initialized before monitors used 
model must be initialized before DIC can be monitored 
model must be initialized before updating 
model must be initialized before monitors used 
DIC monitor not set 

回答

2

你已经把右括号为M1环在模型的结尾,而比m2循环开始之前。这意味着所有哑铃,loglikey以及b和c都定义为m1次。

编辑:只是要清楚,你的模式应该是:

for (i in 1:m1) 
{ 
    dummyx[i]<-0 
    dummyx[i] ~ dloglik(logLikex[i]) 
    logLikex[i] <- ... 
} 
for(j in 1:m2) 
{ 
    dummyy[j]<-0 
    dummyy[j] ~ dloglik(logLikey[j]) 
    logLikey[j] <- ... 
} 
a ~ dgamma(0.001, 0.0001) 
b ~ dgamma(0.001, 0.0001) 
c ~ dgamma(0.001, 0.0001) 

而不是你目前有:

for (i in 1:m1) 
{ 
    dummyx[i]<-0 
    dummyx[i] ~ dloglik(logLikex[i]) 
    logLikex[i] <- ... 

for(j in 1:m2) 
{ 
    dummyy[j]<-0 
    dummyy[j] ~ dloglik(logLikey[j]) 
    logLikey[j] <- ... 
} 
a ~ dgamma(0.001, 0.0001) 
b ~ dgamma(0.001, 0.0001) 
c ~ dgamma(0.001, 0.0001) 
} 

希望帮助,

马特