第n个"无效的父值"错误

时间:2016-10-26 21:13:06

标签: jags

我希望你能帮助我一个非常简单的模型,我现在正在Rjags中运行。 我的数据如下:

> print(data)
$R
225738      184094       66275       24861       11266
228662      199379       70308       27511       12229
246808      224814       78255       30447       13425
254823      236063       83099       33148       13961
263772      250706       89182       35450       14750
272844      262707       96918       37116       15715
280101      271612      102604       38692       16682
291493      283018      111125       40996       18064
310474      299315      119354       44552       19707
340975      322054      126901       47757       21510
347597      332946      127708       49103       21354
354252      355994      130561       51925       22421
366818      393534      140628       56562       23711
346430      400629      146037       59594       25313
316438      399545      150733       62414       26720
303294      405876      161793       67060       29545

$N
9597000     8843000     9154000     9956000    11329000
9854932     9349814     9532373    10195193    11357751
9908897     9676950     9303113    10263930    11141510
9981879     9916245     9248586    10270193    10903446
10086567    10093723     9307104    10193818    10660101
10242793    10190641     9479080    10041145    10453320
10434789    10222806     9712544     9835154    10411620
10597293    10238784    10014422     9611918    10489448
10731326    10270163    10229259     9559334    10502839
10805148    10339566    10393532     9625879    10437809
10804571    10459413    10466871     9800559    10292169
10696317    10611599    10477448    10030407    10085603
10540942    10860363    10539271    10245334     9850488
10411836    11053751    10569913    10435763     9797028
10336667    11152428    10652017    10613341     9850533
10283624    11172747    10826549    10719741     9981814

$n
[1] 16

$na
[1] 5

$pbeta
[1] 0.70 0.95

,模型如下:

cat('model{
## likelihoods ##
for(k in 1:na){ for(w in 1:n){ R[w,k] ~ dbin( theta[w,k], N[w,k] ) }}

for(k in 1:na){ for(w in 1:n){ theta[w,k]  <- 0.5*beta[w,k]*0.5 }}

for(k in 1:na){
    beta[1,k] ~ dunif(pbeta[1], pbeta[2])           
    beta.plus[1,k] <- beta[1,k]                             
    for (w in 2:n){                             
    beta.plus[w,k] ~ dunif(beta[(w-1),k], 0.95)             
    beta[w,k] <- beta.plus[w,k]} } }',
file='model1.bug')

######## initial random values for beta
bbb=bb.plus=matrix(rep(NA, 16*5), byrow=T, ncol=5);  
for(k in 1:5){ 
    bbb[1,k]=runif(1, 0.7,0.95); 
    for (w in 2:16){ 
        bb.plus[w,k] = runif(1, bbb[w-1,k], 0.95); 
        bbb[w,k]=bb.plus[w,k]} }

## data & initial values
inits1 <- list('beta'= bbb )

jags_mod <- jags.model('model1.bug', data=data, inits=inits1, n.chains=1, n.adapt=1000)
update(jags_mod, n.iter=1000)
posts=coda.samples(model=jags_mod,variable.names=c('beta','theta'), n.iter=niter, thin=1000)

超级简单。这实际上是一个比较复杂的缩小模型,它给出了我在这里得到的完全相同的错误信息。 每当我运行这个模型时,根本没有问题。 您会注意到参数beta的先验是以从0.7增加到0.95的方式编写的。

现在我想&#34;关闭&#34; R通过注释掉模型的第一行来获得R的可能性。我想这样做,看看在任何情况下如何估计参数theta(基本上我应该在这种情况下找到theta = beta / 4,但这对我没问题)

当我这样做时,我得到一个&#34;无效的父母&#34;参数beta的误差,通常在矩阵的底行(行15或16)中。 实际上它比这更复杂:有时候我会收到错误,有时我不会(大多数情况下都是这样)。

我不喜欢&#39;理解为什么会发生这种情况:不应该根据可能性的存在/不存在而生成beta值?

很抱歉,如果这是一个天真的问题,我真的希望你能帮助我解决这个问题。 谢谢,最好! Emanuele的

1 个答案:

答案 0 :(得分:1)

在更多地使用模型后,我想我找到了问题的原因。均匀分布的一个必要方面(即unif(a,b))是a&lt; b。当您在模型中使均匀分布变得越来越小时,您将a越来越接近b。有时,它无法访问它,但有时候a等于b,您会收到无效的父值错误。例如,在您的模型中,如果包括:

example ~ dunif(0.4,0.4)

您将在节点示例中获得&#34;错误,无效的父值&#34;。

因此,为了解决这个问题,我认为更容易调整指定先验的方式而不是随机分配它们。您可以使用beta发行版执行此操作。在第一步,beta(23.48, 4.98)涵盖了从0.7到0.95的大部分范围,但我们可以截断它以确保它位于该范围之间。然后,当n增加时,您可以降低4.98,以便先前收缩至0.95。下面的模型将执行此操作。检查先验后,theta确实等于beta/4

data.list <- list( n = 16, na = 5,
                   B = rev(seq(0.1, 4.98, length.out = 16))) 

cat('model{
## likelihoods ##
    #for(k in 1:na){ for(w in 1:n){ R[w,k] ~ dbin( theta[w,k], N[w,k] ) }}

    for(k in 1:na){ for(w in 1:n){ theta[w,k]  <- 0.5*beta[w,k]*0.5 }}
    for(k in 1:na){
    for(w in 1:n){
    beta[w,k] ~ dbeta(23.48, B[w]) T(0.7,0.95)           

    } } }',
    file='model1.bug')

jags_mod <- jags.model('model1.bug', data=data.list, 
inits=inits1, n.chains=1, n.adapt=1000)

update(jags_mod, n.iter=1000)

posts=coda.samples(model=jags_mod,
variable.names=c('beta','theta'), n.iter=10000, thin=10)

查看此模型的一些输出,我们得到

     beta[1,1] theta[1,1]
[1,] 0.9448125  0.2362031
[2,] 0.7788794  0.1947198
[3,] 0.9498806  0.2374702

0.9448125/4
[1] 0.2362031

由于我并不真正知道您尝试使用该模型的原因,我不知道beta版本是否适合您的需求,但上述方法将模仿您尝试做的事情。