如何从brms分层贝叶斯模型提取无分组后验样本及conditional_effects数据?
分层贝叶斯模型后验样本提取与conditional_effects数据说明
一、提取不含分层分组的后验样本(查看通用关系分布)
当然可以,你需要的是**群体水平(population-level)**的后验结果——也就是只保留固定效应、排除所有随机效应的后验分布,对应变量间的通用关系。有两种常用方法:
方法1:用posterior_epred()直接生成群体水平后验预测
通过指定re_formula = ~0,可以让函数只基于固定效应计算后验预测,完全排除随机效应的影响:
# 提取群体水平的后验预测样本(不含任何随机效应) population_draws <- posterior_epred(m, re_formula = ~0) # 转换为数据框便于查看和分析 population_draws_df <- as.data.frame(population_draws)
得到的population_draws每一列对应原始数据中一个观测的群体水平后验预测,每一行对应一个后验样本。
方法2:手动提取固定效应后验样本计算
如果你想针对特定的自变量取值计算通用关系,也可以直接提取固定效应的后验样本自己计算:
# 提取固定效应的原始后验样本(每行是一个样本,每列是一个参数) fixed_effects <- fixef(m, summary = FALSE) # 示例:计算water=0.5时的群体水平预测分布 target_water <- 0.5 population_pred_dist <- fixed_effects[, "(Intercept)"] + fixed_effects[, "water"] * target_water
population_pred_dist就是water取0.5时,通用关系对应的后验分布向量。
二、conditional_effects()的绘图数据提取
conditional_effects()默认使用群体水平的预测数据(即排除随机效应)来绘制效应曲线,它会自动生成自变量的网格取值,然后计算每个网格点对应的后验预测均值、置信区间等统计量。
要提取这些原始数据非常简单,只需将函数结果保存为对象,直接访问即可:
1. 提取默认的效应统计数据
# 保存conditional_effects的结果 ce_results <- conditional_effects(m) # 查看结果结构(每个元素对应一个预测变量的效应数据) str(ce_results) # 提取water变量的效应数据(包含网格点、预测均值、置信区间等) water_effect_data <- ce_results$water
water_effect_data是一个数据框,包含自变量water的网格取值、后验预测均值estimate__,以及置信区间的上下限lower__和upper__。
2. 提取原始后验样本
如果需要获取绘图背后的所有后验预测样本,可以在调用函数时加上draws = TRUE参数:
# 带原始后验样本的效应结果 ce_with_draws <- conditional_effects(m, draws = TRUE) # 提取water效应对应的所有后验样本(列名以draw开头) water_raw_draws <- ce_with_draws$water[, grep("^draw", colnames(ce_with_draws$water))]
water_raw_draws的每一行对应一个自变量网格点,每一列对应一个后验预测样本。
内容的提问来源于stack exchange,提问作者tnt
相关产品推荐
相关产品推荐

