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
相关产品推荐
相关产品推荐

