Введите производный список purrr в tab_model в r

#r #purrr

#r #муррр

Вопрос:

Я хотел бы создать таблицу линейных моделей со всеми независимыми переменными вверху и всеми зависимыми переменными слева. Это можно сделать с помощью функции tab_model пакета sjPlot: https://cran.r-project.org/web/packages/sjPlot/vignettes/tab_model_estimates.html .

В то время как в документации указано, как получить таблицу с несколькими моделями, вводя каждую модель по очереди (m1, m2, m3 и т.д.), У меня есть список линейных моделей, полученный из purr. Я искал документацию и онлайн-форумы, но не могу найти ничего о том, как это сделать. Это один из примеров:

 library(sjPlot)
library(sjmisc)
library(sjlabelled)
library(tidyverse)

df <- data.frame(study_id = c(1:20),
                 leptin = runif(20),
                 insulin = runif(20),
                 gene1 = runif(20),
                 gene2 = runif(20),
                 age = runif(20, min = 20, max = 45),
                 sex = sample(c(0,1), size = 20, replace = TRUE))

model_function_covariates_for_table <- function(x,y) {
  M1 <- paste0(x, "~", y, "  age   sex")
  M1_fit <- lm(M1, data = df)
  return(M1_fit)
}

bioactives <- names(df)[c(2:3)]
genes <- names(df)[c(4:5)]

bioactives <- purrr::set_names(bioactives)
genes <- purrr::set_names(genes)

# Works
m <- model_function_covariates_for_table("leptin", "gene1")

tab_model(m)

# Doesn't work
m <- map(bioactives,
         ~map(genes, model_function_covariates_for_table, y = .x))

tab_model(m)
 

Сообщение об ошибке:

 Error in if (fam.info$is_linear) transform <- NULL else transform <- "exp" : 
  argument is of length zero
In addition: Warning message:
Could not access model information.
 

Заранее благодарю за любые советы.

Ответ №1:

Здесь нам нужно map2 , поскольку мы передаем соответствующие элементы ‘bioactives’ и ‘genes’ в функцию model_function_covariates_for_table

 library(purrr)
map2(bioactives, genes, ~ model_function_covariates_for_table(.x, .y))
 

-вывод

 $leptin

Call:
lm(formula = M1, data = df)

Coefficients:
(Intercept)        gene1          age          sex  
   0.692454    -0.200365    -0.001285     0.044467  


$insulin

Call:
lm(formula = M1, data = df)

Coefficients:
(Intercept)        gene2          age          sex  
  0.7475482   -0.1388409   -0.0006337   -0.1919895  
 

Он tab_model будет применен к каждому из этих элементов

 out <- map2(bioactives, genes, ~ 
         model_function_covariates_for_table(.x, .y) %>% 
          tab_model)

out[[1]]
 

введите описание изображения здесь

 out[[2]]
 

введите описание изображения здесь


В base R соответствующей функции Map

 Map(model_function_covariates_for_table, bioactives, genes)