JAGS中inprod函数非合规参数报错咨询及代码排查
问题:JAGS中inprod()函数"非合规参数"报错的含义与解决
我们采用贝叶斯方法,通过马尔可夫链蒙特卡罗(MCMC)采样未知参数与未观测因子的联合后验分布,用高频指标估计需求指数。运行JAGS代码时触发如下报错:
Error in jags.model(model.file, data = data, inits = init.values, n.chains = n.chains, :
RUNTIME ERROR:
Non-conforming parameters in function inprod
请问该报错中“inprod()函数的非合规参数”具体含义是什么?
相关代码如下:
#Jags code jagsscript <- cat(" model { # Estimate the initial state vector for(i in 1:14) { X[i,1] ~ dnorm(0,1) # weakly informative normal prior xknot[i] <- X[i,1] } # B matrix of interactions for (r in 3:14){ B[r,1] <- 0 } for (r in c(2:14)){ B[r,2] <- 0 } for (r in c(1:2, 4:14)){ B[r,3] <- 0 } for (r in c(1:3, 5:14)){ B[r,4] <- 0 } for (r in c(1:4, 6:14)){ B[r,5] <- 0 } for (r in c(1:5, 7:14)){ B[r,6] <- 0 } for (r in c(1:6, 8:14)){ B[r,7] <- 0 } for (r in c(1:7, 9:14)){ B[r,8] <- 0 } for (r in c(1:8, 10:14)){ B[r,9] <- 0 } for (r in c(1:9, 11:14)){ B[r,10] <- 0 } for (r in c(1:10, 12:14)){ B[r,11] <- 0 } for (r in c(1:11, 13:14)){ B[r,12] <- 0 } for (r in c(1:12, 14)){ B[r,13] <- 0 } for (r in c(1:13)){ B[r,14] <- 0 } B[1, 1] <- phi[1] B[1, 2] <- phi[2] B[2, 1] <- 1 for (n in 3:12){ B[n,n] <- rho[n-2] } B[13, 13] <- 1 B[14, 14] <- 1 for (n in 1:10){ rho[n] ~ dunif(-1, 1) } phi[1] ~ dnorm(0, 1.3) phi[2] ~ dnorm(0, 1.3) for (r in 1:10){ Z[r,2] <- 0 } for (r in 2:11){ Z[r,3] <- 0 } for (r in c(1, 3:11)){ Z[r,4] <- 0 } for (r in c(1,2, 4:11)){ Z[r,5] <- 0 } for (r in c(1:3, 5:11)){ Z[r,6] <- 0 } for (r in c(1:4, 6:11)){ Z[r,7] <- 0 } for (r in c(1:5, 7:11)){ Z[r,8] <- 0 } for (r in c(1:6, 8:11)){ Z[r,9] <- 0 } for (r in c(1:7, 9:11)){ Z[r,10] <- 0 } for (r in c(1:8, 10:11)){ Z[r,11] <- 0 } Z[11,1] <- beta[1] Z[11,2] <- beta[2] Z[1, 1] <- ld[1] Z[2, 1] <- ld[2] Z[3, 1] <- ld[3] Z[4, 1] <- ld[4] Z[5, 1] <- ld[5] Z[6, 1] <- ld[6] Z[7, 1] <- ld[7] Z[8, 1] <- ld[8] Z[9, 1] <- ld[9] Z[10, 1] <- ld[10] Z[11,12] <- 1 Z[1,3] <- 1 Z[2,4] <- 1 Z[3,5] <- 1 Z[4,6] <- 1 Z[5,7] <- 1 Z[6,8] <- 1 Z[7,9] <- 1 Z[8,10] <- 1 Z[9,11] <- 1 Z[10,12] <- 1 Z[11,13] <- 1 beta[1] ~ dbeta(2.21, 12.53) beta[2] ~ dbeta(2.21, 12.53) for (i in 1:10){ ld[i] ~ dnorm(0, 1.3) } # Autoregressive process for(t in 2:nYears) { for(i in 1:14) { predX[i,t] <- inprod(B[i,], X[,t-1]) X[i,t] ~ dnorm(predX[i,t], tauQ[states[i]]) } } tauQ[1] ~ dscaled.gamma(1, 10) Q1 <- 1 / tauQ[1] Q2 <- 1 / tauQ[2] Q2 <- 0 for( i in 3:14){ tauQ[i] ~ dscaled.gamma(1, 10) } Q3 <- 1 / tauQ[3] Q4 <- 1 / tauQ[4] Q5 <- 1 / tauQ[5] Q6 <- 1 / tauQ[6] Q7 <- 1 / tauQ[7] Q8 <- 1 / tauQ[8] Q9 <- 1 / tauQ[9] Q10 <- 1 / tauQ[10] Q11 <- 1 / tauQ[11] Q12<- 1 / tauQ[12] Q13 <- 1 / tauQ[13] Q14 <- 1 / tauQ[14] # Observation model for(t in 1:nYears) { for(i in 1:11) { predY[i,t] <- inprod(Z[i,], X[,t]) Y[i,t] ~ dnorm(predY[i,t], tauR[hf[i]]) } } for( i in 1:11){ tauR[i] ~ dscaled.gamma(1, 10) } R1 <- 1 / tauR[1] R2 <- 1 / tauR[2] R3 <- 1 / tauR[3] R4 <- 1 / tauR[4] R5 <- 1 / tauR[5] R6 <- 1 / tauR[6] R7 <- 1 / tauR[7] R8 <- 1 / tauR[8] R9 <- 1 / tauR[9] R10 <- 1 / tauR[10] R11 <- 1 / tauR[11] } ",file="marss-jags.txt") #putting data tdat <- t(hf_cycle) jags.data <- list(Y = tdat, nYears = ncol(tdat), states = 1:14, hf = 1:11) jags.params <- c("ld", "rho", "beta","phi", "xknot", "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "Q1", "Q2", "Q3", "Q4","Q5","Q6","Q7","Q8","Q9","Q10", "Q11", "Q12","Q13","Q14") model.loc <- "marss-jags.txt" #running jags mod_1 <- jags(jags.data, parameters.to.save = jags.params, model.file = model.loc, n.chains = 2, n.burnin = 2000, n.thin = 1, n.iter = 5000)
报错含义与问题分析
报错核心含义
inprod()是JAGS中用于计算向量内积的函数,"Non-conforming parameters"报错的本质是:传入函数的两个输入并非长度一致的一维向量,无法完成内积运算。具体可能有两种情况:
- 两个输入的向量长度不同;
- 一个是行向量,另一个是列向量(JAGS中行/列向量属于不同维度的对象,不能直接做内积)。
代码中的具体问题
状态方程内积维度不匹配
在自回归过程的循环中:predX[i,t] <- inprod(B[i,], X[,t-1])B[i,]是矩阵B的第i行,属于长度为14的行向量;X[,t-1]是矩阵X的第t-1列,属于长度为14的列向量。
JAGS不支持行向量与列向量直接计算内积,必须将其中一个转换为一维向量。
观测方程内积长度不匹配
在观测模型的循环中:predY[i,t] <- inprod(Z[i,], X[,t])X[,t]是长度为14的列向量(对应14个状态变量);- 代码中仅对Z矩阵的第1-13列赋值,
Z[i,]的长度为13,与X[,t]的长度14不匹配,无法计算内积。
修复建议
- 修复状态方程内积:使用
as.vector()将列向量转换为一维向量,修改代码为:predX[i,t] <- inprod(B[i,], as.vector(X[,t-1])) - 修复观测方程内积:补充Z矩阵第14列的赋值(例如设为0),确保
Z[i,]的长度为14,与X[,t]长度一致,比如添加:for(r in 1:11){ Z[r,14] <- 0 } - 清理冗余代码:删除
Q2 <- 1 / tauQ[2]之后的Q2 <- 0,避免覆盖有效赋值。
内容的提问来源于stack exchange,提问作者Md Arbaj Meman
相关产品推荐
相关产品推荐

