Рассчитать среднее значение по децилям в объекте Svydesign - PullRequest
0 голосов
/ 06 мая 2019

Итак, я работаю с ENIGH - База данных, которая на испанском означает «Национальное обследование доходов и расходов домохозяйств». Это упражнение, проводимое мексиканским правительством, и, как и большинство подобных обследований, оно работает с весами..

Я пытаюсь рассчитать средний, максимальный и минимальный доход домохозяйства по децилям.Другими словами, что такое доход на каждые 10%, группируя домохозяйства на основе их дохода.Если честно, я не зашел так далеко, но вот что я получил до сих пор:

  1. Мне нужен мой объект svydesign
  2. Преобразование этого в таблицу с использованием svytable
  3. Упорядочить использование desc () для моей переменной дохода
ENIGH_design <-svydesign(id=~upm, strata=~est_dis, weights=~factor_hog, data = ENIGH)
ENIGH_table <- svytable(ing_cor, ENIGH_design)

Вот где это сложно, предположим, у меня есть 100 строк, я не могу взять первые 10 из них, потому что в действительностиПринимая во внимание вес, это может быть 9% или 20% (я просто бросаю цифры) от фактического населения.

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

Я думаю, что лучший подход будетиспользовать комбинацию:

  • mutate() для создания новой переменной base
  • if() в сочетании с mutate, чтобы определить, на каком дециле каждая строка падает до
  • group_by() и mean() для расчета того, к чему я стремлюсь

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

Спасибо за чтение.Спасибо за вашу помощь.

База данных доступна: https://www.inegi.org.mx/programas/enigh/nc/2016/default.html#Datos_abiertos

Вот пример того, как выглядит моя БД:

folioviv    foliohog    ubica_geo   est_dis  upm  factor    ing_cor
100587003      1        10010000       2     610    180     22,723
100587004      1        10010000       2     610    180     17,920
100587005      1        10010000       2     610    180     27,506
100587006      1        10010000       2     610    180     56,236
100605201      1        10010000       2     620    178     41,587
100605202      1        10010000       2     620    178     135,437
100605203      1        10010000       2     620    178     62,386
100605205      1        10010000       2     620    178     103,502
100605206      1        10010000       2     620    178     27,323
100606301      1        10010000       3     630    223     68,042
100606302      1        10010000       3     630    223     98,537
100606305      1        10010000       3     630    223     53,237
100606306      1        10010000       3     630    223     132,861
100609801      1        10010000       3     640    232     190,033
100609802      1        10010000       3     640    232     28,654
100609805      1        10010000       3     640    232     74,408
100631401      1        10010000       1     650    171     80,761
100711503      1        10010000       1     770    184     38,640
100711504      1        10010000       1     770    184     81,672

Есть еще много столбцов, но онине нужны для этого упражнения.

1 Ответ

0 голосов
/ 07 мая 2019

Создайте таблицу (dataframe или data.table или tibble), которая выглядит следующим образом:

> dt
folioviv    factor    ing_tri
       1       247      30000
       2       200      15000
       3       150      50000
incomes <- rep(dt$ing_tri, times = dt$factor)
deciles <- quantile(incomes, probs = seq(0.1, 1, by = 0.1), names = TRUE)

На вашем месте я бы попробовал с names = FALSE сделать его управляемым. В противном случае это будет именованный список, и это немного раздражает.

О, и если вы хотите вычислить среднее значение, просто наберите mean(incomes).

PS: столбец folioviv на самом деле не нужен, но вы можете поместить его на всякий случай.

...