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

如何在R中计算特定值的边际效应/预测(其余变量保留观测值)

在R中基于原始观测值计算特定变量的边际效应/预测结果(模拟Stata margins行为)

Stata的margins, at(age=(30 35 40 45 50))会为每个原始观测值分别计算指定变量取值下的结果,其余变量保留原始值;而R的marginaleffects和ggeffects包默认会将其余变量设为均值,以下是两个包的实现方案:


使用marginaleffects包

核心是利用datagrid()函数的grid_type = "counterfactual"参数,基于原始观测生成反事实数据集(仅替换指定变量的取值,其余变量保留原值)。

示例:计算预测结果

# 加载包并准备数据
library(marginaleffects)
set.seed(123)
dat <- mtcars
dat$age <- sample(20:60, nrow(dat), replace = TRUE) # 模拟age变量

# 拟合模型
model <- lm(mpg ~ hp + wt + age, data = dat)

# 计算指定age取值下的预测结果(其余变量用原始观测值)
preds <- predictions(
    model,
    newdata = datagrid(
        age = c(30, 35, 40, 45, 50), # 指定目标变量的取值
        grid_type = "counterfactual", # 关键:基于原始观测生成反事实
        data = dat # 传入原始数据集
    )
)

# 查看结果(每行对应一个原始观测+一个age取值的组合)
head(preds)

示例:计算边际效应

如果需要计算边际效应,替换为marginaleffects()函数即可,参数逻辑完全一致:

mfx <- marginaleffects(
    model,
    newdata = datagrid(
        age = c(30, 35, 40, 45, 50),
        grid_type = "counterfactual",
        data = dat
    )
)

使用ggeffects包

通过设置rawdata = TRUE参数,强制基于原始观测的其余变量值计算指定变量的结果,而非默认的均值。

示例:计算预测结果

library(ggeffects)

# 用之前的model和dat数据集
gg_pred <- ggpredict(
    model,
    terms = "age [30,35,40,45,50]", # 指定age的取值列表
    rawdata = TRUE # 关键:使用原始观测的其他变量值
)

# 查看结果
head(gg_pred)

示例:计算边际效应

若需获取边际效应,使用ggeffect()函数并保留rawdata = TRUE参数:

gg_mfx <- ggeffect(
    model,
    terms = "age [30,35,40,45,50]",
    rawdata = TRUE
)

结果说明

两种方法生成的结果行数均为nrow(原始数据) × 指定变量的取值数量,每个行对应一个原始观测与指定变量取值的组合,完全匹配Stata margins命令的默认行为。

内容的提问来源于stack exchange,提问作者edvinsyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:20:42