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

R中动态生成datagrid参数与by变量并循环调用avg_predictions

动态传递参数到marginaleffects::avg_predictions的datagrid和by参数

方法1:使用do.call()构建动态调用

do.call()可以将列表转换为命名参数传入函数,完美适配datagrid对命名参数的要求。在循环中,先根据当前迭代的变量名和值构建datagrid所需的参数列表,再通过do.call()传递给datagrid;by参数同理。

示例代码:

library(marginaleffects)

# 假设已拟合好模型
model <- lm(mpg ~ hp + wt + am, data = mtcars)

# 存储迭代用的变量名、值及分组变量的数据框
param_df <- data.frame(
  var_name = c("hp", "wt"),
  var_value = c(150, 3.0),
  by_var = c("am", "am")
)

# 循环处理每一行参数
for (i in seq(nrow(param_df))) {
  # 提取当前迭代的变量信息
  current_var <- param_df$var_name[i]
  current_val <- param_df$var_value[i]
  current_by <- param_df$by_var[i]
  
  # 构建datagrid的命名参数列表
  datagrid_args <- list(model = model)
  datagrid_args[[current_var]] <- current_val
  
  # 调用avg_predictions
  result <- avg_predictions(
    model,
    datagrid = do.call(datagrid, datagrid_args),
    by = current_by
  )
  
  # 处理结果(示例为打印)
  print(result)
}

方法2:利用rlang的非标准求值工具

rlang包的sym()和exec()函数可灵活处理动态变量名,将字符串形式的变量名转换为函数可识别的符号参数,同时支持动态赋值。

示例代码:

library(marginaleffects)
library(rlang)

model <- lm(mpg ~ hp + wt + am, data = mtcars)
param_df <- data.frame(
  var_name = c("hp", "wt"),
  var_value = c(150, 3.0),
  by_var = c("am", "am")
)

for (i in seq(nrow(param_df))) {
  current_var <- sym(param_df$var_name[i])
  current_val <- param_df$var_value[i]
  current_by <- sym(param_df$by_var[i])
  
  # 动态构建datagrid
  custom_datagrid <- exec(datagrid, model = model, !!current_var := current_val)
  
  # 调用avg_predictions
  result <- avg_predictions(
    model,
    datagrid = custom_datagrid,
    by = current_by
  )
  
  print(result)
}

方法3:批量参数列表+purrr映射(替代for循环)

如果参数组合较多,可先将所有迭代参数整理成列表,再用purrr::pmap()批量执行,代码更简洁。

示例代码:

library(marginaleffects)
library(purrr)

model <- lm(mpg ~ hp + wt + am, data = mtcars)
param_df <- data.frame(
  var_name = c("hp", "wt"),
  var_value = c(150, 3.0),
  by_var = c("am", "am")
)

# 将参数转换为列表格式
param_list <- transpose(param_df)

# 批量处理每个参数组合
results <- pmap(param_list, function(var_name, var_value, by_var) {
  datagrid_args <- list(model = model)
  datagrid_args[[var_name]] <- var_value
  avg_predictions(
    model,
    datagrid = do.call(datagrid, datagrid_args),
    by = by_var
  )
})

# 查看所有结果
print(results)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:47:49