2013-01-22 41 views
0

我無法得到下面的WinBUGS代碼工作。它適用於普通的先驗,但不適用於統一的先驗。單擊compile後出現的錯誤消息是array index is greater than array upper bound for age。那是什麼意思?請任何人請幫助我處理下面的代碼?WinBUGS代碼錯誤

model 
{ 
for (i in 1:n) { 
# Linear regression on logit 
logit(p[i]) <- alpha + b.sex*sex[i] + b.age*age[i] 
# Likelihood function for each data point 
frac[i] ~ dbern(p[i]) 
} 
alpha ~ dunif(0, 1) # Prior for intercept 
b.sex ~ dunif(0, 1) # Prior for slope of sex 
b.age ~ dunif(0, 1) # Prior for slope of age 
} 
Data 
list(sex=c(1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0,  1, 
1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1,  1, 0, 
0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1,  1, 1, 
0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1), 
age= c(69, 57, 61, 60, 69, 74, 63, 68, 64, 53, 60, 58, 79, 56, 53, 74, 56, 76, 72, 
56, 66, 52, 77, 70, 69, 76, 72, 53, 69, 59, 73, 77, 55, 77, 68, 62, 56, 68, 70, 60, 
57, 51, 51, 63, 57, 80, 52, 65, 72, 80, 73, 76, 79, 66, 51, 76, 75, 66, 75, 78, 70, 
67, 51, 70, 71, 71, 74, 74, 60, 58, 55, 61, 65, 52, 68, 75, 52, 53, 70), 
frac=c(1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1,  0, 
1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,  1, 1, 
1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1,  1, 1, 
1, 0, 1, 1, 0, 0, 1, 0, 0, 1), 
n=100) 
Initial Values 
list(alpha=0.5, b.sex=0.5, b.age=0.5) 
+0

這是對您的問題非常模糊的描述。你應該更具體地說明它爲什麼不起作用。無論如何,我沒有看到你的代碼中有任何統一的先驗 - 只有正常。 – TMS

+0

@Tomas,我的道歉。我編輯了這個問題。你會在這種情況下建議什麼? –

回答

4

哦,這很明顯。 WinBUGS說array index is greater than array upper bound for age。 這顯然暗示了錯誤 - >我看你有沒有n = 100age列表不夠長:

> your_list <- list(...) 
> str(your_list) 
List of 4 
$ sex : num [1:100] 1 1 1 0 1 1 0 0 0 0 ... 
$ age : num [1:79] 69 57 61 60 69 74 63 68 64 53 ... 
$ frac: num [1:100] 1 1 1 0 1 1 0 1 1 0 ... 
$ n : num 100 

反正,我不會用統一的前這裏;除非你真的知道你在做什麼,否則我會建議平坦正常,如dnorm(0, 1.0E-10)左右。您還應該允許係數的負值。 「零假設」通常是係數爲零,因此對於係數後驗分佈的平均值爲零,您應該「讓它從雙方都有一定的空間」(直覺地說)。

+0

感謝您的評論。實際上,我使用貝葉斯方法的唯一原因是獲得正迴歸係數。可以做些什麼來做到這一點?正常的先驗工作,但統一的不工作。任何建議來處理這個? –

+0

我用'dbeta(1,1)'而不是'dunif(0,1)',因爲據我所知他們是平等的。是對的嗎?無論如何,它現在有效。這會在輸出中產生什麼影響嗎?此外,我想知道爲什麼測試版的前期工作,但統一的先例不。 –

+0

@Edo,你提到它沒有工作,因爲索引,所以我的建議應該幫助! – TMS