2016-09-28 52 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) 
} 

希望幫助,

馬特