0

我对 R 和 OpenBugs 比较陌生,并且花了很多时间对这个模型进行故障排除。我已经能够通过在线资源自己弄清楚其中的相当数量,但我被这个错误困住了。它说这是“节点虚拟[1]的多个定义”。我在网上读到这个错误通常是由于试图在没有索引的 for 循环中定义一个变量引起的,但我的变量有。我根据这里的资源创建了这个模型。

我努力寻找错误。下面列出的代码应该会产生与我看到的相同的错误。我还包括了我在 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
4

1 回答 1

2

您已将 m1 循环的右大括号放在模型的末尾,而不是在 m2 循环的开始之前。这意味着所有 dummyy、loglikey 以及 ab 和 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)
}

希望有帮助,

马特

于 2016-09-28T21:46:23.693 回答