как запускать модели на комбинациях двух переменных и возвращать фрейм данных со значениями p и r-квадрат для каждой модели с помощью tidyverse

Я пытаюсь запускать модели с разными комбинациями переменных. Я хочу иметь фрейм данных с 3 столбцами: переменные, p-значение и r-квадрат для каждой модели. В качестве примера я использую набор данных mtcars. Вот мои коды:

c('wt', 'hp', 'qsec') %>% 
    combn(2, paste, collapse='*') %>% 
    structure(., names=.) %>% 
    map(~formula(paste('mpg~', .x))) %>% 
    map(lm, data=mtcars) %>%
    map(~coef(summary(.x))[4,4]) %>% 
    unlist() %>% 
    data.frame(p.value=.) %>% 
    rownames_to_column(var='interaction')

Вот мой результат:

interaction      p.value
1       wt*hp 0.0008108307
2     wt*qsec 0.2652596233
3     hp*qsec 0.0001411028  

Вопрос в том, как я могу добавить еще один столбец в фрейм данных после извлечения r-квадрата из каждой модели? Я хочу добиться этого в приведенной выше операции объединения в цепочку. Поскольку я надеюсь обобщить подход к другим типам моделей, я хочу сделать это без использования пакета broom. Цените это, если кто-нибудь может мне с этим помочь. Большое спасибо.


person zesla    schedule 24.07.2017    source источник


Ответы (2)


Я бы попробовал следовать

library(tidyverse)

reg.vars <- c('wt', 'hp', 'qsec')

tibble(interaction = combn(reg.vars, 2, paste, collapse = '*')) %>%
    mutate(fit = map(interaction, ~ summary(lm(paste('mpg ~', .), data = mtcars))),
           pval = map_dbl(fit, ~ coef(.)[4, 4]),
           rsq = map_dbl(fit, ~ .$r.squared)) %>%
    select(-fit)
# # A tibble: 3 x 3
#   interaction         pval       rsq
#         <chr>        <dbl>     <dbl>
# 1       wt*hp 0.0008108307 0.8847637
# 2     wt*qsec 0.2652596233 0.8340742
# 3     hp*qsec 0.0001411028 0.7854734
person mt1022    schedule 24.07.2017
comment
Это именно то, что я хочу. Спасибо! - person zesla; 24.07.2017

Мы можем использовать broom функции пакета, такие как glance, tidy

library(broom)
library(tidyverse)
v1 %>% 
     combn(2, paste, collapse='*') %>% 
     structure(., names=.) %>% 
      map(~summary(lm(formula(paste('mpg~', .x)), data = mtcars))) %>% 
      map(~ data.frame( tidy(.)[4,]['p.value'], glance(.)['r.squared'])) %>%    
      bind_rows(., .id = 'interaction') 
#  interaction      p.value r.squared
#1       wt*hp 0.0008108307 0.8847637
#2     wt*qsec 0.2652596233 0.8340742
#3     hp*qsec 0.0001411028 0.7854734

данные

v1 <- c('wt', 'hp', 'qsec')
person akrun    schedule 24.07.2017