为何get_datagrid+get_predicted生成的ggplot与predictions方法结果不同?
问题描述
我用以下代码加载数据并拟合回归模型:
library(tidyverse) library(marginaleffects) data(efc, package = "ggeffects") efc <- efc %>% na.omit() efc <- datawizard::to_factor(efc, c("c161sex", "c172code")) mod <- lm(barthtot ~ c172code + c12hour*c161sex, efc) pred <- predictions(mod, newdata = datagrid(c172code = unique, c12hour=unique, c161sex = unique))
通过这段代码生成目标图形:
ggplot(pred, aes(c12hour, barthtot, colour = c161sex )) + facet_wrap(~c172code )+ geom_line(position = position_dodge(0.2)) + ggtitle("Predicted values of barthtot")
之后尝试用easystats包的get_datagrid()和get_predicted()复现图形:
library(easystats) vizdata <- get_datagrid(efc, by = c("c12hour", "c161sex","c172code")) vizdata$Predicted <- get_predicted(mod, vizdata) ggplot(efc, aes(x = c12hour , y = barthtot, color =c161sex )) + geom_line(data = vizdata, aes(y = Predicted), linewidth = 1) +facet_wrap(~c172code )
得到的图形和第一种方法生成的不一致,请问原因是什么?
问题原因及修正方法
核心差异点
- 连续变量的取值逻辑不同
marginaleffects的datagrid(c12hour=unique)会保留c12hour的所有原始唯一值;而get_datagrid()默认对连续变量(如c12hour)进行等距抽样(默认生成10个分位值),这直接导致两组预测数据的x轴点数量、取值完全不同,图形自然无法匹配。 - 绘图数据集引用错误
你在ggplot()中以原始数据efc作为主数据集,但实际只需要用预测数据集vizdata绘图,原始数据的引入会干扰图形逻辑(虽不是核心问题,但会导致冗余)。
修正后的代码
要完全复现原图形,需调整get_datagrid()的参数,让它保留c12hour的所有唯一值,同时修正绘图的数据集引用:
library(easystats) # 指定变量取原始唯一值,和marginaleffects的datagrid逻辑对齐 vizdata <- get_datagrid(efc, variables = list(c12hour = ~unique(), c161sex = ~unique(), c172code = ~unique())) vizdata$Predicted <- get_predicted(mod, vizdata) # 仅用预测数据集绘图,保留原图形的偏移效果 ggplot(vizdata, aes(x = c12hour, y = Predicted, colour = c161sex)) + facet_wrap(~c172code) + geom_line(position = position_dodge(0.2)) + ggtitle("Predicted values of barthtot")
补充说明
get_datagrid()针对连续变量的默认行为是生成等距分位数,这是为了让预测曲线更平滑;而marginaleffects的datagrid(xxx=unique)是严格保留原始数据的所有离散取值,这是两者的核心设计差异。
内容的提问来源于stack exchange,提问作者mariann
相关产品推荐
相关产品推荐

