ggplot绘制泊松GLM置信区间时geom_ribbon()使用异常排查
问题排查
你的代码运行失败和模型、置信区间计算逻辑无关,核心是2个拼写和映射错误,外加1个潜在隐患:
- 构造预测数据框
predframe_model3时,存储日期的列名写错了:你写的是data = aids$date,列名实际为data,但全局ggplot映射里x轴调用的变量是date,geom_ribbon找不到对应列直接触发报错。 geom_ribbon单独指定了数据源,但没有在图层映射里明确声明x轴变量,继承全局映射时会优先在当前图层的数据源里匹配变量,匹配失败就会中断运行。- 潜在隐患:画拟合线时你直接调用了全局环境里的
model3_preds向量,没有把拟合值存入绘图数据源,一旦后续数据顺序变动,很容易出现拟合线和散点不匹配的隐式错误。
修正后可运行代码
library(ggplot2) # 拟合泊松GLM模型 model3 = glm(cases ~ date, data = aids, family = poisson(link='log')) # 计算带标准误的预测值 predictions_model3 = predict(model3, aids, se.fit = TRUE, type = 'response') # 计算95%置信区间上下限 upper_mod3 = predictions_model3$fit + 1.96 * predictions_model3$se.fit lower_mod3 = predictions_model3$fit - 1.96 * predictions_model3$se.fit # 构造绘图用预测数据框:修正列名错误,同时存入拟合值 predframe_model3 = data.frame( lwr = lower_mod3, upr = upper_mod3, date = aids$date, cases = aids$cases, fit = predictions_model3$fit ) # 绘图 ggplot(aids, aes(date, cases)) + geom_ribbon(data = predframe_model3, aes(x = date, ymin = lwr, ymax = upr), fill = 'grey', alpha = 0.5) + # 增加透明度调整,避免置信带遮挡原始散点 geom_point() + geom_line(data = predframe_model3, aes(x = date, y = fit), col = 'red')
可选优化提示
你当前的置信区间是直接在响应尺度计算的Wald区间,对于带log链接的泊松模型,更严谨的做法是先在log尺度计算置信区间上下限,再通过
exp()转换回原始尺度,可以避免出现置信区间下限为负数的不合理结果,如果对区间估计准确性要求高可以调整这部分计算逻辑。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

