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

如何在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é

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:17:52