R 破译陷阱-“;“索引超出范围”;WinBUGS中的消息

R 破译陷阱-“;“索引超出范围”;WinBUGS中的消息,r,winbugs,r2winbugs,winbugs14,R,Winbugs,R2winbugs,Winbugs14,我的任务是用更新的数据重新运行其他人的模型(我做了数据更新和格式化)。我了解模型是如何工作的,但没有编写它,而且它相当长而且详细。除此之外,我专门使用JAGS,这是我第一次涉入WinBUGS,所以界面和错误消息对我来说都是新的。该模型需要两天的编译时间(它确实编译了),但随后我得到了一个陷阱错误,即索引超出范围,后面是几十行我无法理解的代码。我已经检查了整个模型、循环和数据结构,我看不出哪里有索引问题。令人沮丧的是,与JAGS不同,WinBUGS似乎不会告诉您哪个索引超出范围 如果有人帮助我解码

我的任务是用更新的数据重新运行其他人的模型(我做了数据更新和格式化)。我了解模型是如何工作的,但没有编写它,而且它相当长而且详细。除此之外,我专门使用JAGS,这是我第一次涉入WinBUGS,所以界面和错误消息对我来说都是新的。该模型需要两天的编译时间(它确实编译了),但随后我得到了一个陷阱错误,即索引超出范围,后面是几十行我无法理解的代码。我已经检查了整个模型、循环和数据结构,我看不出哪里有索引问题。令人沮丧的是,与JAGS不同,WinBUGS似乎不会告诉您哪个索引超出范围

如果有人帮助我解码陷阱错误消息,我将不胜感激,以防其中的信息比我意识到的要多,无法指定索引不匹配的位置。我将在下面发布模型以及陷阱消息,但我不认为发布实际数据有什么意义,因为没有人会花2天时间等待模型编译以重现错误。相反,我将发布数据结构,以便每个数据对象的维度都是显而易见的

一些注意事项:我使用的是以前使用的精确模型(字面上是复制和粘贴的),因此我知道它应该可以工作。以前的数据文件是矩形格式的,而我创建和导出的数据文件是S格式的。我的理解是WinBUGS应该能够处理这两个问题,但我想知道这是否是问题的一部分。我直接从WinBUGS运行模型,手动加载模型和数据文件。我以前尝试过用r2winbugs从R中执行此操作,但出现了内存错误和崩溃

型号:

model{

  for(i in 1:n+nzeros){ # loop through the observed and unobserved areas
    for(j in 1:J){  #loop through the J fisheries areas 
      for(t in 1:T){ # loop through the years

        y[i,j,t] ~ dpois(mu.y[i,j,t])
        mu.y[i,j,t] <- lambda[i,j,t]*x[i,t]

        log(lambda[i,j,t]) <- mu.lambda[j]+ theta[z[i],j] + e.lambda[j,t] 

      }}}

  for(i in 1:n+nzeros){

    x[i,1] ~ dbern(gamma[i,1])
    recruitable[i,1]<-1

    for(t in 2:T){
      x[i,t] ~ dbern(mu.x[i,t])
      mu.x[i,t] <- survived[i,t] + gamma[i,t]*recruitable[i,t]
      recruitable[i,t] <- recruitable[i,t-1]*(1-x[i,t-1])
      survived[i,t] <- x[i,t-1]*phi[i,t-1]
    }}


  #priors

  for(c in 1:C){
    theta[c,1:J] ~ dmnorm(mu.th[], tau.th[,])

    for(j in 1:J){
      lcapture.clus[c,j]<-mu.lambda[j]+theta[c,j]
      pcapture.clus[c,j]<-1-exp(-exp(lcapture.clus[c,j]))
    }
  }

  for(j in 1:J){
    mu.th[j] <-0
    mu.lambda[j]~dnorm(0, 0.001)
    pcapture.overall[j]<-1-exp(-exp(mu.lambda[j]))

    for (t in 1:T){
      e.lambda[j,t] ~ dnorm(0, tau.e)
      lambda.area[j,t]<-mu.lambda[j]+e.lambda[j,t]
      p.area[j,t]<-1-exp(-exp(lambda.area[j,t]))
      #n.area[j,t]~dbin(p.area[j,t],N.area[j,t])
      N.area[j,t]<-n.area[j,t]/p.area[j,t]

      #N.area[j,t] ~ dunif(n.area[j,t],500)
      #N.area.round[j,t]<-round(N.area[j,t])
    }}



  tau.e <- 1/(sd.e*sd.e)
  sd.e ~ dunif(0,10)

  tau.th[1:J, 1:J] ~ dwish(B[,], v)
  sigma2[1:J, 1:J] <- inverse(tau.th[1:J,1:J])
  v<-J

  for(j1 in 1:J){
    B[j1,j1]<-1
    for(j2 in 1:j1-1){
      B[j1,j2]<-0
    }
    for(j2 in j1+1:J){
      B[j1,j2]<-0
    }
    for(j2 in 1:J){
      pd[j1,j2] <- step(sigma2[j1,j2])
    }}

  for(i in 1:n+nzeros){
    for(t in 1:T-1){
      logit(phi[i,t]) <- logit(mu.phi) + e.phi[z.cut[i],t]
    }

    gamma[i,1]~dunif(0,1)

    for(t in 2:T){
      logit(gamma[i,t]) <-logit(mu.gamma) + e.gamma[z.cut[i],t]
    }}

  for(c in 1:C){
    for (t in 1:T-1){ 
      e.phi[c,t] ~ dnorm(0, tau.phi)
      prob.phi[c,t]<-step(e.phi[c,t])
    }

    for(t in 2:T){
      e.gamma[c,t] ~ dnorm(0, tau.gamma)
    }}

  mu.gamma ~ dunif(0,1)
  tau.gamma <- 1/(sd.gamma*sd.gamma)
  sd.gamma ~ dunif(0,10)

  mu.phi ~ dunif(0,1)
  tau.phi <- 1/(sd.phi*sd.phi)
  sd.phi ~ dunif(0,10)


  # Clustering
  for(i in 1:n+nzeros){

    z[i] ~ dcat(w[])
    z.cut[i]<-cut(z[i]) 
    for(c in 1:C){
      post.prob[i,c] <- equals(z[i],c)}}
  for(c in 1:C){
    w[c] <- ww[c]/sum(ww[])
    r[c] ~ dbeta(1,a)
    NC[c] <- sum(post.prob[,c])
    cl[c] <- step(NC[c]-1)} 
  ww[1] <- r[1]
  for(c in 2:C){
    ww[c] <- r[c]*(1-r[c-1])*ww[c-1]/r[c-1]}          
  CLUSTERS <- sum(cl[])
  a<- 1 # controls prior smoothing


  #derived parameters
  for(i in 1:n+nzeros){
    for(c in 1:C){
      recruit[i,c,1]<-x[i,1]*equals(z[i],c)
      for(t in 2:T){
        recruit[i,c,t]<-(1-x[i,t-1])*(x[i,t])*equals(z[i],c)
        death[i,c,t] <- x[i,t-1]*(1-x[i,t])*equals(z[i],c)
        alive[i,c,t]<-x[i,t]*equals(z[i],c)
      }}}

  for(c in 1:C){
    for(t in 2:T){
      R[c,t]<-sum(recruit[1:n+nzeros,c,t])
      D[c,t]<-sum(death[1:n+nzeros,c,t])
      N[c,t]<-sum(alive[1:n+nzeros,c,t])
      Rpc[c,t]<-R[c,t]/N[c,t]
      recruitment.clus[c,t]<- exp(logit(mu.gamma) + e.gamma[c,t])/(1+exp(logit(mu.gamma) + e.gamma[c,t]))
    }

    for(t in 1:T-1){
      survival.clus[c,t] <- exp(logit(mu.phi) + e.phi[c,t])/(1+exp(logit(mu.phi) + e.phi[c,t]))
    }}

  for(t in 2:T){
    NN[t]<-sum(N[1:C, t])
    DD[t]<-sum(D[1:C, t])
    RR[t]<-sum(R[1:C, t])
    RRpc[t]<-RR[t]/NN[t]
  }

  #partitioned p values

  for (i in 1:n){
    for(j in 1:J){
      for (t in 1:T){
        y.new[i,j,t]~dpois(mu.y[i,j,t])


        # for predictive goodness of fit

        p0[i,j,t] <- equals(y[i,j,t],0)
        p0new[i,j,t]<-equals(y.new[i,j,t],0)

        count[i,j,t]<-y[i,j,t]
        countnew[i,j,t]<-y.new[i,j,t]

        for (c in 1:C){

          d.p0[i,j,t,c]<-p0[i,j,t]*equals(z[i],c)
          d.p0new[i,j,t,c]<-p0new[i,j,t]*equals(z[i],c)

          d.count[i,j,t,c]<-count[i,j,t]*equals(z[i],c)
          d.countnew[i,j,t,c]<-countnew[i,j,t]*equals(z[i],c)

        }}}}
  for(j in 1:J){
    for(t in 1:T){
      for(c in 1:C){
        fit1.p0[j,t,c] <- sum(d.p0[1:n,j,t,c])
        fit.new1.p0[j,t,c] <- sum(d.p0new[1:n,j,t,c])

        fit1.count[j,t,c] <- sum(d.count[1:n,j,t,c])
        fit.new1.count[j,t,c] <- sum(d.countnew[1:n,j,t,c])
      }}}

  for(t in 1:T){
    for(c in 1:C){
      fit2.p0[t,c] <- sum(fit1.p0[1:J,t,c])
      fit.new2.p0[t,c] <- sum(fit.new1.p0[1:J,t,c])

      fit2.count[t,c] <- sum(fit1.count[1:J,t,c])
      fit.new2.count[t,c] <- sum(fit.new1.count[1:J,t,c])
    }}

  for(c in 1:C){
    DF.p0[c] <- sum(fit2.p0[,c])
    DF.new.p0[c] <- sum(fit.new2.p0[,c])
    pvalue.p0[c] <- step(DF.new.p0[c] - DF.p0[c])

    DF.count[c] <- sum(fit2.count[,c])
    DF.new.count[c] <- sum(fit.new2.count[,c])
    pvalue.count[c] <- step(DF.new.count[c] - DF.count[c])
  }

  DFoverall.p0<-sum(DF.p0[1:C])
  DFoverall.new.p0<-sum(DF.new.p0[1:C])
  pvalueoverall.p0<-step(DFoverall.new.p0-DFoverall.p0)


  DFoverall.count<-sum(DF.count[1:C])
  DFoverall.new.count<-sum(DF.new.count[1:C])
  pvalueoverall.count<-step(DFoverall.new.count-DFoverall.count)

}
最后是陷阱错误:

index out of range

 HostWindows.AppendInt   [000002B7H] 
    .d  ARRAY 12 OF CHAR    "080'069'784'"
    .i  INTEGER 12
    .j  INTEGER 1971081876
    .len    INTEGER 1971172856
    .n  INTEGER 1
    .s  ARRAY 256 OF CHAR   " Allocated Memory: "   ...
    .useSeparators  BOOLEAN TRUE
 HostWindows.UpdateInfo   [000048B8H] 
    .res    INTEGER 2291852
    .sstr   ARRAY 256 OF SHORTCHAR  "l˜""   ...
    .str    ARRAY 256 OF CHAR   " Allocated Memory: "   ...
 HostWindows.Idle   [00004A73H] 
    .focus  BOOLEAN FALSE
    .tick   Controllers.TickMsg Fields
    .w  HostWindows.Window  NIL
 HostMenus.TimerTick   [00003422H] 
    .lParam INTEGER 0
    .ops    Controllers.PollOpsMsg  Fields
    .wParam INTEGER 1
    .wnd    INTEGER 459558
 Kernel.Try   [00003A61H] 
    .a  INTEGER 459558
    .b  INTEGER 1
    .c  INTEGER 0
    .h  PROCEDURE   HostMenus.TimerTick
 HostMenus.ApplWinHandler   [00003841H] 
    .Proc   PROCEDURE   NIL
    .hit    BOOLEAN Undefined117
    .lParam INTEGER 0
    .message    INTEGER 275
    .res    INTEGER 2292416
    .s  ARRAY 256 OF SHORTCHAR  9AX, 4X, 0CX   ...
    .w  INTEGER 0
    .wParam INTEGER 1
    .wnd    INTEGER 459558
<system>   (pc=757CC4E6H,  fp=0022FB3CH)
<system>   (pc=757CC5E6H,  fp=0022FBB4H)
<system>   (pc=757CCC18H,  fp=0022FC14H)
<system>   (pc=757C2E40H,  fp=0022FC24H)
 HostMenus.Loop   [00003BDEH] 
    .done   BOOLEAN FALSE
    .f  SET {0..5}
    .n  INTEGER 10
    .res    INTEGER 0
    .w  HostWindows.Window  NIL
 Kernel.Start   [00002B8CH] 
    .code   PROCEDURE   HostMenus.Loop
索引超出范围
HostWindows.AppendInt[000002B7H]
.d字符“080'069'784'”的数组12
.i整数12
.j整数1971081876
.len整数1971172856
.n整数1
.s字符“已分配内存:”的数组256。。。
.useSeparators布尔值为TRUE
HostWindows.UpdateInfo[000048B8H]
.res整数2291852
.sstr数组256的短字符“l†”。。。
.str数组256字符“已分配内存:”。。。
HostWindows.Idle[00004A73H]
.focus布尔值为FALSE
.tick Controllers.tickmg字段
.w主机窗口。窗口为零
HostMenus.TimerTick[00003422H]
.lpram整数0
.ops控制器.PollOpsMsg字段
.wParam整数1
.wnd整数459558
Kernel.Try[00003A61H]
.a整数459558
.b整数1
.c整数0
.h程序HostMenus.TimerTick
HostMenus.ApplWinHandler[00003841H]
.Proc程序无
.命中布尔值未定义117
.lpram整数0
.信息整数275
.res整数2292416
.s阵列256个快捷键9AX、4X、0CX。。。
.w整数0
.wParam整数1
.wnd整数459558
(pc=757CC4E6H,fp=0022FB3CH)
(pc=757CC5E6H,fp=0022FBB4H)
(pc=757CCC18H,fp=0022FC14H)
(pc=757C2E40H,fp=0022FC24H)
HostMenus.Loop[00003BDEH]
.done布尔值为FALSE
.f集{0..5}
.n整数10
.res整数0
.w主机窗口。窗口为零
Kernel.Start[00002B8CH]
.code过程HostMenus.Loop

非常感谢您的帮助!-Josh

是否可以使用相同结构的数据子集尝试该模型?您可以探索它是否真的是一个索引问题,而不必在两次尝试之间等待几天。因此,您甚至可以在JAGS中尝试该模型。我最初的计划是jus我不能在JAGS中运行它,但不幸的是,在从WinBUGS到JAGS的传输过程中,有一些函数没有执行,这需要进行重大的重写。我肯定可以尝试使用数据的子集运行它,这是一个有趣的想法。WinBUGS有时会在出现不同的潜在问题时抛出索引错误吗?我以前试过直接从r2winbugs运行它,但出现了内存错误,这就是为什么我切换到在GUI中手动运行它。因此,这可能仍然是一个问题。这看起来像是R语言(可能是Fortran?)以外的消息,而不是R消息。是的,错误直接来自WinBUGS,它是用BlackBox生成的(不确定底层语言是什么)。这被标记为“r”,因为WinBUGS通常是通过r运行的。但错误直接来自WinBUGS,而不是r。您是否查看了
[WinBUGS]上SO或google搜索的所有点击索引超出范围
?阅读您关于移植到JAGS的可能性的评论,我还想知道是否可以探索使用OpenBUGS。
> dim(y)
[1] 727   7  41
> dim(x.data)
[1] 727  41
> dim(n.area)
[1]  7 41
> J
[1] 7
> T
[1] 41
> n
[1] 627
index out of range

 HostWindows.AppendInt   [000002B7H] 
    .d  ARRAY 12 OF CHAR    "080'069'784'"
    .i  INTEGER 12
    .j  INTEGER 1971081876
    .len    INTEGER 1971172856
    .n  INTEGER 1
    .s  ARRAY 256 OF CHAR   " Allocated Memory: "   ...
    .useSeparators  BOOLEAN TRUE
 HostWindows.UpdateInfo   [000048B8H] 
    .res    INTEGER 2291852
    .sstr   ARRAY 256 OF SHORTCHAR  "l˜""   ...
    .str    ARRAY 256 OF CHAR   " Allocated Memory: "   ...
 HostWindows.Idle   [00004A73H] 
    .focus  BOOLEAN FALSE
    .tick   Controllers.TickMsg Fields
    .w  HostWindows.Window  NIL
 HostMenus.TimerTick   [00003422H] 
    .lParam INTEGER 0
    .ops    Controllers.PollOpsMsg  Fields
    .wParam INTEGER 1
    .wnd    INTEGER 459558
 Kernel.Try   [00003A61H] 
    .a  INTEGER 459558
    .b  INTEGER 1
    .c  INTEGER 0
    .h  PROCEDURE   HostMenus.TimerTick
 HostMenus.ApplWinHandler   [00003841H] 
    .Proc   PROCEDURE   NIL
    .hit    BOOLEAN Undefined117
    .lParam INTEGER 0
    .message    INTEGER 275
    .res    INTEGER 2292416
    .s  ARRAY 256 OF SHORTCHAR  9AX, 4X, 0CX   ...
    .w  INTEGER 0
    .wParam INTEGER 1
    .wnd    INTEGER 459558
<system>   (pc=757CC4E6H,  fp=0022FB3CH)
<system>   (pc=757CC5E6H,  fp=0022FBB4H)
<system>   (pc=757CCC18H,  fp=0022FC14H)
<system>   (pc=757C2E40H,  fp=0022FC24H)
 HostMenus.Loop   [00003BDEH] 
    .done   BOOLEAN FALSE
    .f  SET {0..5}
    .n  INTEGER 10
    .res    INTEGER 0
    .w  HostWindows.Window  NIL
 Kernel.Start   [00002B8CH] 
    .code   PROCEDURE   HostMenus.Loop