使用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
相关产品推荐
相关产品推荐

