Есть ли способ разрушить взвешенные средства в R? - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь перевести следующий код из Stata в R:

collapse (mean) erate_total_male laborforce_male erate_total_male_1953 laborforce_male_1953 share_expellees_male share_dest_flats instrument share_agric_1939 city_state (max) occzone_occu [aw=laborforce_male], by(bundesland_id_1953 occupation_id)

Я пытался использовать пакет collapse в R, но я не уверен, как включить элемент веса кода Stata или максимального значения (хотя я могу просто сгенерировать новую переменную, чтобы обойти это).

test1 <- rep_data %>%
  mutate(bundesland_id_1953 = 
           case_when(
             bundesland_id == 8 ~ 99,
             bundesland_id == 9 ~ 99,
             bundesland_id == 10 ~ 99,
           )) %>%
  group_by(bundesland_id_1953, occupation_id) %>% 
  select(erate_total_male, laborforce_male, erate_total_male_1953, laborforce_male_1953, share_expellees_male, share_dest_flats, instrument_male, share_agric_1939, city_state, occzone_occu) %>% fmean

Я также пытался сгенерировать средства для всех переменных, но столкнулся с той же проблемой, добавив вес:

t6Data2 <- rep_data %>%
  mutate(bundesland_id_1953 = 
           case_when(
             bundesland_id == 8 ~ 99,
             bundesland_id == 9 ~ 99,
             bundesland_id == 10 ~ 99,
           )) %>% 
  group_by(bundesland_id_1953, occupation_id) %>% summarise_at(vars(erate_total_male, laborforce_male, erate_total_male_1953, laborforce_male_1953, share_expellees_male, share_dest_flats, instrument_male, share_agric_1939, city_state)

Наконец, я попытался все oop, но мои переменные не отображаются, когда я запускаю регрессию с помощью lm ():

test444 <- rep_data %>%
  mutate(bundesland_id_1953 = 
           case_when(
             bundesland_id == 8 ~ 99,
             bundesland_id == 9 ~ 99,
             bundesland_id == 10 ~ 99,
           )) %>% 
  group_by(bundesland_id_1953, occupation_id)

t6_data_test4 <- sapply(c(test444$erate_total_male, test444$laborforce_male, test444$erate_total_male_1953, test444$laborforce_male_1953, test444$share_expellees_male, test444$share_dest_flats, test444$instrument_male, test444$share_agric_1939, test444$city_state), function(x) {
  weighted.mean(x, weight = laborforce_male)
}) 

Я не уверен, что делать, но буду признателен за любую помощь. Я относительный новичок, поэтому я прошу прощения за любые очевидные ошибки, которые я сделал в моем коде.

1 Ответ

1 голос
/ 30 апреля 2020

Это работает:

library(dplyr)

d <- tibble::tibble(
  bundesland_id_1953 = sample(letters[1:3], 100, replace = TRUE),
  occupation_id = factor(sample(1:3, 100, replace = TRUE)),
  x = sample(1:5, 100, replace = TRUE),
  y = sample(1:5, 100, replace = TRUE),
  weight = runif(100)
)

d <- group_by(d, bundesland_id_1953, occupation_id)

bind_cols(
  group_keys(d),
  group_split(d) %>% 
    purrr::map_df(
      # [NOTE] use `across` in forthcoming dplyr 1.0.0
      ~ summarise_at(.x, vars(x, y), weighted.mean, w = .x$weight)
    )
)

Я не доволен решением, приведенным ниже, потому что оно уродливее, чем то, что предназначены для «аккуратных» инструментов. Черт, это менее разборчиво, чем Stata - я разочарован собой.

Я также с подозрением отношусь к вашей схеме взвешивания: в какой-то момент похоже, что вы взвешиваете переменную ... самим собой? Но я, конечно, не знаю данных.

...