R语言marginaleffects包:使用map函数调用predictions的正确语法
解决marginaleffects结合map批量计算预测值的问题
你的核心问题是错误地将字符串传给了datagrid,!!运算符只能解析符号/表达式,无法直接解析字符串,导致datagrid无法识别你指定的变量范围,同时也没正确触发默认的其他变量参考值逻辑。下面是两种可行的修正方案:
方案1:用命名列表传递参数
直接构造包含目标变量范围的命名列表,通过do.call调用datagrid,这种方式直观且不易出错:
library(marginaleffects) library(purrr) # 构造参数列表:每个元素对应一个要分析的变量及其范围 param_list <- list( list(var1 = 1:10), list(var2 = 21:30) ) # 批量生成预测值,其他变量自动使用datagrid默认的参考值(数值取均值、分类取众数) pred_list <- map(param_list, \(params) { predictions(my_model, newdata = do.call(datagrid, params)) })
方案2:用表达式传递参数
如果更习惯用表达式语法,可以用expr()构造变量范围的表达式,再通过!!解析:
library(marginaleffects) library(purrr) # 构造表达式列表 param_exprs <- list( expr(var1 = 1:10), expr(var2 = 21:30) ) # 批量计算预测值 pred_list <- map(param_exprs, \(expr) { predictions(my_model, newdata = datagrid(!!expr)) })
示例验证(用mtcars数据)
为了让你更直观看到效果,这里用内置数据集演示完整流程:
# 构建示例模型 my_model <- lm(mpg ~ hp + wt, data = mtcars) # 定义要分析的变量范围 param_list <- list( list(hp = seq(100, 200, by = 10)), # hp从100到200,步长10 list(wt = seq(2, 4, by = 0.2)) # wt从2到4,步长0.2 ) # 批量生成预测值 pred_list <- map(param_list, \(params) { predictions(my_model, newdata = do.call(datagrid, params)) }) # 查看结果 head(pred_list[[1]]) # hp对应的预测值 head(pred_list[[2]]) # wt对应的预测值
内容的提问来源于stack exchange,提问作者user167591
相关产品推荐
相关产品推荐

