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

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中行/列向量属于不同维度的对象,不能直接做内积)。

代码中的具体问题

  1. 状态方程内积维度不匹配
    在自回归过程的循环中:

    predX[i,t] <- inprod(B[i,], X[,t-1])
    
    • B[i,]是矩阵B的第i行,属于长度为14的行向量;
    • X[,t-1]是矩阵X的第t-1列,属于长度为14的列向量。
      JAGS不支持行向量与列向量直接计算内积,必须将其中一个转换为一维向量。
  2. 观测方程内积长度不匹配
    在观测模型的循环中:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:15:54