基于先验数据搭建JAGS模型遇拟合失败,求技术指点
JAGS模型拟合故障排查
我已经完成JAGS模型函数的编写,但使用现有数据进行模型拟合时无法正常运行。以下是全部操作步骤及数据片段,恳请帮忙排查错误原因,我推测问题可能出在数据传递环节,但不确定具体问题,盼得到相关指导。
1. 搭建的JAGS函数
jags.mod = function(){ #观测模型 for (i in 2:N) { Ohio[i] ~ dnorm(Y[i],tau.v) } Ohio[1] ~ dnorm(Y[1],tau.v) tau.v ~ dgamma(1,0.01) #系统模型 for(i in 2:N){ Y[i] ~ dnorm(Y[i-1],tau.w) } Y[1] ~ dnorm(6,0.001) tau.w ~ dgamma(1,0.01) sigma.w = 1/sqrt(tau.w) }
2. 数据准备与模型拟合代码
# 转换为JAGS要求的列表格式 jags.data = as.list(Ohio_pm25) # 需监控的参数 jags.param = c('Y', 'tau.w', 'sigma.w') # 指定2条链的初始值 inits1 = list('Y' = -5, 'tau.w' = 10) inits2 = list('Y' = 5, 'tau.w' = -10) jags.inits = list(inits1, inits2) # 拟合JAGS模型 jags.mod.fit = jags(data = jags.data, # jags.data为ohio_PM2.5 inits = jags.inits, parameters.to.save = jags.param, n.chains = 2, n.iter = 100000, n.burnin = 5000, n.thin = 1, model.file = jags.mod, DIC = FALSE)
3. 数据片段
ohio_data
X Obs Exp SMR 1 1 14 15.678357 0.8929507 2 2 56 62.786481 0.8919117 3 3 26 26.953383 0.9646284 4 4 57 59.448398 0.9588147 5 5 21 25.710943 0.8167728 6 6 22 24.764319 0.8883749 7 7 67 52.437394 1.2777141 8 8 18 19.082278 0.9432836
ohio_pm2.5
Ohio_pm25 Date pm2.5 1 1988-01-01 3.100000 2 1988-01-02 3.000000 3 1988-01-03 8.600000 4 1988-01-04 8.866667 5 1988-01-05 2.800000 6 1988-01-06 3.400000 7 1988-01-07 4.600000 8 1988-01-08 3.900000
核心问题及修正方案
观测变量名不匹配
模型中调用的观测变量是Ohio,但Ohio_pm25数据框里的观测列是pm2.5,JAGS无法识别对应变量。二选一修正:- 重命名数据列:
colnames(Ohio_pm25)[2] <- "Ohio" - 修改模型变量名:把
Ohio[i]改成pm2.5[i]
- 重命名数据列:
未传入样本量N
模型中使用了循环变量N,但数据列表未包含该参数,JAGS无法确定循环长度。需补充:jags.data = list(Ohio = Ohio_pm25$pm2.5, N = nrow(Ohio_pm25))初始值错误
tau.w是gamma分布的精度参数,必须为正数,inits2中tau.w = -10违反分布要求,需改为正数(如tau.w = 5)Y是与观测同长度的状态向量,初始值不能只给单个数值,需生成对应长度的向量:inits1 = list(Y = rnorm(nrow(Ohio_pm25), 0, 1), tau.w = 10) inits2 = list(Y = rnorm(nrow(Ohio_pm25), 0, 1), tau.w = 5)
模型代码冗余优化
观测模型的循环可简化为for (i in 1:N),无需单独编写Ohio[1]的行,减少冗余。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

