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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:58:24