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

如何使用purrr遍历协变量与结果变量的所有组合运行lm线性回归

报错原因解答
  • 第一是你代码中存在未定义的变量:你创建paramlist时用到的covarL和outcomeL没有提前定义,你之前生成的协变量、结果变量集合命名为covars和outcomes,变量名不匹配会触发报错。
  • 第二是map2/pmap的参数传入错误:as_mapper(.f, ...) : argument ".f" is missing, with no default报错的直接原因是你调用map2时没有传入要执行的函数参数,比如只写了map2(covars, outcomes)漏掉了后面的拟合函数部分,就会触发该报错。另外map2本身是按两个列表的位置一一配对遍历,本身就不支持全组合遍历的需求。
全组合遍历实现方案

你可以用purrr提供的cross系列函数生成两个列表的笛卡尔积(全组合),也可以用expand.grid先生成变量名的全组合再遍历拟合,两种方案的示例代码如下:

前置准备

先把结果变量、协变量转成列表格式,方便后续遍历:

library(dplyr)
library(purrr)

dataset <- tibble(
    y1 = rnorm(n=100),
    y2 = rnorm(n=100),
    x1 = rnorm(n=100),
    x2 = rnorm(n=100)
)

outcome_list <- as.list(select(dataset, y1, y2))
covar_list <- as.list(select(dataset, x1, x2))

方案1:cross2生成全组合后遍历

# 生成所有协变量+结果变量的组合
all_combo <- cross2(.x = covar_list, .y = outcome_list)

# 遍历所有组合拟合回归模型
model_res <- all_combo %>% 
  map(~ lm(.y ~ .x, data = dataset))

# 给模型结果命名,方便后续识别对应变量
names(model_res) <- cross2(names(covar_list), names(outcome_list)) %>% 
  map_chr(paste, collapse = "~")

方案2:变量名组合遍历(更方便处理多协变量集合的场景)

如果后续你要遍历的是不同的协变量组合(比如同时用x1+x2、仅用x1等不同的协变量集合做敏感性分析),用变量名拼接公式的方式更灵活:

# 生成变量名的全组合表
var_combo <- expand.grid(
  y_name = names(outcome_list),
  x_name = names(covar_list),
  stringsAsFactors = FALSE
)

# 逐行遍历拟合模型
model_res2 <- pmap(var_combo, function(y_name, x_name) {
  fit_formula <- reformulate(x_name, response = y_name)
  lm(fit_formula, data = dataset)
})

# 给结果命名
names(model_res2) <- paste(var_combo$y_name, var_combo$x_name, sep = "~")

如果要遍历多协变量集合,只需要修改covar_list的结构即可,示例:

# 定义不同的协变量集合
covar_set <- list(
  "仅x1" = "x1",
  "仅x2" = "x2",
  "x1+x2" = c("x1", "x2")
)
# 后续遍历逻辑和上面的方案2完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:18:03