Я использовал часть ваших данных и поиграл с новым синтаксисом dplyr 0.8.3
pacman::p_load(tidyverse, broom)
my.data <- tibble::tribble(
~ADDRESS_CITY_NAME, ~UNITS, ~PRICE,
"INDEPENDENCE", 4.1108739, 0.42526774,
"INDEPENDENCE", 4.1431347, 0.47000363,
"INDEPENDENCE", 4.2766661, 0.17395331,
"INDEPENDENCE", 4.060443, 0.46373402,
"LOVELAND", 4.3820266, 0.3852624,
"LOVELAND", 4.2626799, 0.42526774,
"LOVELAND", 4.1271344, 0.51282363,
"LOVELAND", 4.804021, 0.43178242,
"LOVELAND", 4.1896547, 0.37843644,
"LOVELAND", 4.2766661, 0.32930375,
"LOVELAND", 4.4543473, 0.39204209,
"LOVELAND", 4.3820266, 0.39877612,
"LOVELAND", 3.7841896, 0.43178242
)
Затем я использовал найденный здесь синтаксис для новых функций, упрощая применение функции для каждой группы.
https://dplyr.tidyverse.org/reference/group_map.html
Следующий синтаксис подойдет для каждой группы lm и вернет таблицу с коэффициентами и значениями p:
my.data %>%
group_by(ADDRESS_CITY_NAME)%>%
group_modify(~ tidy(lm(log(UNITS) ~ log(PRICE), data=.x)))
Возвращает желаемый результат :
# A tibble: 4 x 6
# Groups: ADDRESS_CITY_NAME [2]
ADDRESS_CITY_NAME term estimate std.error statistic p.value
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 INDEPENDENCE (Intercept) 1.38 0.0139 98.9 0.000102
2 INDEPENDENCE log(PRICE) -0.0426 0.0125 -3.40 0.0767
3 LOVELAND (Intercept) 1.37 0.179 7.68 0.000118
4 LOVELAND log(PRICE) -0.0902 0.197 -0.457 0.662
Другой способ моделирования сгруппированных данных - это вложение групп. Здесь я хотел бы использовать все три функции метлы, а не повторять примерку:
Кредит идет на этот великолепный блог: https://drsimonj.svbtle.com/running-a-model-on-separate-groups
broomed <- my.data %>%
nest(-ADDRESS_CITY_NAME)%>%
mutate(fit=map(data, ~ lm(log(UNITS) ~ log(PRICE), data = .)),
glanced = map(fit, glance),
augmented = map(fit, augment),
tidied = map(fit,tidy))
broomed %>% unnest(glanced)
broomed %>% unnest(augmented)
broomed %>% unnest(tidied)