我有大约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)
答案 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上使用这些功能。