r-如何在具有从矩阵中提取的值的brms中正确使用set_prior(),例如,prior(normal(priors[



我想创建一组参数,用于R中的brms模型:

library(brms)
tmp <- prior(normal(10,2), nlpar = "x")

理想情况下,我想从导入的矩阵中提取每个先验(例如normal(10,2))的值,例如:

priors <- cbind(c(10,20,30,40), c(2,4,6,8))
i <- 1
tmp <- prior(normal(priors[i,1], priors[i,2]), nlpar = "x")

然而,这会产生以下输出:

#b_x ~ normal(priors[i, 1], priors[i, 2])

而不是数值:

#b_x ~ normal(10, 2)

我意识到这可能是非常基本的,但我想不出正确的方法。我试过:

prior(normal(as.numeric(priors[i,1]), as.numeric(priors[i,2])), nlpar = "x")
prior(normal(as.list(priors[i,1]), as.list(priors[i,2])), nlpar = "x")
prior(normal(paste(priors[i,1]), paste(priors[i,2])), nlpar = "x")
prior(normal(get(priors[i,1]), paste(get[i,2])), nlpar = "x")

有人能告诉我哪里出了问题吗?按位置[,]提取似乎适用于其他功能,例如lm(priors[,1]~priors[,2])

另一种方法是使用函数brms::stanvar()。请查看此处的手册页。这是有利的,因为您可以在stanvar()中更改先验并重新安装模型,而无需重新编译。因为brms是Stan的包装器,这相当于将先验分布的超参数作为Stan模型中data块的一部分进行传递。

stanvar()的每次调用都需要两个参数,一个值和一个字符串,该字符串是稍后可以在prior()中使用的变量的名称。然后使用+将每个单独的变量组合在一起,并将其传递给brm()stanvars自变量。

举个例子,你可以这样做:

prior_params <- stanvar(priors[i, 1], 'prior_mean') + stanvar(priors[i, 2], 'prior_sd')
x_prior <- prior(normal(prior_mean, prior_sd), nlpar = 'x')
brm(..., prior = x_prior, stanvars = prior_params)

基本上,当priors[i, 1]priors[i, 2]被传递给prior()时,您需要对它们进行求值。

priors <- cbind(c(10, 20, 30, 40), c(2, 4, 6, 8))
i <- 1
## use `do.call()`
do.call("prior",
list(prior = call("normal", priors[i, 1], priors[i, 2]),
nlpar = "x"))
#b_x ~ normal(10, 2)
## use `eval(call())`
eval(call("prior", call("normal", priors[i, 1], priors[i, 2]), nlpar = "x"))
#b_x ~ normal(10, 2)

当我阅读?prior时,我发现这是可行的,建议将分布指定为字符串。因此,以下内容也适用。

## I used %d because values in `priors` matrix are integers
## in general, it is safer to use %f for real numbers
eval(call("prior",
sprintf("normal(%d, %d)", priors[i, 1], priors[i, 2]),
nlpar = "x"))
#b_x ~ normal(10, 2)

注意:

我也是brms的新手,所以老实说,我认为另一个答案对软件包来说更自然。(这是通过回答问题来学习的好处;我总是从同龄人那里得到有用的反馈。)

如上所述,这是推荐的方式,因为它相当于将先前的超参数作为数据传递给Stan模型。

最新更新