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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:05:57