如何在R的ggplot中绘制100条贝叶斯回归后验预测线
在ggplot中绘制CAPM模型的100条后验预测回归线
要实现这个需求,核心是从贝叶斯模型的后验样本中提取随机子集的截距和斜率,结合x_plot生成每条线的完整数据,再用geom_line分组绘制。以下是具体步骤和代码:
步骤1:提取后验样本并随机选择100组
假设你的贝叶斯模型是用brms拟合的(对应Python中的PyMC3逻辑),先提取模型的后验样本,再随机选取100组截距(alpha)和斜率(beta):
library(brms) library(tidyverse) # 假设已拟合好CAPM模型:model <- brm(returns ~ market_returns, data = your_data) posterior <- posterior_samples(model) # 随机选100组后验样本(设置seed保证结果可复现) set.seed(42) selected_post <- posterior %>% slice_sample(n = 100) %>% mutate(line_id = row_number())
步骤2:生成100条线的x-y数据
结合你定义的x_plot序列,为每组后验参数计算对应的y值,并整理成长格式数据框:
# 假设x_plot是你预先定义的x轴序列,比如: x_plot <- seq(min(your_data$market_returns), max(your_data$market_returns), length.out = 100) # 生成每条线的y值并展开数据 lines_df <- selected_post %>% rowwise() %>% mutate( y_plot = list(b_Intercept + b_market_returns * x_plot), # 计算该组参数对应的y序列 x_plot = list(x_plot) ) %>% unnest(c(x_plot, y_plot))
步骤3:用ggplot绘制所有线条
最后将原始数据点、100条后验线和均值拟合线整合到同一张图中:
ggplot(your_data, aes(x = market_returns, y = returns)) + # 绘制原始数据点 geom_point(alpha = 0.6, color = "gray50") + # 绘制100条后验回归线(分组避免线条混淆,设置透明度降低重叠干扰) geom_line(data = lines_df, aes(x = x_plot, y = y_plot, group = line_id), alpha = 0.2, color = "steelblue") + # 绘制后验均值拟合线(可选) geom_abline( intercept = fixef(model)[1], slope = fixef(model)[2], color = "darkred", size = 1.2 ) + labs( x = "市场收益率", y = "资产收益率", title = "CAPM模型后验预测回归线(100条)" ) + theme_minimal()
关键说明
- 不用
geom_abline画多条线的原因:geom_abline仅支持单组截距/斜率,无法直接处理多组参数;而geom_line需要完整的x-y对数据,因此必须先构造包含所有线条点的长格式数据框。 - 设置
alpha参数:让多条后验线半透明,既能展示分布范围,又不会遮挡原始数据或均值线。 - 可复现性:通过
set.seed()固定随机抽样的结果,确保每次运行都得到相同的100条线。
内容的提问来源于stack exchange,提问作者José
相关产品推荐
相关产品推荐

