如何为贝叶斯先验指定0为下界?基于rstanarm的使用问题
rstanarm中设置正数约束贝叶斯先验的实现方法
rstanarm原生支持带边界约束的先验指定,不需要手动实现截断逻辑,实现正数约束的常用方法如下:
方法1:通过先验函数的lb参数设置下界
所有rstanarm内置的先验函数都支持lb(lower bound,下界)和ub(upper bound,上界)参数,直接将lb设为0即可强制对应参数取值为正。
为单个系数设置正数约束
如果仅需要给部分系数加正数约束,可按系数顺序传入lb向量:
library(rstanarm) # 示例:线性回归,仅给自变量x的系数加>0的约束 model <- stan_glm( formula = y ~ x + z, data = your_data, # prior参数的顺序对应自变量x、z的系数 prior = prior_normal( location = c(2, 0), scale = c(1, 2), lb = c(0, -Inf) # x系数下界为0,z系数无约束 ), prior_intercept = normal(0, 5) )
为所有群体级系数设置统一正数约束
如果所有自变量的系数都需要满足>0的要求,直接统一指定lb=0即可:
model <- stan_glm( formula = y ~ x1 + x2 + x3, data = your_data, prior = prior_normal(location = 1, scale = 2, lb = 0), prior_intercept = normal(0, 5) )
方法2:使用本身定义在正实数域的先验
如果你的参数本身预期就是正数,也可以直接选用原生定义域为正的先验分布,不需要额外设置边界:
- 对数正态先验:
prior_lognormal(location = 0, scale = 1),适合预期系数取值不会出现极端大值的场景 - Gamma先验:
prior_gamma(shape = 2, rate = 1),适合方差、尺度类正参数的先验设置 - 指数先验:
prior_exponential(rate = 1),适合预期系数稀疏接近0的正参数场景
注意:设置边界约束后rstanarm会自动在采样阶段做参数变换,不需要手动对参数做对数等变换,内部已经优化了对应采样逻辑。多层模型的随机效应方差等参数默认已经加了正数约束,无需额外设置。
内容的提问来源于stack exchange,提问作者StudentT
相关产品推荐
相关产品推荐

