R中的线性模型列表映射映射

时间:2018-09-18 23:59:03

标签: r dictionary linear-regression tidyverse emmeans

我有大约100多个线性模型的列表,我想采用每种模型的估计均值和标准误差。

让我们以mtcars为例。

library(tidyverse); library(magrittr); library(emmeans)

mtcars %<>% 
  mutate(
    cyl = as.factor(cyl)
  )

df <- mtcars %>% select(cyl, hp, mpg)

我可以使用emmeans轻松获得每个模型的估计均值和标准误差:

mod <- lm(hp ~ cyl, data = df)
emmeans(mod, "cyl")

但是,如果我有型号列表怎么办?

list_lm <- df %>% 
   select(-c(cyl)) %>%
   map(function(dv) lm(dv ~ df$cyl, data = .)) 

我不能使用:

emmeans(list_lm$hp, "cyl")
Error in ref_grid(object, ...) : Perhaps a 'data' or 'params' argument is needed

理想情况下,我想要可以为所有模型提供这些统计信息的东西。对于模型的系数,类似broom::tidy,但对于emmeans

list_lm %>% 
   map(broom::tidy)

1 个答案:

答案 0 :(得分:3)

您的直觉是正确的。该解决方案需要将中间结果保存在列表列中,然后再将其拆包,但是鉴于emmeans输出的结构,broom::tidy()是不必要的。只需将emmeans输出转换为data.frames和unnest()的列表列即可。

library(dplyr)
library(purrr)
library(tidyr)
library(emmeans)

ds_mtcars <- 
  mtcars %>% 
  mutate(cyl = as.factor(cyl)) 

ds_nest <- 
  ds_mtcars %>% 
  group_by(am) %>% 
  nest() 

foo_model <- function(data){
  lm(hp ~ cyl, data = data)
}

ds_nest <- ds_nest %>% mutate(model = map(.x = data, .f = foo_model))

ds_temp <- 
  ds_nest %>% 
  mutate(
    emmeans = pmap(
      .l = list(
        object = model, 
        specs = "cyl"
      ),
      .f = emmeans
    )
  ) 

ds_temp %>% 
  mutate(emm2 = map(emmeans, data.frame)) %>% 
  unnest(emm2)

此外,purrr函数map()pmap()可以使人陷入困境,但是我竭尽全力引导自己和新用户在blog上使用这些功能。