如何在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
相关产品推荐
相关产品推荐

