You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R Shiny中正确向brm传递用户自定义先验参数?

解决Shiny中brm调用时先验参数未解析实际值的问题

我正在开发一个R Shiny Web应用,允许用户输入自定义数据集、选择分析变量,并使用用户指定的先验值拟合贝叶斯ANCOVA模型。

原始服务器端代码

input$activate,
ignoreNULL = F,
{
  req(lmmformula)
  
  priors <- c(prior(normal(input$interceptMean,
                           input$interceptVariance),
                    class = "Intercept"),
              prior(cauchy(0, input$sigmaScale),
                    class = "sigma"))
  
  list(
    bayes = brm(ancovaformula(), data = sel_data(), silent = 1,
                thin = 1, iter = input$iter, warmup = (input$iter/2),
                prior = priors),
    
    bayesx2 = brm(ancovaformula(), data = sel_data(), silent = 1,
                  thin = 1, iter = (input$iter)*2, warmup = input$iter,
                  prior = priors)
  )
}
)

output$summary <- renderPrint({
  summary(bfit()[["bayes"]])
})

运行时错误信息

error in evaluating the argument 'object' in selecting a method for function 'summary': 0
Syntax error in 'string', line 27, column 40, lexing error:
   -------------------------------------------------
    25:  transformed parameters {
    26:    real lprior = 0;  // prior contributions to the log posterior
    27:    lprior += normal_lpdf(Intercept | input$interceptMean, input$interceptVariance);
                                                  ^
    28:    lprior += cauchy_lpdf(sigma | 0, input$sigmaScale)
    29:      - 1 * cauchy_lccdf(0 | 0, input$sigmaScale);
   -------------------------------------------------

Invalid character found.

该错误表明,brm并未获取input$interceptMean等变量存储的实际值,而是将其当作字面量字符串处理,进而引发Stan语法解析错误。

解决方案

问题核心是brms的prior()函数会直接将传入的表达式解析为Stan代码字面量,不会先计算Shiny输入变量的实际值。解决方法是先将输入值提取到普通R变量中,再传入prior():

input$activate,
ignoreNULL = F,
{
  req(lmmformula)
  
  # 先提取Shiny输入的实际数值到本地变量
  intercept_mean <- input$interceptMean
  intercept_var <- input$interceptVariance
  sigma_scale <- input$sigmaScale
  
  priors <- c(prior(normal(intercept_mean, intercept_var),
                    class = "Intercept"),
              prior(cauchy(0, sigma_scale),
                    class = "sigma"))
  
  list(
    bayes = brm(ancovaformula(), data = sel_data(), silent = 1,
                thin = 1, iter = input$iter, warmup = (input$iter/2),
                prior = priors),
    
    bayesx2 = brm(ancovaformula(), data = sel_data(), silent = 1,
                  thin = 1, iter = (input$iter)*2, warmup = input$iter,
                  prior = priors)
  )
}
)

output$summary <- renderPrint({
  summary(bfit()[["bayes"]])
})

关键修改说明

  • 新增了将input$变量赋值给普通R变量的步骤,确保传入prior()的是具体数值而非未解析的reactive表达式
  • brms会使用这些本地变量的实际值生成合法的Stan代码,避免语法解析错误

内容的提问来源于stack exchange,提问作者JLosc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:43:24