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

如何用marginaleffects计算一阶与二阶差异(含标准误)

使用marginaleffects计算一阶差异与二阶差异

1. 一阶差异(First Difference)

无需提前计算predictions,直接用comparisons()函数即可完成组间对比,同时自动输出标准误、p值等统计量,格式与你提供的pred数据框一致。

线性回归示例

library(marginaleffects)
mod <- lm(mpg ~ hp * factor(cyl), data = mtcars)

# 计算每个hp值下,cyl=8与cyl=4的一阶差异
fd <- comparisons(
    mod,
    variables = list(cyl = c("8", "4")), # 指定对比的两组
    newdata = datagrid(hp = seq(80, 110, 10)) # 固定hp的取值
)

# 查看结果,包含predicted差异、std.error、p.value等列
fd

逻辑回归适配

切换为逻辑回归模型时,comparisons()会自动适配响应尺度(概率)或链接尺度(对数几率),只需修改模型类型:

# 构建二分类因变量的逻辑回归模型
mod_logit <- glm(am ~ hp * factor(cyl), data = mtcars, family = binomial)

# 计算概率尺度下的一阶差异
fd_logit <- comparisons(
    mod_logit,
    variables = list(cyl = c("8", "4")),
    newdata = datagrid(hp = seq(80, 110, 10)),
    type = "response" # 可选,默认就是响应尺度
)

fd_logit

2. 二阶差异(Second Difference)

二阶差异是一阶差异之间的差值,对应交互项的边际效应,可通过hypotheses()对一阶差异结果做线性假设检验,或直接用comparisons()的交叉对比功能实现。

方法一:基于一阶差异构建假设

# 先获取一阶差异结果
fd <- comparisons(
    mod,
    variables = list(cyl = c("8", "4")),
    newdata = datagrid(hp = seq(80, 110, 10))
)

# 假设:hp=110时的一阶差异 - hp=80时的一阶差异 = 二阶差异
hyp <- hypotheses(fd, "b4 - b1 = 0")

# 结果中的estimate即为二阶差异,同时包含标准误、p值等统计量
hyp

方法二:直接用comparisons()交叉对比

更简洁的方式,通过cross=TRUE直接计算"差异的差异":

second_diff <- comparisons(
    mod,
    variables = list(cyl = c("8", "4"), hp = c(110, 80)),
    cross = TRUE # 启用交叉对比,计算(cyl8-cyl4)在不同hp下的差值
)

second_diff

逻辑回归适配

逻辑回归下用法完全一致,只需替换模型并指定所需尺度:

second_diff_logit <- comparisons(
    mod_logit,
    variables = list(cyl = c("8", "4"), hp = c(110, 80)),
    cross = TRUE,
    type = "response"
)

second_diff_logit

内容的提问来源于stack exchange,提问作者Maël

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:25:24