You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JAGS执行网状Meta分析时出现索引越界错误求助

问题:WinBUGS正常运行的网状Meta分析代码在JAGS中编译报错

将原本在WinBUGS中可正常运行的网状Meta分析模型代码迁移到JAGS时出现编译错误,WinBUGS仍能正常执行,报错提示为数组索引越界。

模型代码

model{                            
for(i in 1:ns){                     
  w[i,1] <- 0    
  delta[i,1] <- 0           
  mu[i] <- log(p[i,1])
  p[i,1] ~ dunif(0,1)     
  for (k in 1:na[i]) {             
    r[i,k] ~ dbin(p[i,k],n[i,k]) 
   }
  for (k in 2:na[i]) {             
    log(p[i,k]) <- mu[i] + min(delta[i,k], -log(p[i,1]))
    delta[i,k] ~ dnorm(md[i,k],taud[i,k])
    md[i,k] <-  d[t[i,k]] - d[t[i,1]] + sw[i,k]
    taud[i,k] <- tau *2*(k-1)/k
    w[i,k] <- (delta[i,k] - d[t[i,k]] + d[t[i,1]])
    sw[i,k] <- sum(w[i,1:k-1])/(k-1)
   }
 }   

d[1]<-0       
for (k in 2:nt){  d[k] ~ dnorm(0,.1) }
sd ~ dunif(0,2)    
tau <- pow(sd,-2)  

for (c in 1:(nt-1)) {  
  for (k in (c+1):nt)  { 
      lnRR[c,k]<- d[c] - d[k]
      RR[c,k]<- exp(d[c]-d[k])
      lnRR[k,c]<- d[k] - d[c]
      RR[k,c]<- exp(d[k]-d[c])
   }  
 }

for (k in 1:nt) { 
  rk[k] <- rank(d[],k)  
  best[k] <- equals(rk[k],1)    

  for (h in 1:nt){  prob[h,k] <- equals(rk[k],h)  }
 }
}            

输入数据代码

col_1<- c(1007 , 105, 1912,  467,  577 , 709 , 142,  100)

col_2 <-c(1012 , 109, 1913 , 460 , 586 , 714,  153 , 103)

n<-matrix(data=c(col_1, col_2),      # matrix of patients in each arm per trial
          nrow=length(col_1), ncol=2)

col_1 <- c(79 , 0  ,9 , 7, 10, 31,  0,  5)

col_2 <- c( 95 , 0 ,13, 17,  9 ,31 , 0 , 3)

r<-matrix(data=c(col_1, col_2),      # matrix of events in each arm per trial
          nrow=length(col_1), ncol=2)

col_1 <- c( 12,  2, 13,  4,  4,  5,  6 , 8)

col_2 <- c( 95 , 0 ,13, 17,  9 ,31 , 0 , 3)

t<-matrix(data=c(col_1, col_2),       # matrix of treatments (go from 1 to 14 in the database)
          nrow=length(col_1), ncol=2)

na<-rep(2, dim(n))

ns<-dim(n)[1]

nt<-14

info <- list ("n", "r", "t", "na", "ns", "nt")

parameters <- c("RR","lnRR", "rk",  "best")

library(R2jags)

jags(data= info, 
     parameters.to.save = parameters, 
     model.file = model.file, 
     n.chains = 3, 
     n.thin = nt, 
     n.iter = 3000,
     n.burnin = 500)

报错信息

Error in jags.model(model.file, data = data, inits = init.values, n.chains = n.chains,  : 
  RUNTIME ERROR:
Compilation error on line 16.
Index out of range taking subset of  w

问题原因与解决方案

原因

JAGS与WinBUGS在运算符优先级处理上存在差异:

  • WinBUGS会将1:k-1解析为1:(k-1);
  • JAGS则优先计算1:k,再对结果减1,当k=2时,1:k-1会变成0,1,导致访问w[i,0](数组索引从1开始),触发索引越界错误。

解决方案

修改模型代码第16行的索引表达式,给k-1加上括号明确优先级:

sw[i,k] <- sum(w[i,1:(k-1)])/(k-1)

修改后重新编译模型即可解决该错误。

内容的提问来源于stack exchange,提问作者Claudio Laudani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 18:36:24