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
相关产品推荐
相关产品推荐

