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

