R语言贝叶斯分析:第19行编译错误求助
问题描述
我正在处理一个包含234行、4个变量(鱼类年龄Fish Age、汞浓度Mercury Concentration (Hg)、距河口距离Distance from Mouth、站点编号Site #)的数据框,尝试用多元线性回归分析年龄和距河口距离对鱼类Hg浓度的影响。运行R代码时出现如下错误:
Error in jags.model(file = model.file, data = data, inits = inits, n.chains =n.chains, :
RUNTIME ERROR:
Compilation error on line 19.
Index out of range taking subset of pred.x2
我的代码如下:
library(jagsUI) #library(coda) ##### READ AND PREPARE DATA ##### dat = read.csv("Exercise_1_3_data-1.csv") #plot the data plot(Hg ~ Age, data = dat) plot(Hg ~ Dist, data = dat) # x1=Age # x2=Dist # compile data into a list to pass to BUGS pred.x1 = seq(1, 10, 0.5) # predicted x1 values pred.x2 = seq(0, 90, 10) # predicted x2 values jags.dat = list(n.obs = nrow(dat), y = dat$Hg, x1 = dat$Age, x2 = dat$Dist, pred.x1 = pred.x1, pred.x2 = pred.x2, n.pred=length(pred.x1)) ##### SPECIFY MODEL CODE ##### cat(file="model.txt", " model { # PRIORS b0 ~ dnorm(0,1E-6) b1 ~ dnorm(0, 1E-6) b2 ~ dnorm(0, 1E-6) sig ~ dunif(0,100) tau <- 1/pow(sig, 2) # LIKELIHOOD for(i in 1:n.obs){ y[i] ~ dnorm(y.hat[i], tau) y.hat[i] <- b0 + b1 * x1[i] + b2 * x2[i] } #DERIVED QUANTITIES for(i in 1:n.pred){ pred.y[i] <- b0 + b1 * pred.x1[i] + b2 * pred.x2[i] } } ") ##### INITIAL VALUES ##### inits1 = list(b0 = rnorm(1), b1 = rnorm(1), b2 = rnorm(1), sig = rlnorm(1)) inits2 = list(b0 = rnorm(1), b1 = rnorm(1), b2 = rnorm(1), sig = rlnorm(1)) inits = list(inits1, inits2) ##### PARAMETERS TO MONITOR ##### params = c("b0", "b1", "b2", "sig", "pred.y") ##### MCMC DIMENSIONS ##### ni = 5000 nb = 1000 nt = 1 nc = 2 ##### RUN THE MODEL IN jags ##### # should take about 10 seconds starttime = Sys.time() jags.fit = jags(data = jags.dat, inits = inits, parameters.to.save = params, model.file = "model.txt", n.thin = nt, n.chains = nc, n.burnin = nb, n.iter = ni, parallel = F)
问题原因与解决方案
错误根源
你定义的pred.x1和pred.x2长度不一致:
pred.x1 = seq(1,10,0.5)的长度是19(计算方式:(10-1)/0.5 +1 = 19)pred.x2 = seq(0,90,10)的长度是10(计算方式:(90-0)/10 +1 =10)
但在JAGS模型的DERIVED QUANTITIES部分,你用n.pred=length(pred.x1)(即19)作为循环上限,当循环到i=11到19时,pred.x2[i]超出了它的索引范围(最大只有10),因此触发了"Index out of range"错误。
修正方案
根据你的需求选择以下两种方式之一:
方案1:让预测变量长度一致
调整其中一个预测序列的长度,使其和另一个匹配。比如修改pred.x2生成和pred.x1等长的序列:
pred.x1 = seq(1, 10, 0.5) pred.x2 = seq(0, 90, length.out = length(pred.x1)) # 生成与pred.x1等长的序列 jags.dat = list(n.obs = nrow(dat), y = dat$Hg, x1 = dat$Age, x2 = dat$Dist, pred.x1 = pred.x1, pred.x2 = pred.x2, n.pred=length(pred.x1))
或者修改pred.x1匹配pred.x2的长度:
pred.x2 = seq(0, 90, 10) pred.x1 = seq(1, 10, length.out = length(pred.x2)) jags.dat = list(n.obs = nrow(dat), y = dat$Hg, x1 = dat$Age, x2 = dat$Dist, pred.x1 = pred.x1, pred.x2 = pred.x2, n.pred=length(pred.x2))
方案2:生成所有组合的预测值(适合双变量全组合预测)
如果你想得到Age和Distance所有组合的预测值,需要调整数据和模型:
- 生成所有组合的预测数据框:
pred_grid = expand.grid(pred.x1 = seq(1,10,0.5), pred.x2 = seq(0,90,10)) jags.dat = list(n.obs = nrow(dat), y = dat$Hg, x1 = dat$Age, x2 = dat$Dist, pred.x1 = pred_grid$pred.x1, pred.x2 = pred_grid$pred.x2, n.pred = nrow(pred_grid))
- 模型部分无需修改,循环会自动遍历所有组合的预测值。
额外验证建议
运行代码前可以先检查变量长度,确保匹配:
cat("pred.x1长度:", length(pred.x1), "\npred.x2长度:", length(pred.x2), "\nn.pred:", length(pred.x1), "\n")
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

