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

