1

I have regression models (OLS/IV ivreg) which I use on different datasets and different outcomes. I use a loop to change the outcome variable, run some models and store results with modelsummary in separate .html files. I wonder how I could combine those, like having different panels or nested outcomes.

library(modelsummary)
library(ivreg)

data(mtcars)

models <- c("mpg", "disp", "hp")

for(i in models){
  
formula1 <- paste(i, "~ cyl + qsec + carb + drat")
formula2 <- paste(i, "~ cyl + qsec + carb | drat | wt")

# linear regression model
ols <- lm(formula = formula1, data = mtcars)

# instrument variable regression
iv <- ivreg(formula = formula2, data = mtcars)

modelsummary(list("OLS" = ols, "IV" = iv),
             output = paste0("Outcome_", i, ".html"))
}

Result is supposed to be look something like this:

enter image description here

Marco
  • 2,368
  • 6
  • 22
  • 48
  • Create a single list with 6 models, then use `add_header_above()` if using `kableExtra` or `tab_spanner()` if using `gt` to add column headers. You'll find examples of both here: https://modelsummary.com/articles/appearance.html#gt – Vincent Aug 28 '23 at 18:22

1 Answers1

1

Create a list of regression models as Vincent said.

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)
  
  regressions[[paste0(i, ".linear")]] <- linear_model
  regressions[[paste0(i, ".iv")]] <- iv_model
}

Use tab_spanner()

modelsummary(regressions, output = "gt") %>% 
  cols_label(
    mpg.linear   = "OLS",
    mpg.iv = "IV",
    disp.linear  = "OLS",
    disp.iv  = "IV",
    hp.linear    = "OLS",
    hp.iv    = "IV",
  ) %>% 
  # column labels
  tab_spanner(label = 'MPG', columns = 2:3) %>%
  tab_spanner(label = 'DISP', columns = 4:5) %>%
  tab_spanner(label = 'HP', columns = 6:7) 

Don't know if the code is efficient, but it works.

enter image description here

Marco
  • 2,368
  • 6
  • 22
  • 48