# Ejemplo de uso del paquete `eph`

#### Germán Rosati

#### Diego Kozlowski

#### Pablo Tiscornia

#### Guido Weksler

#### Natsumi Shokida

#### 2023-04-14

El paquete `eph` tiene como objetivo facilitar el trabajo de les usuaries que trabajen con los microdatos de la Encuesta Permanente de Hogares. Este tutorial busca ejemplificar un pipeline de trabajo más o menos típico para mostrar el uso de las funciones del paquete.

## Instalación

Para instalar la versión estable del paquete usar:

    install.packages('eph')

Para la versión en desarrollo:

    # install.packages('devtools') si no tiene instalado devtools

    devtools::install_github("holatam/eph")

## Ejemplo de flujo de trabajo

### Descarga de datos: `get_microdata()`

    library(eph)
    library(dplyr)
    library(tidyr)
    library(purrr)
    library(ggplot2)

Obtengamos la base de microdatos de individuos para el tercer trimestre de 2018:

    ind_3_18 <- get_microdata(year = 2018,
                              trimester = 2,
                              type = 'individual')

Puede verse que la función requiere tres argumentos básicos:

- `year`: un valor numérico entero con el año de la encuesta que se desea descargar
- `trimester`: un valor numérico entero con el trimestre (este argumento es válido para la EPH continua, 2004-actualidad)
- `type`: un valor character `"individual"`, para descargar la base de invidividuos y `"hogar"`, para la de hogar.

Si se deseara descargar una base de la EPH puntual, será necesario reemplazar el argumento `trimester` por `wave` que define la onda de la EPH puntual que se desea descargar. Por ejemplo, si se buscara descargar la base individual de la segunda onda del año 2002, debería escribirse

    ind_2_02 <- get_microdata(year = 2001,
                              wave = 2,
                              type = 'individual')

### Etiquetado: `organize_labels()`

Es posible etiquetar de forma automática el dataset llamando a la función `organize_labels()`:

    ind_3_18 <- organize_labels(df = ind_3_18,
                                type='individual')

La función toma dos argumentos:

- `df`: el data.frame que se quiere etiquetar, debe ser producto de `get_microdata()`
- `type`: string; cuál es el tipo de datatset que se quiere etiquetar, `"individual"` o `"hogar"`

Descarguemos y etiquetemos la base de hogares del 3 trimestre de 2018. Podemos hacer uso de los `%>%` pipes de `magritte`:

    hog_3_18 <- get_microdata(year = 2018,
                              trimester = 3,
                              type='hogar') %>%
      organize_labels(.,
                      type = 'hogar')

### Tabulados ponderados: `calculate_tabulates()`

Una de las operaciones más usuales al trabajar con la EPH son los tabulados uni y bivariados. Para ello, el paquete cuenta con la función `calculate_tabulates()`, la cual brinda la posibilidad de obtener tanto resultados en valores absolutos como porcentuales, como así también contar con la posibilidad de extrapolar los datos según el factor de ponderación correspondiente:

    calculate_tabulates(base = ind_3_18,
                        x = 'NIVEL_ED',
                        y = 'CH04',
                        weights = 'PONDERA',
                        add.totals = 'row',
                        add.percentage='col')
    #>                                     NIVEL_ED/CH04 Varon Mujer
    #>  Primaria incompleta (incluye educacion especial)  14.9  14.0
    #>                                 Primaria completa  12.9  13.3
    #>                             Secundaria incompleta  22.7  18.8
    #>                               Secundaria completa  18.8  18.7
    #>                 Superior universitaria incompleta  10.8  12.6
    #>                   Superior universitaria completa  10.4  14.6
    #>                                   Sin instruccion   9.6   8.0
    #>                                             Total 100.0 100.0

Los argumentos principales de la función son:

- `base`: un data.frame
- `x`: string con el nombre de la variable a tabular
- `y`: otro string (opcional) con el nombre de una segunda variable, para una tabla de doble entrada. Tiene que ser de igual largo que `x`
- `weights`: string con el nombre de la variable que contiene los pesos
- `add.totals`: agrega maginales por fila (`row`), columnas (`col`) o ambas (`both`)
- `add.percentage`: calcula porcentajes por fila (`row`), columnas (`col`) o ambas (`both`)

Así, si quisiéramos la misma tabla sin ponderar:

    calculate_tabulates(base = ind_3_18,
                        x = 'NIVEL_ED',
                        y = 'CH04',
                        add.totals = 'row',
                        add.percentage = 'col')
    #>                                     NIVEL_ED/CH04 Varon Mujer
    #>  Primaria incompleta (incluye educacion especial)  15.2  14.0
    #>                                 Primaria completa  13.2  13.1
    #>                             Secundaria incompleta  22.6  18.8
    #>                               Secundaria completa  19.2  18.8
    #>                 Superior universitaria incompleta  10.4  12.6
    #>                   Superior universitaria completa   9.6  14.1
    #>                                   Sin instruccion   9.8   8.5
    #>                                             Total 100.0 100.0

### Armando pools de datos (“análisis de panel”): `organize_panels()`

Otra potencialidad del trabajo con microdatos de la EPH es la capacidad de generar un pool de observaciones de panel. Este procedimiento consta en identificar a una misma persona u hogar encuestado en distintos trimestres, y permite realizar estudios sobre la evolución de sus características con el correr del tiempo. Esto puede generarse, para las bases individuales en `eph` con la función `organize_panels()`. Para ello es necesario contar previamente con las múltiples bases de datos que se deseen poolear, y armar un objeto de tipo lista que las contenga.

    ### Armo vector con el nombre de las variables de interés
    variables <- c('CODUSU','NRO_HOGAR','COMPONENTE','ANO4',
                   'TRIMESTRE','CH04', 'CH06', #variables necesarias para hacer el panel
                   'ESTADO','PONDERA') #variables que nos interesan en nuestro análisis

    ### Descargo la base individual para el 2018_t1
    base_2018t1 <- get_microdata(year = 2018,  trimester = 1,  type = 'individual',
                           vars = variables)

    ### Descargo la base individual para el 2018_t2
    base_2018t2 <- get_microdata(year = 2018,  trimester = 2,  type = 'individual',
                           vars = variables)

    ### Armo el panel
    pool <- organize_panels(bases = list(base_2018t1, base_2018t2),
                            variables = c('ESTADO','PONDERA'),
                            window = 'trimestral')

Los argumentos principales de la función `organize_panels`son:

- `bases`: una lista con las bases de datos a poolear
- `variables`: string con los nombres de las variables de interés
- `window`: un string que indique la ventana de distancia de las observaciones (`anual`) o (`trimestral`)

    pool
    #> # A tibble: 25,411 × 17
    #>    CODUSU       NRO_H…¹ COMPO…²  ANO4 TRIME…³  CH04  CH06 ESTADO PONDERA Periodo
    #>    <fct>          <int>   <int> <int>   <int> <int> <int>  <int>   <int> <yearq>
    #>  1 TQRMNORUTHM…       1       1  2018       1     2    67      3    1008 2018 Q1
    #>  2 TQRMNORUTHM…       1       2  2018       1     1    81      1    1008 2018 Q1
    #>  3 TQRMNORUTHM…       1       3  2018       1     2    22      2    1008 2018 Q1
    #>  4 TQRMNOVQVHM…       1       1  2018       1     1    62      1     886 2018 Q1
    #>  5 TQRMNORPYHM…       1       1  2018       1     1    83      3     594 2018 Q1
    #>  6 TQRMNORPYHM…       1       2  2018       1     2    79      3     594 2018 Q1
    #>  7 TQRMNOTSYHK…       1       1  2018       1     2    79      3     700 2018 Q1
    #>  8 TQRMNOQTTHK…       1       1  2018       1     1    38      1     700 2018 Q1
    #>  9 TQRMNOQTTHK…       1       2  2018       1     2    33      1     700 2018 Q1
    #> 10 TQRMNOQRVHM…       1       1  2018       1     1    64      1     546 2018 Q1
    #> # … with 25,401 more rows, 7 more variables: ANO4_t1 <int>, TRIMESTRE_t1 <int>,
    #> #   CH04_t1 <int>, CH06_t1 <int>, ESTADO_t1 <int>, PONDERA_t1 <int>,
    #> #   consistencia <lgl>, and abbreviated variable names ¹​NRO_HOGAR, ²​COMPONENTE,
    #> #   ³​TRIMESTRE

La función nos devuelve un data.frame similar a la base original, en el cual cada fila es un registro individual, que consta de las observaciones de las variables de interés especificadas, en dos periodos de tiempo. En el período inicial las mismas conservan su nombre, y en el siguiente (año o trimestre) aparecen renombradas con el agregado del string `_t1`.

El trabajo que realiza la función es concatenar todas las bases espeficadas en el argumento `list=` y hacer un `join`, conservando sólo aquellos individuos encuestados en los diferentes trimestres. La columna `consistencia` evalúa si entre ambas observaciones un mismo individuo figura con distinto sexo o con una diferencia absoluta de 2 años de edad.

    pool %>%
      organize_labels(.) %>%
      calculate_tabulates(x = 'ESTADO',
                          y = 'ESTADO_t1',
                          weights = "PONDERA",
                          add.percentage='row')
    #>    ESTADO/ESTADO_t1    1    2    3    4
    #>             Ocupado 88.7  4.0  7.3  0.0
    #>          Desocupado 36.2 34.7 29.0  0.0
    #>            Inactivo  7.5  3.5 88.8  0.2
    #>  Menor de 10 anios.  0.0  0.0  3.7 96.3

Un indicador frecuente construido con esta información es la Matriz de Transición. Ella refleja como los individuos que ocupaban una determinada categoría en el período inicial, se distribuyen en cada una de las categorías en el período siguiente. La misma puede construirse sencillamente utilizando la función `calculate_tabulates`. En este ejemplo, la información refleja que durante 2018, un 3.7% de los ocupados perdió su empleo en el trimestre siguiente.

### Iterando en varias bases

Dado que levantar muchas bases al mismo tiempo puede superar el espacio disponible en memoria, es posible utilizar el parametro `vars` para hacer una selección de variables al mismo tiempo que se levantan las bases.

    df <- get_microdata(year = 2017:2019,
                        trimester = 1:4,
                        type = 'individual',
                        vars = c('ANO4', 'TRIMESTRE', 'PONDERA','ESTADO','CAT_OCUP'))

    df %>%
      sample_n(5)
    #> # A tibble: 5 × 5
    #>    ANO4 TRIMESTRE PONDERA ESTADO CAT_OCUP
    #>   <int>     <int>   <int>  <int>    <int>
    #> 1  2018         2     286      3        0
    #> 2  2017         1     119      1        3
    #> 3  2019         3     352      1        2
    #> 4  2018         3     137      1        2
    #> 5  2019         4     126      4        0

Con estos datos podemos crear por ejemplo la serie de asalarización

\(SO_{t} = \frac{\sum_{i=1}^n w_{i}TCP_{i}}{\sum_{i=1}^n w_{i}OCUP_{i}}\)

    df <- df %>%
      group_by(ANO4, TRIMESTRE) %>%
      summarise(indicador = sum(PONDERA[CAT_OCUP==3 & ESTADO==1], na.rm = T) / sum(PONDERA[ESTADO==1], na.rm = T))
    #> `summarise()` has grouped output by 'ANO4'. You can override using the
    #> `.groups` argument.

    df
    #> # A tibble: 12 × 3
    #> # Groups:   ANO4 [3]
    #>     ANO4 TRIMESTRE indicador
    #>    <int>     <int>     <dbl>
    #>  1  2017         1     0.742
    #>  2  2017         2     0.751
    #>  3  2017         3     0.745
    #>  4  2017         4     0.748
    #>  5  2018         1     0.752
    #>  6  2018         2     0.740
    #>  7  2018         3     0.741
    #>  8  2018         4     0.745
    #>  9  2019         1     0.745
    #> 10  2019         2     0.741
    #> 11  2019         3     0.726
    #> 12  2019         4     0.726

### Cálculo de pobreza:

Un objetivo del paquete `eph`, es lograr automatizar el cálculo de pobreza e indigencia del INDEC para las bases trimestrales1. El gran problema es que no existe información publicada fuera de los informes de prensa en formato pdf sobre los valores de las canastas básicas y alimentarias.

No obstante, hemos desarrollado dos funciones que, de encontrarse disponibles dichos datos, podrían calcular de forma automática los valores de pobreza e indigencia. Mostraremos un ejemplo de juguete con dos datasets de la CABA y sus respectivos valores de canastas.

Existen dos funciones núcleo:

    lineas <- get_poverty_lines()
    lineas %>% head()
    #> # A tibble: 6 × 4
    #>   periodo               CBA   ICE   CBT
    #>   <dttm>              <dbl> <dbl> <dbl>
    #> 1 2016-04-01 00:00:00 1515.  2.42 3664.
    #> 2 2016-05-01 00:00:00 1561.  2.45 3831.
    #> 3 2016-06-01 00:00:00 1614.  2.44 3943.
    #> 4 2016-07-01 00:00:00 1666.  2.42 4034.
    #> 5 2016-08-01 00:00:00 1675.  2.41 4042.
    #> 6 2016-09-01 00:00:00 1711.  2.39 4090.

Esta función descarga los valores de las canastas alimentaria, básica (CBA y CBT) y la inversa del coeficiente de Engels… perdón, Engel (ICE) de la serie provista por INDEC. Esta es la serie para GBA, y es la que publica regularmente INDEC.

    lineas %>%
      select(-ICE) %>%
      pivot_longer(cols = c("CBA", "CBT"), names_to = "canasta", values_to = "valor") %>%
      ggplot() +
        geom_line(aes(x=periodo, y=valor, col=canasta))

Para el calculo de la Pobreza e Indigencia se utilizan canastas regionales, que sólo aparecen en los informes Técnicos.

A modo de ejemplo, en la librería `eph` se encuentra la base `canastas_reg_example` con la información necesaria para realizar el cálculo

    canastas_reg_example %>% head()
    #> # A tibble: 6 × 5
    #>   region  periodo   CBA   CBT codigo
    #>   <chr>   <chr>   <dbl> <dbl>  <dbl>
    #> 1 Cuyo    2016.3  1509. 3872.     42
    #> 2 Cuyo    2016.4  1570. 4030.     42
    #> 3 GBA     2016.3  1684. 4053.      1
    #> 4 GBA     2016.4  1756. 4232.      1
    #> 5 Noreste 2016.3  1513. 3414.     41
    #> 6 Noreste 2016.4  1568. 3539.     41

A su vez, también se encuentra la tabla de `adulto_equivalente` que permite construir la cantidad de adultos equivalentes a nivel hogar, para multiplicar al mismo por la canasta regional correspondiente, a fin de definir la línea a nivel hogar.

    adulto_equivalente %>% head()
    #>   CH04 CH06 adequi
    #> 1    1   -1   0.35
    #> 2    1    1   0.37
    #> 3    1    2   0.46
    #> 4    1    3   0.51
    #> 5    1    4   0.55
    #> 6    1    5   0.60

La función `calculate_poverty` calcula la pertenencia a situaciones de pobreza e indigencia a nivel de los individuos siguiendo la metodología de línea:

    bases <- bind_rows(toybase_individual_2016_03, toybase_individual_2016_04)
    base_pobreza <- calculate_poverty(base = bases,
                                      basket = canastas_reg_example,
                                      print_summary = TRUE)
    #> # A tibble: 2 × 4
    #> # Groups:   ANO4 [1]
    #>    ANO4 TRIMESTRE Tasa_pobreza Tasa_indigencia
    #>   <int>     <int>        <dbl>           <dbl>
    #> 1  2016         3       0.0296          0.0136
    #> 2  2016         4       0.0324          0.0122

    base_pobreza %>%
      select(CODUSU, ITF, region, adequi_hogar, CBA_hogar, CBT_hogar, situacion) %>%
      sample_n(10)
    #> # A tibble: 10 × 7
    #>    CODUSU                          ITF region   adequi…¹ CBA_h…² CBT_h…³ situa…⁴
    #>    <fct>                         <int> <chr>       <dbl>   <dbl>   <dbl> <chr>
    #>  1 TQRMNOQXTHKMLQCDEIGED00494063  6000 Pampeana     1.02   1781.   4293. no_pob…
    #>  2 TQRMNORVPHLKKUCDEIIAD00481768     0 GBA          0.85   1432.   3445. <NA>
    #>  3 TQRMNOPSQHKMLNCDEIJAH00496139     0 GBA          1      1684.   4053. <NA>
    #>  4 TQRMNORPWHJOKSCDEIMBF00507142  6600 Pampeana     0.68   1188.   2862. no_pob…
    #>  5 TQRMNOQRTHJOMLCDEIKAH00485493  9100 Pampeana     0.77   1291.   3106. no_pob…
    #>  6 TQRMNOQRYHKMNMCDEIJAH00495526 15000 GBA          0.66   1112.   2675. no_pob…
    #>  7 TQRMNOSPUHLMMRCDEIJAH00485195 12000 GBA          1.28   2156.   5188. no_pob…
    #>  8 TQRMNOQRSHKMLOCDEFMDB00488863 30000 Pampeana     0.66   1153.   2778. no_pob…
    #>  9 TQRMNOQUQHKKRRCDEIJAH00496219     0 GBA          0.51    896.   2159. <NA>
    #> 10 TQRMNOSTUHKMKNCDEIKAH00496820 15450 Pampeana     0.76   1274.   3066. no_pob…
    #> # … with abbreviated variable names ¹​adequi_hogar, ²​CBA_hogar, ³​CBT_hogar,
    #> #   ⁴​situacion

1. El calculo oficial se realiza sobre bases semestrales no publicadas↩︎