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

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所有组合的预测值,需要调整数据和模型:

  1. 生成所有组合的预测数据框:
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))
  1. 模型部分无需修改,循环会自动遍历所有组合的预测值。

额外验证建议

运行代码前可以先检查变量长度,确保匹配:

cat("pred.x1长度:", length(pred.x1), "\npred.x2长度:", length(pred.x2), "\nn.pred:", length(pred.x1), "\n")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:11:07