如何在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
相关产品推荐
相关产品推荐

