在R中按指定顺序存储多回归模型:替代嵌套列表的简便方法?
针对多因变量多回归模型的扁平列表构建方案
问题背景
我需要针对不同因变量运行OLS和IV两种回归模型,最终将所有结果存入一个扁平列表,要求列表元素顺序为:OLS1、IV1、OLS2、IV2、OLS3、IV3(对应3个因变量的情况)。目前采用先创建嵌套列表再展开的方式,想知道有没有更简洁直接的实现方法。
原始实现代码:
library(ivreg) data(mtcars) models <- c("mpg", "disp", "hp") linear_regressions <- list() iv_regressions <- list() for (i in models) { formula1 <- paste(i, "~ cyl + qsec + carb + drat") formula2 <- paste(i, "~ cyl + qsec + carb | drat | wt") linear_model <- lm(formula = formula1, data = mtcars) iv_model <- ivreg(formula = formula2, data = mtcars) regression_list <- list(linear = linear_model, iv = iv_model) all_regressions[[i]] <- regression_list } flattened_regressions <- unlist(all_regressions, recursive = FALSE) library(modelsummary) modelsummary(flattened_regressions, output = "gt")
模型汇总输出效果为:按OLS1、IV1、OLS2、IV2、OLS3、IV3顺序排列的回归结果汇总表格。
更简洁的实现方法
方法1:循环中直接构建扁平列表
无需嵌套列表,循环时直接按要求顺序将OLS、IV模型依次追加到目标列表,一步到位,省去后续展开步骤:
library(ivreg) library(modelsummary) data(mtcars) models <- c("mpg", "disp", "hp") all_regressions <- list() for (y in models) { # 构建拟合公式 ols_formula <- paste(y, "~ cyl + qsec + carb + drat") iv_formula <- paste(y, "~ cyl + qsec + carb | drat | wt") # 按顺序添加OLS和IV模型到列表 all_regressions[[length(all_regressions) + 1]] <- lm(ols_formula, data = mtcars) all_regressions[[length(all_regressions) + 1]] <- ivreg(iv_formula, data = mtcars) # (可选)给元素命名,方便后续识别 model_names <- c(paste0("OLS_", y), paste0("IV_", y)) names(all_regressions)[(length(all_regressions)-1):length(all_regressions)] <- model_names } # 输出汇总表格 modelsummary(all_regressions, output = "gt")
方法2:用purrr实现函数式编程(无显式循环)
如果习惯tidyverse风格,用purrr::map遍历因变量,每个因变量返回包含OLS、IV的子列表,再用flatten合并为扁平列表,代码更简洁:
library(ivreg) library(modelsummary) library(purrr) data(mtcars) models <- c("mpg", "disp", "hp") all_regressions <- models %>% map(function(y) { list( lm(paste(y, "~ cyl + qsec + carb + drat"), data = mtcars), ivreg(paste(y, "~ cyl + qsec + carb | drat | wt"), data = mtcars) ) }) %>% flatten() # (可选)给元素命名 names(all_regressions) <- rep(c("OLS", "IV"), length(models)) %>% paste0("_", rep(models, each = 2)) modelsummary(all_regressions, output = "gt")
方法3:基于模型组合的批量拟合(扩展性强)
先生成所有因变量与模型类型的组合,再批量拟合,适合后续添加更多模型类型或因变量的场景:
library(ivreg) library(modelsummary) library(dplyr) library(purrr) data(mtcars) # 定义模型类型及对应的公式模板 model_types <- tibble( type = c("OLS", "IV"), formula_template = c("{y} ~ cyl + qsec + carb + drat", "{y} ~ cyl + qsec + carb | drat | wt") ) # 生成所有因变量与模型类型的组合,并确保顺序符合要求 model_specs <- expand.grid(y = c("mpg", "disp", "hp"), type = model_types$type, stringsAsFactors = FALSE) %>% left_join(model_types, by = "type") %>% arrange(y, type) # 批量拟合模型并提取为扁平列表 all_regressions <- model_specs %>% mutate( model = pmap(list(y, formula_template, type), function(y, template, type) { formula <- gsub("{y}", y, template) if (type == "OLS") lm(formula, data = mtcars) else ivreg(formula, data = mtcars) }) ) %>% pull(model) # (可选)给元素命名 names(all_regressions) <- paste0(model_specs$type, "_", model_specs$y) modelsummary(all_regressions, output = "gt")
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

