ggeffects::ggemmeans()重设因子水平后预测表输出错配问题咨询
结论
这是ggeffects早期版本的已知bug,和你调整因子水平顺序的操作没有关系,不属于使用不当导致的错误。
错位逻辑拆解
先做个简单验证:你直接对场景b拟合的模型跑原生的emmeans():
lm(cty ~ manufacturer, data = my_mpg_manuf_as_fac_b) %>% emmeans(~manufacturer)
返回的结果里,每个厂商对应的预测值、置信区间都是完全准确的,不存在标签和数值错位的问题——也就是说从数据整理、因子重排到模型拟合的全流程,你的操作都没有错误。
错位的根源在当时版本的ggemmeans()内部实现:
- 函数在生成结果表的x类别列时,会正确读取你调整后的因子水平顺序,生成对应顺序的行标签
- 但在把预测值、置信区间和行标签做匹配时,没有按照类别名称做一一映射,而是直接按照模型内部存储的初始因子顺序(也就是第一次转成因子时的默认字母升序)把数值硬填入对应行
- 最终就出现了你复现的典型现象:x列的标签顺序完全符合你重排后的结果,但是每一行的数值还是旧顺序下的对应值——比如原a场景里audi对应的17.61,到b场景第一行标签换成volkswagen时,还是保留了17.61的数值,完全和实际预测值不匹配。
解决方法
- 长期方案:直接把ggeffects升级到0.16.0及以上版本,该错位问题已经在这个版本后被正式修复
- 临时规避:如果暂时没法升级版本,可以在调用
ggemmeans()时手动指定需要计算的因子水平列表,强制函数按照你指定的顺序做取值匹配:
pred_b_correct <- lm(cty ~ manufacturer, data = my_mpg_manuf_as_fac_b) %>% ggemmeans( terms = "manufacturer", add.args = list(levels = levels(my_mpg_manuf_as_fac_b$manufacturer)) )
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

