【问题标题】:How do I put different priors on different levels of a categorical variable in brms?如何在 brms 的分类变量的不同级别上放置不同的先验?
【发布时间】:2020-08-26 22:30:51
【问题描述】:

这只是一个贝叶斯新手的编码查询。

我有一个这种类型的模型:

response ~ pred + (1 | participant) + (1 | item)  # pred = {level1, level2, level3} [ref level = level1]

我正在使用 brms。我想在 pred 的三个级别上放置不同的先验。假设这些是先验:

  • 拦截(level1):N ~ (1,1)
  • level2 相对于 level1 的影响:N ~ (0,1)
  • level3 相对于 level1 的影响:N ~ (-1,1)

我想我知道如何为 level1 设置先验;我遇到的麻烦是为 level2 和 level3 设置两个不同的先验。以我有限的 brms 技能,这是我能得到的最接近的:

prior1 <- c(
prior(normal(1, 1), class = Intercept), # level1
prior(normal(0, 1), class = b, coef = weight) # prior for level 2, but specified as if there is no level3        
)

如你所见,我不知道如何处理level3。

显然,在 Stan 中可以做到这一点。 (不幸的是,我对 Stan 并不精通。)我在某处找到了以下代码:

// prior specifications
b[1] ~ normal (0, 1);
b[2] ~ normal (-1, 1);
temp_Intercept ~ normal (1, 1)

简而言之,有人可以告诉我如何修改上面的 brms 代码,以便我可以为 level2 和 level3 设置单独的先验吗?

如果能提供任何帮助,我将不胜感激。我确实找到了this earlier query,但我不确定它是否与我的查询相关。

【问题讨论】:

    标签: r regression bayesian


    【解决方案1】:

    您可以使用函数get_prior() 查看可以为给定模型指定的先验。这是 R 中包含的 iris 数据集的示例。您可以像这样指定要使用的模型和数据:

    get_prior(Sepal.Length ~ Species, data = iris)
    

    给出这个输出:

                       prior     class              coef group resp dpar nlpar bound
    1                                b                                              
    2                                b Speciesversicolor                            
    3                                b  Speciesvirginica                            
    4 student_t(3, 5.8, 2.5) Intercept                                              
    5   student_t(3, 0, 2.5)     sigma           
    
    

    我们可以在这里看到,我们可以指定Species 的3 个级别中的2 个。第一级的 coef 按字母顺序对应于 Intercept ,并指定了其他两个级别的 coef 名称。因此,您应该能够为 versicolorvirginica 指定不同的先验,如下所示:

    priors <- c(
    prior(normal(1, 1), class = Intercept),
    prior(normal(0, 1), class = b, coef = Speciesversicolor),
    prior(normal(0, 1), class = b, coef = Speciesvirginica)
    )
    

    请注意,这只是与您的代码最接近的示例代码,因为我无法重现您包含的代码。运行 get_prior() 应该会为您提供所需的详细信息,以便为每个级别的预测器拟合不同的先验。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2016-09-29
      相关资源
      最近更新 更多