使用ggeffects绘图时出现原始数据丢失报错,求助解决方法
问题原因
你在ggpredict()返回的对象上执行mutate()添加x_1列,破坏了ggeffects对象自带的属性和原始数据关联信息,导致plot(add.data = TRUE)无法定位原始数据,触发"Raw data not available."错误,进而引发逻辑判断时的缺失值报错。另外手动调整x_1的操作完全多余,ggeffects会自动处理分类变量的展示。
解决方案
方案1:直接使用原始预测结果绘图
无需修改ggpredict()的输出,直接调用plot函数即可:
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", "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 <- ggpredict(m_Pred, terms = "Especie [all]") plot(df_gg, add.data = TRUE)
方案2:用ggplot2手动自定义绘图(如需调整点位置避免重叠)
如果想避免原始数据点重叠,用ggplot2手动组合数据和预测结果,灵活性更高:
# 获取预测结果 df_gg <- ggpredict(m_Pred, terms = "Especie [all]") # 手动绘图 ggplot() + # 添加原始数据点,用jitter分散重叠点 geom_jitter(data = ds, aes(x = Especie, y = Tentou_predar), width = 0.2, alpha = 0.6) + # 添加预测值点 geom_point(data = df_gg, aes(x = group, y = predicted), color = "red", size = 3) + # 添加置信区间 geom_errorbar(data = df_gg, aes(x = group, ymin = conf.low, ymax = conf.high), width = 0.2, color = "red") + theme_minimal()
核心注意点
ggpredict()返回的是ggeffects专属结构的对象,包含和原始模型、数据关联的属性,不要随意修改其列或结构,否则会破坏plot函数的内部逻辑。- 自定义绘图需求建议直接用ggplot2实现,避免依赖ggeffects的plot函数的自动处理逻辑。
内容的提问来源于stack exchange,提问作者Leprechault
相关产品推荐
相关产品推荐

