使用rstan的贝叶斯有序逻辑回归模型语法排查及函数报错问题
贝叶斯IRT单维2PL GRM构建报错排查
问题描述
我参考已发表论文的分级响应模型(有序逻辑回归)代码,使用brms构建贝叶斯IRT单维2PL GRM,代码如下:
# Load packages ---- library(rstan) library(tidyverse) library(brms) # Bayes IRT Unidimensional 2pl GRM ---- formula_uni <- bf( resp | thres(gr = item) ~ 1 + (1 | id), disc ~ 1 + (1 |i| item) ) prior_uni <- prior("normal(0, 3)", class = "Intercept") + prior("constant(1)", class = "sd", group = "id") + prior("normal(0, 1)", class = "sd", group = "item", dpar = "disc") ## Posterior Samples ---- fit_uni <- brm( formula = formula_uni, data = tsc_dat1, family = brmsfamily("cumulative", "logit", link_disc = "log"), prior = prior_uni, iter = 5000, chains = 4, cores = 4 )
运行时出现语法错误,报错信息如下:
Compiling Stan program... SYNTAX ERROR, MESSAGE(S) FROM PARSER: No matches for: log_inv_logit_diff(real, real) Function log_inv_logit_diff not found. error in 'model61a4787630c_d5da0bad07704d69638ca1b1ee168864' at line 19, column 84 ------------------------------------------------- 17: return log1m_inv_logit(disc * (thres[nthres] - mu)); 18: } else { 19: return log_inv_logit_diff(disc * (thres[y] - mu), disc * (thres[y - 1] - mu)); ^ 20: } -------------------------------------------------
请问该模型语法是否正确?此报错是遗漏加载包还是其他原因导致?
解答
模型语法正确性
你的模型语法是正确的:
- 公式中
thres(gr=item)指定每个项目对应独立阈值,符合GRM的核心设定; disc ~ 1 + (1|i|item)为项目区分度设置随机效应,是2PL GRM的标准写法;- 先验设置合理:截距项用宽正态先验,被试能力标准差固定为1(满足IRT模型识别要求),区分度的随机效应标准差用正态先验;
- 族设置
brmsfamily("cumulative", "logit", link_disc = "log")准确,cumulative对应分级响应模型,link_disc="log"保证区分度为正。
报错原因
这个报错和加载包无关,核心原因是你的rstan/brms版本过低:log_inv_logit_diff是Stan 2.26及以上版本新增的函数,旧版本rstan(对应旧版Stan)未包含该函数,导致编译时无法识别。
解决办法
升级rstan和brms到最新版本:
# 升级brms install.packages("brms", dependencies = TRUE) # 若rstan版本过旧,先卸载再安装 remove.packages("rstan") install.packages("rstan", dependencies = TRUE)
升级完成后重启R会话,再重新运行模型代码即可。
内容的提问来源于stack exchange,提问作者user2450223
相关产品推荐
相关产品推荐

