我正在尝试使用r(r2openbugs)与Openbugs模拟观察“时间”作为随机变量。如果所有观察时间都有(没有NA),一切都可以工作,但如果我将其中一个次设置为NA,则没有任何反应。我用winbug测试了相同的代码,我得到了陷阱错误'nil dereference(读取)'。所以我的问题是我的代码中真的有问题,或者是我的模型太奇怪了吗?

我的模型是这样的:

model{
 for(i in 1:k){
  obs[i] ~ dbern(p) #is the observation done at time 1 or 2?
  y[(i-1)*2 + obs[i]+1] <- x[i]
 }    
 for(i in 1:n){    
   y[i] ~ dnorm(mu,tau) 
 }    
 mu ~ dnorm(0,0.0001)
 tau~ dgamma(0.001,0.001)  
 p ~ dunif(0,1) 
}
.

和R代码如下所示:

library(R2OpenBUGS)
x<-obs<-rep(NA,5)
for(i in 1:k)
{
  obs[i]<-sample(c(0,1),1) #observation time of ith observation
  x[i]<-rnorm(1) #observed values
}

obs[2]<-NA #one of the sampling times is missing
INITS <- list(list(tau=1,mu=0,p=0.5))
DATA  <- list(x=x,n=n,k=k,obs=obs)

ob <- bugs(
  data=DATA,
  inits=INITS,
  parameters.to.save=c("tau","mu","p","y"),
  model.file="BUGSModel.R",
  n.chains=1,
  n.iter=50,
  n.burnin=10,
  n.thin=1,    
  DIC=FALSE)
.

有帮助吗?

解决方案

如果我很了解你的问题,你会问这个表达式

obs[i] ~ dbern(p)
.

对于Win / OpenBugs非常奇怪,以便它不会处理缺失的值。不,我不这么认为;错误能够以这种方式处理缺失的值,甚至可以赋予它们 - 后部分布。

但我有强烈怀疑

y[(i-1)*2 + obs[i]+1] <- x[i]
.

真的很奇怪!这可能会导致错误的错误,因为您的力使用为null的观察生耦合码代码来计算索引。这真的很奇怪,你应该尝试找到另一种方法来做到这一点。首先尝试简化模型来跳过这条规则,我打赌问题消失了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top