使用brms处理结果定义不完善的逻辑回归问题遇阻
不完美检测下的疾病概率模型错误排查与修正
问题根源
你当前的模型公式中,nlf(p~inv_logit(X1 + X2 + X3))直接将协变量相加,没有为每个协变量指定待估计的回归系数,brms无法识别需要估计X1/X2/X3的效应,因此只输出了Se和Sp的后验结果。
修正方案
有两种更规范的写法可以让brms正确估计协变量系数:
写法一:手动声明系数(适合需要自定义系数名称的场景)
# 修正后的模型公式 bform <- bf( Y ~ q, nlf(q ~ Se * p + (1 - p) * (1 - Sp)), nlf(p ~ inv_logit(b0 + b1*X1 + b2*X2 + b3*X3)), Se + Sp ~ 1, b0 + b1 + b2 + b3 ~ 1, # 明确声明这些是待估计的参数 nl = TRUE, family = bernoulli("identity") ) # 补充系数的先验(可根据业务需求调整) bprior <- set_prior("beta(4.6, 0.86)", nlpar = "Se", lb = 0, ub = 1) + set_prior("beta(77.55, 4.4)", nlpar = "Sp", lb = 0, ub = 1) + set_prior("normal(0, 2)", nlpar = "b0") + set_prior("normal(0, 2)", nlpar = "b1") + set_prior("normal(0, 2)", nlpar = "b2") + set_prior("normal(0, 2)", nlpar = "b3") # 运行模型 model <- brm(bform, data = bd, prior = bprior, init = "0") summary(model)
写法二:利用brms线性预测器语法(更简洁,推荐)
直接通过eta ~ X1 + X2 + X3声明协变量效应,brms会自动生成对应系数:
# 修正后的模型公式 bform <- bf( Y ~ q, nlf(q ~ Se * p + (1 - p) * (1 - Sp)), p ~ inv_logit(eta), eta ~ X1 + X2 + X3, # 常规公式写法,自动处理协变量效应 Se + Sp ~ 1, nl = TRUE, family = bernoulli("identity") ) # 补充先验,为eta的所有系数统一设置先验 bprior <- set_prior("beta(4.6, 0.86)", nlpar = "Se", lb = 0, ub = 1) + set_prior("beta(77.55, 4.4)", nlpar = "Sp", lb = 0, ub = 1) + set_prior("normal(0, 2)", class = "b", nlpar = "eta") # 运行模型 model <- brm(bform, data = bd, prior = bprior, init = "0") summary(model)
关键说明
- 对于因子型变量X2、X3,brms会自动处理水平编码(默认生成虚拟变量),系数代表对应水平相对于参考水平的logit尺度效应。
- 运行
summary(model)后,就能在输出中看到协变量X1/X2/X3的系数后验分布(包括均值、置信区间等)。
内容的提问来源于stack exchange,提问作者Buczinski
相关产品推荐
相关产品推荐

