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

如何为brm模型生成带标签的固定参数预测值?

解决brms中posterior_predict/posterior_epred输出无标签矩阵的问题

当用brms模型针对固定length值生成预测时,posterior_predict()和posterior_epred()会返回无标签的大型矩阵,难以对应到newdata中的分组(如site、sex)。以下是两种实用的解决方法:


方法1:用tidybayes生成带标签的tidy数据框

tidybayes包提供的add_predicted_draws()(对应posterior_predict)和add_epred_draws()(对应posterior_epred),可以直接将后验预测结果与newdata合并,生成带分组标签的长格式数据,无需手动处理矩阵。

library(tidyverse)
library(brms)
library(tidybayes)

set.seed(42)
df <- data.frame(mass   = rnorm(100, mean = 50, sd = 5),
                 length = rnorm(100, mean = 20, sd = 2),
                 sex    = sample(c("f", "m"), 100, replace = TRUE),
                 site   = sample(LETTERS[1:3], 100, replace = TRUE))

m <- brm(mass ~ length * sex + site, data = df, prior = prior(normal(0, 10)))

newdata <- data.frame(site   = rep(LETTERS[1:3], each = 30),
                      sex    = rep(c("f", "m"), 45),
                      length = 20)

# 生成带标签的后验预测值(对应posterior_predict)
pred_tidy_predict <- newdata %>%
  add_predicted_draws(m)

# 生成带标签的期望预测值(对应posterior_epred)
pred_tidy_epred <- newdata %>%
  add_epred_draws(m)

# 用tidy数据绘图,展示posterior_predict结果
ggplot(pred_tidy_predict, aes(x = .prediction, y = site, color = sex)) +
  geom_violin(alpha = 0.5) +
  labs(x = "预测mass值", y = "采样点", color = "性别")

方法2:手动转换矩阵为带标签的数据框

如果不想额外加载包,可以手动将posterior_predict()/posterior_epred()返回的矩阵转换为长格式,再与newdata的分组信息绑定:

# 处理posterior_predict的结果
pred2 <- posterior_predict(m, newdata)
pred2_tidy <- pred2 %>%
  as.data.frame() %>%
  pivot_longer(everything(), names_to = "row_id", values_to = "pred_mass") %>%
  mutate(row_id = as.integer(str_remove(row_id, "V"))) %>%
  bind_cols(newdata[.$row_id, ])

# 处理posterior_epred的结果
pred3 <- posterior_epred(m, newdata)
pred3_tidy <- pred3 %>%
  as.data.frame() %>%
  pivot_longer(everything(), names_to = "row_id", values_to = "epred_mass") %>%
  mutate(row_id = as.integer(str_remove(row_id, "V"))) %>%
  bind_cols(newdata[.$row_id, ])

# 绘图示例
ggplot(pred2_tidy, aes(x = pred_mass, y = site, color = sex)) +
  geom_violin(alpha = 0.5)

补充说明

  • posterior_predict()生成包含残差的预测分布(模拟实际观测值),posterior_epred()生成期望预测分布(模型拟合均值),按需选择即可。
  • 两种方法生成的tidy数据框都能直接用于可视化,且保留了完整后验分布信息,适合做不确定性分析。

示例绘图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:02:12