Я часто в состоянии хотеть разделить-применить-объединить регрессионные модели. Я нашел два способа сделать это: «purrr
» и «dplyr::do()
».
Проблема с подходом purrr
: я хочу, чтобы столбцы в результирующем data.frame указывали уровни переменных, в соответствии с которыми было выполнено разделение, как в обычной операции group_by %>%
суммирования.
Проблема с подходом dplyr::do()
: есть неприятный клубок do(tidy(lm_robust))
, который явно не элегантен. Но я вернул колонны.
Main Q: есть ли способ сделать split-apply-Объединить в purrr
, который прекрасно возвращает переменные разбиения?
Минимальный рабочий пример, приведенный ниже, показывает, что проблема связана с тем, сколько переменных вы разделяете.
library(tidyverse)
library(estimatr) # for lm_robust
# spliting by one variable
# the purrr approach
mtcars %>%
split(.$am) %>%
map(~lm_robust(mpg ~ hp, data = .)) %>%
map_df(tidy, .id = "am") # annoying to have to type "am" again!
# the dplyr do() approach
mtcars %>%
group_by(am) %>%
do(tidy(lm_robust(mpg ~ hp, data = .))) # gross nesting
# Splitting by two variables
# the purr approach??
mtcars %>%
split(list(.$am, .$vs)) %>%
map(~lm_robust(mpg ~ hp, data = .)) %>%
map_df(tidy, .id = "OH NO") # the column encodes both am and vs info
# the dplyr do() approach works great
mtcars %>%
group_by(am, vs) %>%
do(tidy(lm_robust(mpg ~ hp, data = .))) # still nested up.
EDIT
вот способ, который использует nest () и unnest (). неуклюжий, но, может быть, лучший подход мурлыкать? вдохновленный http://stat545.com/block024_group-nest-split-map.html
mtcars %>%
group_by(am, vs) %>%
nest() %>%
mutate(fit = map(data, ~lm_robust(mpg ~ hp, data = .)),
tidy = map(fit, tidy)) %>%
select(am, vs, tidy) %>%
unnest(tidy)
РЕДАКТИРОВАТЬ 2
Вот способ с group_map
, такой же уродливый, как и do
, но, может быть, так оно и есть.
mtcars %>%
group_by(am, vs) %>%
group_map(~tidy(lm_robust(mpg ~ hp, data = .x)))
РЕДАКТИРОВАТЬ 3:
Полагаю, то, что мне показалось бы красивым, делало бы одну вещь в строке, что-то вроде этого, но я уважаю комментарии ниже, говорящие, черт, карта группы довольно близка.
# does not work
mtcars %>%
group_by(am, vs) %>%
map(~lm_robust(mpg ~ hp, data = .)) %>%
map_df(tidy)