eph
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.
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")
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:
<- get_microdata(year = 2018,
ind_3_18 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 descargartrimester
: 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
<- get_microdata(year = 2001,
ind_2_02 wave = 2,
type = 'individual')
organize_labels()
Es posible etiquetar de forma automática el dataset llamando a la
función organize_labels()
:
<- organize_labels(df = ind_3_18,
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
:
<- get_microdata(year = 2018,
hog_3_18 trimester = 3,
type='hogar') %>%
organize_labels(.,
type = 'hogar')
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.framex
: string con el nombre de la variable a tabulary
: 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 pesosadd.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
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
<- c('CODUSU','NRO_HOGAR','COMPONENTE','ANO4',
variables '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
<- get_microdata(year = 2018, trimester = 1, type = 'individual',
base_2018t1 vars = variables)
### Descargo la base individual para el 2018_t2
<- get_microdata(year = 2018, trimester = 2, type = 'individual',
base_2018t2 vars = variables)
### Armo el panel
<- organize_panels(bases = list(base_2018t1, base_2018t2),
pool 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 poolearvariables
: string con los nombres de las variables de
interéswindow
: un string que indique la ventana de distancia
de las observaciones (anual
) o
(trimestral
)
pool#> # A tibble: 25,411 x 17
#> CODUSU NRO_HOGAR COMPONENTE ANO4 TRIMESTRE CH04 CH06 ESTADO PONDERA
#> <fct> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 TQRMNORUTHMK~ 1 1 2018 1 2 67 3 1008
#> 2 TQRMNORUTHMK~ 1 2 2018 1 1 81 1 1008
#> 3 TQRMNORUTHMK~ 1 3 2018 1 2 22 2 1008
#> 4 TQRMNOVQVHMO~ 1 1 2018 1 1 62 1 886
#> 5 TQRMNORPYHMM~ 1 1 2018 1 1 83 3 594
#> 6 TQRMNORPYHMM~ 1 2 2018 1 2 79 3 594
#> 7 TQRMNOTSYHKM~ 1 1 2018 1 2 79 3 700
#> 8 TQRMNOQTTHKM~ 1 1 2018 1 1 38 1 700
#> 9 TQRMNOQTTHKM~ 1 2 2018 1 2 33 1 700
#> 10 TQRMNOQRVHMM~ 1 1 2018 1 1 64 1 546
#> # ... with 25,401 more rows, and 8 more variables: Periodo <yearqtr>,
#> # ANO4_t1 <int>, TRIMESTRE_t1 <int>, CH04_t1 <int>, CH06_t1 <int>,
#> # ESTADO_t1 <int>, PONDERA_t1 <int>, consistencia <lgl>
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.
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.
<- get_microdata(year = 2017:2019,
df trimester = 1:4,
type = 'individual',
vars = c('ANO4', 'TRIMESTRE', 'PONDERA','ESTADO','CAT_OCUP'))
%>%
df sample_n(5)
#> # A tibble: 5 x 5
#> ANO4 TRIMESTRE PONDERA ESTADO CAT_OCUP
#> <int> <int> <int> <int> <int>
#> 1 2019 3 107 3 0
#> 2 2017 4 170 4 0
#> 3 2019 3 109 4 0
#> 4 2019 4 163 1 3
#> 5 2019 3 121 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 x 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
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:
<- get_poverty_lines()
lineas %>% head()
lineas #> # A tibble: 6 x 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
%>% head()
canastas_reg_example #> # A tibble: 6 x 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.
%>% head()
adulto_equivalente #> 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:
<- bind_rows(toybase_individual_2016_03, toybase_individual_2016_04)
bases <- calculate_poverty(base = bases,
base_pobreza basket = canastas_reg_example,
print_summary = TRUE)
#> # A tibble: 2 x 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 x 7
#> CODUSU ITF region adequi_hogar CBA_hogar CBT_hogar situacion
#> <fct> <int> <chr> <dbl> <dbl> <dbl> <chr>
#> 1 TQRMNOPWPHLKKUCDEFNF~ 0 Nores~ 0.83 1256. 2834. <NA>
#> 2 TQRMNORPQHLMLOCDEFPC~ 25000 Patag~ 0.76 1378. 3772. no_pobre
#> 3 TQRMNOQRQHMMLOCDEHLE~ 45800 Noroe~ 1.02 1556. 3480. no_pobre
#> 4 TQRMNORPQHLOLQCDEFPC~ 6960 Patag~ 0.7 1215. 3320. no_pobre
#> 5 TQRMNOQQQHJKKMCDEHJG~ 35000 Noroe~ 1.43 2105. 4708. no_pobre
#> 6 TQRMNORTQHLMKQCDEGGF~ 26500 Cuyo 0.63 989. 2539. no_pobre
#> 7 TQRMNOPVTHLOKOCDEFLI~ 9500 Pampe~ 0.76 1327. 3199. no_pobre
#> 8 TQRMNOPUVHJMLNCDEHJG~ 72000 Noroe~ 0.83 1266. 2832. no_pobre
#> 9 TQRMNOPXUHLOKUCDEHMH~ 19100 Cuyo 1.02 1602. 4111. no_pobre
#> 10 TQRMNOQTPHMMLPCDEHJG~ 8600 Noroe~ 0.77 1134. 2535. no_pobre
El calculo oficial se realiza sobre bases semestrales no publicadas↩︎