2012-02-27 96 views
4

我試圖用OpenBUGS通過R(R2OpenBUGS)將觀察「時間」建模爲隨機變量。如果所有的觀測時間都可用(沒有NA),一切都可以正常工作,但如果我將其中一個時間設置爲NA,則什麼都不會發生。我用WinBUGS測試了相同的代碼,並得到陷阱錯誤'NIL dereference(read)'。所以我的問題是,在我的代碼中是否存在真正的錯誤,或者我的模型對於BUGS太奇怪了?OpenBUGS:伯努利分佈中的缺失值

我的模式是這樣的:

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) 

回答

4

如果我理解你的問題很好,你問這個表達式

obs[i] ~ dbern(p) 
對於Win/OpenBUGS,

很奇怪,因此它不會處理缺失的值。不,我不這麼認爲;錯誤能夠以這種方式處理缺失的值,甚至可以用後驗分佈對它們進行補償。

但是我有一個強烈的懷疑,

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

真的很怪!這可能會導致錯誤,因爲您強制使用空值爲obs[i]的觀察值來計算索引。這真的很奇怪,你應該嘗試找到另一種方式來做到這一點。首先嚐試簡化模型來跳過這條規則,我敢打賭問題就消失了。

+0

謝謝你,你說的對,那條線太怪了...... – 2012-02-28 12:44:15

+0

@Hemmo,很高興聽到它有幫助! – TMS 2012-02-29 21:12:39