手动复现avg_comparisons结果存在差异,请求协助排查问题
问题原因排查与验证
可能的原因
- 浮点运算精度误差:两种计算逻辑本质一致,但由于浮点数存储和运算的微小误差,结果会出现可忽略的细微差异,这是数值计算中的正常现象。
- 样本集的细微差异:
avg_comparisons默认使用模型拟合时的数据集(即model.frame(mod),已自动剔除含缺失值的观测);而你的手动计算基于原始数据集,再通过na.rm=TRUE移除NA。若原始数据中存在被模型排除但predict返回NA的观测,理论上两者样本应一致,但极端情况下可能因NA判定逻辑差异导致计算样本略有不同。 - 预测值计算路径差异:
marginaleffects内部可能先在link尺度计算差值再转换为response尺度,而你直接在response尺度计算预测值后相减。对于logistic模型,两种方式理论等价,但浮点误差累积会导致结果细微偏差。
验证步骤
确认计算样本是否一致
运行以下代码对比样本量:# 模型拟合时使用的样本量 nrow(model.frame(mod)) # 手动计算中实际参与均值计算的样本量 sum(!is.na(mydf$pred1 - mydf$pred0))若两者数值相等,说明样本一致,差异源于浮点精度;若不等,需检查缺失值处理逻辑。
复用marginaleffects内部逻辑验证
用marginaleffects的predictions函数复现手动计算,看结果是否与avg_comparisons完全一致:library(dplyr) # 生成所有观测在incentive=0和1时的预测值 preds <- predictions(mod, newdata = dat, variables = list(incentive = c(0, 1))) # 计算差值并取均值 preds_diff <- preds %>% group_by(rowid) %>% summarize(diff = estimate[incentive == 1] - estimate[incentive == 0]) %>% pull(diff) mean(preds_diff, na.rm = TRUE)该结果应与
avg_comparisons(mod, variables = "incentive")$estimate完全匹配,因为复用了相同的内部计算逻辑。
结论
这种量级的细微差异通常对分析结论无影响,属于数值计算中的正常波动。若需完全对齐结果,建议直接使用marginaleffects包的内置函数完成计算。
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

