Достаточно ли использовать «group_by» для запуска сгруппированной линейной регрессии? - PullRequest
1 голос
/ 14 апреля 2020

В моем наборе данных около 7000 семей, и на каждую семью у меня есть доход родителей и доход их детей. Теперь я хочу провести простую линейную регрессию доходов родителей на доходы своих детей. Однако мне нужно убедиться, что эта регрессия выполняется для каждой семьи.

пример набора данных:

income_parents <- c(1000, 15000, 4500, 7000, 6500, 2500, 3500, 9000, 1200)
income_children <- c(1200, 7500, 2500, 8000, 5500,  7500, 3250, 7500, 850)
family_name <- c("Miller", "Smith", "Clark", "Powell", "Brown", "Jone", "Garcia", "Williams", "Lopez")

df <- data.frame(income_parents, income_children, family_name)

Я запускаю следующую регрессию после группировки по имени семейства:

df_AR <- df %>% group_by(family_name)
AR_1 <- lm(income_children ~ income_parents, data = df_AR)
summary(AR_1)

Теперь мне интересно, учитывает ли функция lm () вложенную структуру данных? Если нет: как я могу изменить свой код, чтобы он учитывался?

1 Ответ

2 голосов
/ 14 апреля 2020

Это не будет делать то, что вы надеетесь. Метод lm довольно старый, и поэтому он не знаком с функциональностью более новых библиотек, таких как dplyr.

. Я полагаю, что вы можете достичь sh того, что вы хотите, добавив фамилию как показатель для модели. Что-то вроде:

model <- lm(income_children ~ family_name + family_name:income_parents, data = df)

Это эффективно создаст мини-модель для каждой семьи. Первая часть дает перехват для каждого семейства, а переменная взаимодействия дает наклон для income_parents.

Если вы хотите придерживаться подхода многих моделей, вы можете использовать nest .

model_one <- function(data) {
  lm(income_children ~ income_parents, data = data)
}

models <- df %>%
  group_by(family_name) %>%
  nest() %>%
  mutate(model = map(data, model_one))

models
# # A tibble: 9 x 3
# # Groups:   family_name [9]
#   family_name data             model 
#   <fct>       <list>           <list>
# 1 Miller      <tibble [1 × 2]> <lm>  
# 2 Smith       <tibble [1 × 2]> <lm>  
# 3 Clark       <tibble [1 × 2]> <lm>  
# 4 Powell      <tibble [1 × 2]> <lm>  
# 5 Brown       <tibble [1 × 2]> <lm>  
# 6 Jone        <tibble [1 × 2]> <lm>  
# 7 Garcia      <tibble [1 × 2]> <lm>  
# 8 Williams    <tibble [1 × 2]> <lm>  
# 9 Lopez       <tibble [1 × 2]> <lm>  

Вы заметите, что этот вывод пока не очень полезен. Его можно аккуратно суммировать с помощью метла :: glance , а затем не использовать. Здесь это не очень интересно, потому что каждая модель имеет только одну точку данных.

summarized <- models %>%
  mutate(summary = map(model, broom::glance)) %>%
  unnest(summary)

# Drop the still-nested columns for display.
summarized %>% select(-data, -model)
#   family_name r.squared adj.r.squared sigma statistic p.value    df logLik   AIC   BIC deviance df.residual
#   <fct>           <dbl>         <dbl> <dbl>     <dbl>   <dbl> <int>  <dbl> <dbl> <dbl>    <dbl>       <int>
# 1 Miller              0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 2 Smith               0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 3 Clark               0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 4 Powell              0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 5 Brown               0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 6 Jone                0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 7 Garcia              0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 8 Williams            0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0
# 9 Lopez               0             0   NaN        NA      NA     1    Inf  -Inf  -Inf        0           0

Для более подробной информации я рекомендую главу "Наука данных" для Many Models для R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...