如何修改purrr::map2代码实现变量全排列组合回归建模
问题原因
map2()为位置匹配的并行遍历函数,仅会将输入的两个列表中相同位置的元素配对,因此你当前的代码仅能生成a~c、b~d两组配对的模型- 要得到所有结局和预测因子的两两组合模型,需先生成全量配对再批量拟合
修改后代码
方案1:用cross2生成组合(输出命名列表)
原有变量定义无需调整,仅修改遍历逻辑即可:
outcomes <- df %>% select(a, b) predictors <- df %>% select(c, d) model <- function(outcomes, predictors) lm(outcomes ~ predictors) # 生成全组合后批量拟合 all_models <- purrr::cross2(outcomes, predictors) %>% purrr::set_names(~ paste0(names(.x[[1]]), "~", names(.x[[2]]))) %>% purrr::map(~ model(.x[[1]], .x[[2]]))
方案2:用expand_grid生成组合(输出结构化数据框)
如果需要更方便后续批量处理模型结果,推荐用数据框存储组合和对应模型:
library(tidyverse) model_res <- tidyr::expand_grid( outcome = as.list(df %>% select(a, b)), predictor = as.list(df %>% select(c, d)) ) %>% dplyr::mutate( outcome_name = names(outcome), predictor_name = names(predictor), fit_model = purrr::map2(outcome, predictor, ~ lm(.x ~ .y)) )
结果说明
- 两种方案都可以得到你需要的4组模型:
a~c、a~d、b~c、b~d - 方案1的结果为命名列表,可直接通过
all_models$"a~d"调取对应模型 - 方案2的结果为数据框,每一行对应一组拟合组合,可直接批量提取R²、P值等模型指标
内容的提问来源于stack exchange,提问作者Chloe Laurent
相关产品推荐
相关产品推荐

