OpenBUGS错误"预期的多变量节点"

时间:2014-05-31 10:05:40

标签: winbugs r2winbugs

我在R中编写了一个使用R2OpenBUGS的程序。代码在底部给出。运行它时会出现以下错误 -

model is syntactically correct
data loaded
expected multivariate node
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

请帮我纠正代码 -

以下是OpenBUGS代码。

## BUGS Model 
model {
# model for joint distribution of nuhat
nuhat[1:m]~dmnorm(mean[], B[,])
for(i in 1:m){
  mean[i]<-mu
}
B[1:m,1:m]<-SIGMA[1:m,1:m]+tau2*inverse(C[1:m,1:m])
C[1:m,1:m]<-DW[1:m,1:m]-rho*W[1:m,1:m]

# priors on parameters
mu~dunif(-5,5)
rho~dunif (-1,1)
tau2~dunif (0, 1000)  
} 

## Data
list(m=5, nuhat=c(-0.228352281,-0.290119586,-0.211553228,-0.252395328,-0.263358489),
SIGMA=structure(.Data=c( 1.451677,0,0,0,0,
                         0,1.578091,0,0,0,
                         0,0,1.386538,0,0,
                         0,0,0,1.484578,0,
                         0,0,0,0,1.500409),  .Dim=c(5,5)), 
DW=structure(.Data=c(2,0,0,0,0,
                     0,2,0,0,0,
                     0,0,3,0,0,
                     0,0,0,2,0,
                     0,0,0,0,1), .Dim=c(5,5)),
W=structure(.Data=c(0,1,1,0,0,
                    1,0,0,1,0,
                    1,0,0,1,1,
                    0,1,1,0,0,
                    0,0,1,0,0), .Dim=c(5,5)))

## Inits
list(mu=-1,tau2=1,rho=0.5)

1 个答案:

答案 0 :(得分:2)

OpenBUGS不允许您为确定性节点分配矩阵,就像它对随机节点一样。例如(暂时忘记模型中的BSIGMADW实际上是...),

B[1:m, 1:m] ~ dwish(SIGMA[,], 5)

没关系,但是

B[1:m, 1:m]  <- SIGMA[,] + DW[,]

似乎不起作用。相反,你必须创建一个循环来分配矩阵的每个元素,例如

for(i in 1:m){
  for(i in 1:m){
    B[i, j]  <- SIGMA[i, j] + DW[i, j]
  }
}

代码中的inverse转换(它是B计算的一部分)不能以元素方式完成,因此必须超出任何为确定性矩阵元素赋值的循环。< / p>

考虑到这两个规则,如果您重新表达为:

,您的模型将会起作用
model {
# model for joint distribution of nuhat
nuhat[1:m]~dmnorm(mean[], B[,])
for(i in 1:m){
  mean[i]<-mu
}
for(i in 1:m){
  for(j in 1:m){
    B[i,j] <- SIGMA[i,j] + tau2*invC[i,j]
    C[i,j] <- DW[i,j] - rho*W[i,j]
  }
}
invC[1:m,1:m]<-inverse(C[1:m,1:m])

# priors on parameters
mu~dunif(-5,5)
rho~dunif (-1,1)
tau2~dunif (0, 1000)  
}