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

手动复现avg_comparisons结果存在差异,请求协助排查问题

问题原因排查与验证

可能的原因

  • 浮点运算精度误差:两种计算逻辑本质一致,但由于浮点数存储和运算的微小误差,结果会出现可忽略的细微差异,这是数值计算中的正常现象。
  • 样本集的细微差异:avg_comparisons默认使用模型拟合时的数据集(即model.frame(mod),已自动剔除含缺失值的观测);而你的手动计算基于原始数据集,再通过na.rm=TRUE移除NA。若原始数据中存在被模型排除但predict返回NA的观测,理论上两者样本应一致,但极端情况下可能因NA判定逻辑差异导致计算样本略有不同。
  • 预测值计算路径差异:marginaleffects内部可能先在link尺度计算差值再转换为response尺度,而你直接在response尺度计算预测值后相减。对于logistic模型,两种方式理论等价,但浮点误差累积会导致结果细微偏差。

验证步骤

  1. 确认计算样本是否一致
    运行以下代码对比样本量:

    # 模型拟合时使用的样本量
    nrow(model.frame(mod))
    # 手动计算中实际参与均值计算的样本量
    sum(!is.na(mydf$pred1 - mydf$pred0))
    

    若两者数值相等,说明样本一致,差异源于浮点精度;若不等,需检查缺失值处理逻辑。

  2. 复用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:43:13