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

R/JAGS取子集时维度不匹配错误的解决方案咨询

解决JAGS中转移概率计算的维度不匹配问题

错误说明

运行代码时出现以下编译错误:

Error in jags.model(model.file, data = data, inits = init.values, n.chains = n.chains, :
RUNTIME ERROR:
Compilation error on line 7.
Dimension mismatch taking subset of alpha

问题根源

  • 矩阵索引错误:模型中调用ddirch时,误将alpha[行索引, 列范围]写成alpha[元素范围]。JAGS中矩阵按列优先存储,alpha[1:S]会提取矩阵展开为向量后的前S个元素,而非目标行的所有列,导致参数维度与p的维度不匹配。
  • alpha矩阵定义冗余:定义alpha时设置nrow=4,但仅提供3行数据,R会自动循环填充第4行,引入不必要干扰。
  • 数据列表格式错误:jags.data用字符串当元素名,未传递变量实际值,导致JAGS无法读取正确数据。

修正后的完整代码

setwd("C:/Users/nibir/OneDrive/MA Applied Economics/Phd courses/Dissertation/code")

library(rjags)
library(runjags)
library(coda)
library(R2jags)

tt <- matrix(c(1251, 350, 0, 17,
               0, 731, 0, 15,
               0, 0, 0, 0),
             ncol = 4, nrow = 3, byrow = TRUE)

# 修正模型中的alpha索引
modelstring="model{
  
  p[1, 1:S] ~ ddirch(alpha[1, 1:S])
  p[2, 1:S] ~ ddirch(alpha[2, 1:S])
  p[3, 1] <- 0
  p[3, 2] <- 0
  p[3, 3:S] ~ ddirch(alpha[3, 3:S])
  
  tt[1, 1:S] ~ dmulti(p[1, 1:S], n[1])
  tt[2, 1:S] ~ dmulti(p[2, 1:S], n[2])
  tt[3, 3:S] ~ dmulti(p[3, 3:S], n[3])
}"

writeLines(modelstring, con = "TEMPmodel.txt")

S <- 4
n <- apply(tt, 1, sum)
# 修正alpha的行数为3,匹配状态数
alpha <- matrix(c(.88,.08,.02,.02,
                  .1,.7,.1,.1,
                  0,0,.7,.3),ncol = 4, nrow = 3, byrow = TRUE)
params <- c("p")
# 修正数据列表格式,传递变量实际值
jags.data <- list(S=S, n=n, alpha=alpha, tt=tt) 

set.seed(100)
jagsfit <- jags(data = jags.data, parameters.to.save = params,
                model.file = "TEMPmodel.txt", n.chains = 3,
                n.iter = 10000, n.thin = 5, progress.bar = "none")

print(jagsfit)

关键修正点

  • 将alpha[1:S]改为alpha[1, 1:S],明确提取alpha矩阵第1行所有列作为Dirichlet先验参数,同理修正第2行和第3行的索引。
  • 将alpha的nrow设为3,与3个状态对应,避免自动填充冗余行。
  • 调整jags.data为键值对形式,确保JAGS能正确读取各变量的实际数据。

内容的提问来源于stack exchange,提问作者Md. Zubab Ibne Moid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:35:27