You need to enable JavaScript to run this app. R语言绘制似然函数、Beta先验、Beta后验时提示x与y长度不一致报错的修正
优惠活动
大模型
产品
解决方案
定价
更多

R语言绘制似然函数、Beta先验、Beta后验时提示x与y长度不一致报错的修正

报错根源定位
  • 横坐标逻辑完全错位:似然、先验、后验三个曲线的核心自变量都是取值在(0,1)区间的感染概率θp,而非从0到10000的感染人数success序列。用success作为横坐标从根上就不符合三个分布的定义。
  • 函数传参完全错配:dbeta()的输入要求是0到1区间的数值,之前把0到10000的success序列传入该函数计算先验、后验,得到的是完全无效的取值;同时似然函数的定义偏差极大——二项分布的似然是固定观测感染人数Y=7000的前提下,以θp为自变量计算的相对概率值,不是固定p=0.5得到的二项分布密度曲线。
  • 触发长度不匹配报错的直接原因:绘图语句调用了不存在的变量data,叠加之前函数传参的逻辑错误,直接触发R的坐标长度校验报错。
修正后的可运行代码

代码严格匹配共轭分布的数学定义,统一使用θp作为横坐标,保证三条曲线的自变量维度一致:

# 固定试验参数
n <- 10000  # 临床试验总受试者数
Y <- 7000   # 实际观测到的接种后感染人数
alpha <- 1  # 先验Beta(alpha,beta)的形状参数
beta <- 1

# 统一设置横坐标:在0到1区间取1000个等距点,保证曲线平滑
theta_p <- seq(0, 1, length.out = 1000)

# 1. 计算固定观测值Y对应的似然函数
# 似然仅保留相对比例,常数组合数项不影响曲线形状可省略
likelihood <- dbinom(Y, size = n, prob = theta_p)

# 2. 计算先验Beta(alpha, beta)分布的密度值
prior <- dbeta(theta_p, shape1 = alpha, shape2 = beta)

# 3. 计算共轭推导得到的后验Beta分布密度值
posterior <- dbeta(theta_p, shape1 = Y + alpha, shape2 = n - Y + beta)

# 注:大样本下似然值的数量级远小于Beta分布密度值,此处对似然做归一化缩放,方便同图对比
likelihood_scaled <- likelihood / max(likelihood) * max(posterior)

# 同图绘制三条曲线
plot(theta_p, likelihood_scaled, 
     type = "l", col = "blue", lwd = 2,
     xlab = "感染概率 θp", ylab = "归一化密度值",
     main = "疫苗临床试验的先验、似然、后验分布对比")
lines(theta_p, prior, type = "l", col = "red", lwd = 2)
lines(theta_p, posterior, type = "l", col = "green", lwd = 2)

# 添加图例区分三条曲线
legend("topright", 
       legend = c("归一化似然", "Beta(1,1)先验", "Beta(7001,3001)后验"),
       col = c("blue", "red", "green"),
       lty = 1, lwd = 2)
补充说明
  • 如果不做似然的归一化缩放,直接绘制原始likelihood,会因为大样本下二项似然的峰值仅为1e-3量级,远低于两个Beta分布的密度峰值,导致似然曲线几乎贴在x轴上无法观察形态。
  • 后验分布的形状会随着观测感染人数Y的变动自动调整,Y越大,后验分布的峰值越往θp大的方向偏移,符合贝叶斯共轭更新的直观逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 12:45:07