使用ggeffects绘制glm模型时均值/误差条与观测数据不匹配求助
泊松GLM模型预测值绘图对应错误问题解决
问题说明
使用ggeffects::ggpredict()绘制公式为Tentou_predar ~ Especie的泊松GLM模型时,已将Especie转为因子类型,但预测均值点与实际数据对应错误:计算得C_externa_1预测均值为15.1,C_cubana_2为0.233,但绘图中C_cubana_2的均值显示更高。
原错误代码
library(dplyr) library(readr) library(ggplot2) library(ggeffects) # Read my data ds <- structure(list(Especie = c("C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2"), Tentou_predar = c(3L, 25L, 20L, 36L, 12L, 0L, 1L, 10L, 0L, 14L, 2L, 0L, 0L, 0L, 0L, 32L, 0L, 0L, 25L, 0L, 2L, 2L, 35L, 0L, 0L, 0L, 22L, 0L, 2L, 9L, 54L, 57L, 26L, 17L, 18L, 34L, 2L, 0L, 20L, 25L, 6L, 65L, 36L, 6L, 62L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L)), class = "data.frame", row.names = c(NA, -105L)) str(ds) # Create a glm model and plot it m_Pred <- glm(Tentou_predar ~ Especie, data = ds, family = "poisson") df_gg <- ggeffects::ggpredict(m_Pred, terms = "Especie [all]") df_gg$x_1 <- 1 + (readr::parse_number(as.character(df_gg$group)) - 2) * 0.05 df_gg %>% plot(add.data = TRUE)
问题根源
手动添加x_1列的操作破坏了ggpredict返回数据的x轴位置映射:df_gg中x列对应正确的分组标签,predicted列对应正确的预测值,而手动计算的x_1错误地重新分配了预测点的x坐标,导致预测点与分组标签错位。
修正方案
移除手动创建x_1的代码,直接使用ggpredict返回的默认数据绘图。如需调整预测点与原始数据点的间距,可使用position_dodge()参数。
修正后代码
library(dplyr) library(readr) library(ggplot2) library(ggeffects) # 加载数据 ds <- structure(list(Especie = c("C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_externa_1", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2", "C_cubana_2"), Tentou_predar = c(3L, 25L, 20L, 36L, 12L, 0L, 1L, 10L, 0L, 14L, 2L, 0L, 0L, 0L, 0L, 32L, 0L, 0L, 25L, 0L, 2L, 2L, 35L, 0L, 0L, 0L, 22L, 0L, 2L, 9L, 54L, 57L, 26L, 17L, 18L, 34L, 2L, 0L, 20L, 25L, 6L, 65L, 36L, 6L, 62L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L)), class = "data.frame", row.names = c(NA, -105L)) # 构建模型并生成预测数据 m_Pred <- glm(Tentou_predar ~ Especie, data = ds, family = "poisson") df_gg <- ggeffects::ggpredict(m_Pred, terms = "Especie [all]") # 绘图,使用position_dodge调整点间距(可选) df_gg %>% plot(add.data = TRUE, position = position_dodge(width = 0.2))
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

