ropensci / eph

Herramientas para procesamiento de la base usuaria de la EPH
https://ropensci.github.io/eph/
Other
58 stars 18 forks source link

Consulta sobre propuesta de (humilde) colaboración: tabla de errores muestrales eph 2T 2014 en adelante #32

Closed jgjuara closed 2 years ago

jgjuara commented 3 years ago

buenas! hace un tiempo tuve que pasar la dichosa tabla de errores muestrales de la eph vigente desde 2do trim 2014 a una csv para usar con el bello paquete eph. ¿sirve si lo ofrezco para sumarlo a las tablas que trae incorporado el paquete? En caso de que sí, ¿cómo sería el formato de colaboración? Porque estuve leyendo el guidelines y me queda claro cómo sería el formato para colaborar con una función pero no para colaborar con una tabla, por lo que ví del repo, las fuentes de datos están en .rda así que imagino que debería exportalo a ese formato y revisar que los nombres de las columnas coincidan con los usados en otras tablas (como "aglo" por ejemplo). En todo caso acá está el link al csv: https://github.com/jgjuara/eph_tools/blob/main/errores_eph.csv

Saludos!

DiegoKoz commented 3 years ago

Buenas @jgjuara

Suena muy bien! Respecto del tema de errores muestrales, nunca use estos datos, así que preferiría que @pablotis @gefero o @Guidowe digan si tiene sentido agregarlos o no.

Si consideran que tiene sentido, creo que respecto de la forma de presentación de los datos por ahí sería mejor una tabla tipo:

codigo aglo estimacion periodo desvio cv

de esta forma creo que tendría la mitad de filas y la misma cantidad de columnas ;). Hablando de columnas, fijate que los nombres de las columnas sean los mismos que en las bases de la EPH, así que match es más sencillo para les usuaries.

El período es siempre 201403 porque no se actualiza la tabla o es algo que se calcula todos los trimestres pero pasaste sólo ese?

Para agregar una tabla al paquete por lo general lo hacemos de la siguiente forma:

  1. Agregamos el csv en https://github.com/holatam/data/tree/master/eph (podría ser una nueva carpeta errores/ por ejemplo)
  2. En https://github.com/holatam/eph/tree/master/data-raw dejamos el script que levanta esa tabla, le hace los cambios que haya que hacerle, y los guarda como RDA
  3. Necesitamos armar la documentación de la tabla, para que tenga help. Para eso, se arma un archivo como para cualquier otra función en R/. Por ejemplo este

si mirás por ejemplo la linea 32 de aglomerados_geo.R, el RDA se arma con usethis::use_data(centroides_aglomerados, overwrite = TRUE) y esto ya genera también la documentación. Y abajo de eso esta la función data_frame_roxygen que te escribe documentación por vos, solo tenés que copiar el resultado y pegarlo en el archivo de la documentación.

Suena como un montón, pero en realidad cada una de las partes es muy simple. La gracia de hacerlo así es que con 1., la gente que usa otros lenguajes (i.e. python) también puede tener acceso al csv. Con 2. estamos haciendo todo más reproducible, y además simplificamos el trabajo de armar la documentación en 3. que es lo único 'obligatorio'.

Por último. Siempre que hagas un cambio en el paquete, acordate de hacer un check y ver que no este generando errores o warnings.

cualquier cosa estamos para dar una mano!

saludos!

pablotis commented 3 years ago

@jgjuara suena más que bien!

Ese laburo lo debe estar haciendo más de une de forma manual.

Dale para adelante, cualquier cosa avisanos.

jgjuara commented 3 years ago

Perfecto! Voy armandolo siguiendo lo que puso @DiegoKoz. La cuestión del periodo es que INDEC tiene publicada una tabla de errores muestrales que cubre EPH continua desde el tercer trimestre 2003 hasta segundo trimestre 2014 (acá) y otra tabla diferente que cubre desde el tercer trimestre 2014 en adelante (acá). Yo por ahora sólo tengo en formato csv esta última, pero por ahí ya que me pongo a armar esto para subirlo veo si llego a armar la otra tabla también.

Gracias por los comentarios! Cualquier duda les aviso

DiegoKoz commented 3 years ago

@jgjuara acabo de subir el archivo data-raw/errores_muestrales.R con un escrapeo del pdf que compartiste. Me pareció que podía ser más útil tener automatizado eso, y quizás sirve para otros períodos, no? Si querés podes usar ese archivo de base para agregar los datos al paquete

saludos!

jgjuara commented 3 years ago

Buenas! Gracias @DiegoKoz por el aporte del scrapeo. Hice el fork, me basé en tu script y pre-procesé un poco más esa tabla para que quedara una base con los desvios estandar y los coeficientes de variaciones para las estimaciones correspondientes a cada aglomerado y al total de aglomerados. El formato sería así:

aglomerado x ds cv

En particular me pareció mejor reemplazar el nombre de los aglomerados por strings con el código numérico correspondiente del aglomerado según el diccionario_aglomerados y con "Total" para el conjunto de los 31 aglomerados urbanos. Creo que así va a ser más fácil filtrar la tabla cuando se esté calculando alguna estimación (por ejemplo abajo de todo propongo una función para eso). La columna aglomerado quedaría así:

unique(errores_muestrales$aglomerado)

[1] "Total" "32" "33" "10" "27" "26" "12" "15" "8"
[10] "7" "22" "29" "19" "25" "23" "18" "3" "14"
[19] "13" "2" "4" "6" "5" "34" "36" "30" "38"
[28] "9" "17" "20" "31" "91" "93"

Por otro lado eliminé la columna periodo porque por ahora sólo tengo la tabla del periodo 2014 3er trim en adelante. Traté de usar tabulizer::extract_tables() con el otro pdf pero no lo logré que capture las 33 tablas correspondientes, me devuelve 19 tablas ¿alguna sugerencia?. Si consigo armar la tabla de errores del otro periodo de la eph continua, ya sea con tabulizer o a mano, usaría una columna "periodo" con strings "2014.03" y "2014.02".

Por ahora en mi fork todo lo que hay es lo que describí arriba. Corrí devtools::check y solo aparece este warning:

checking data for ASCII and uncompressed saves ... OK WARNING ‘qpdf’ is needed for checks on size reduction of PDFs

Por fuera del fork, estuve armando una función que ayude a usar esta tabla de errores muestrales. Por ejemplo:

eph::toybase_individual_2016_03 %>%
+    eph::organize_labels() %>%
+    filter(AGLOMERADO == 33) %>% 
+    eph::calculate_tabulates(x = "CH03",
+                           weights = "PONDERA",
+                           add.totals = "row") %>% 
+    mutate(ds = calculate_error(Freq, measure = "ds", codigo_aglo = "33"))

El output es:

CH03 Freq ds
Jefe/a 126733 14489
Conyuge / Pareja 64311 11150
Hijo/a Hijastro/a 167685 16152
Yerno/Nuera 3946 9567
Nietro/a 19260 9567
Madre/Padre 5201 9567
Suegro/a 2942 9567
Hermano/a 3451 9567
Otros Familiares 5541 9567
No familiares 1138 9567
Total 400208 22396

El código de la función es:

calculate_error <- function(value, codigo_aglo = "Total", measure = "cv") {
    #codigo_aglo = codigo de aglomerado en errores_muestrales
    #measure = cv o ds según medida deseada
    tabla_referencia <- eph::errores_muestrales %>%
      dplyr::filter(aglomerado == codigo_aglo)  %>%
      tidyr::pivot_longer(
        cols = c("ds", "cv"),
        names_to = "medida",
        values_to = "valores"
      ) %>%
      dplyr::filter(medida == measure)

    find_closest <-function(y) {
        tabla_referencia[["valores"]][which.min(abs(tabla_referencia[["x"]] - y))]
      }

    sapply(value, find_closest)
  }

Aguardo sus comentarios, gracias por el feedback! Saludos!

DiegoKoz commented 3 years ago

Buenas, excelente el laburo!

Algunas cositas

Si consigo armar la tabla de errores del otro periodo de la eph continua, ya sea con tabulizer o a mano, usaría una columna "periodo" con strings "2014.03" y "2014.02".

Me pregunto si como a futuro la idea es tener los errores para 2003-2014.02, no convendría tener la columna desde un principio, cuestión de que después haya más compatibilidad hacia atrás, cuando actualicemos. Quizás pondría un nombre que sea más indicativo de que eso funciona entre 2003 y 2014 (tipo 2003.04_2014.02, no recuerdo cuando es la primera base de la continua...)

Respecto de la función. No quiero opinar sobre el cálculo de errores muestrales, porque no es mi tema y tengo miedo de meter la pata (@pablotis @gefero alguna opinión sobre esto??) Pero esto sólo funciona para frecuencias no? no se puede usar el error muestral para ingresos por ejemplo?

respecto del código en sí:

la función va a ir en un script aparte, en la carpeta R. Esta todo automatizado con usethis::use_r(name = 'calculate_errors') , la documentación se agrega posandote en ese script sobre la función y yendo a Code --> Insert Roxygen Skeleton o sea que los comentarios no son necesarios

por otro lado

      tidyr::pivot_longer(
        cols = c("ds", "cv"),
        names_to = "medida",
        values_to = "valores"
      ) %>%
      dplyr::filter(medida == measure)

Si no entiendo mal, eso no es reemplazable por un select? algo tipo (no chekeado)

usethis::use_r(name = 'calceph::errores_muestrales %>%
ulate_errors') %>% 
  select(measure)

El warning ese nunca lo había visto, pero necesitaríamos corregirlo para poder subirlo a CRAN

saludos!

jgjuara commented 3 years ago

Hola @DiegoKoz !

Respecto de la indicación del periodo: estoy de acuerdo con lo que decís. Pude armar la tabla para el periodo 2003 a 2014.02 pero usando la selección interactiva de tabulizer::extract_areas(). No estoy seguro si agregar eso al script de errores_muestrales porque no es replicable. Aunque pude localizar las areas correspondientes a las tablas con tabulizer::locate_areas(), cuando paso la lista de áreas al extract_areas no logra capturar las 34 tablas. Por ahora me quedé con el archivo .csv de errores para el periodo 2003-2014 que pude armar usando la seleccion interactiva. ¿Te parece que use este archivo para unirlo a la otra tabla de errores y completar la tabla para toda la EPH continua?

Respecto de para qué estimaciones sirven las tablas. Estas tablas parecen estar destinadas a usarse para la estimación de frecuencias ponderadas con PONDERA, aunque lamentablemente esto no queda explicito en de la documentación de INDEC. En el documento sobre el periodo 2014.03 en adelante se explica el procedimiento que usaron para confeccionar las tablas, básicamente entiendo que se hizo una estimación de la varianza por bootstrap para diferentes variables y para cada dominio de estimación y luego se hizo un modelo general de la varianza para cada dominio. En este documento se aclara que se trata de la varianza para estimación de totales. No tengo mucha idea de la parte estadística de este proceso pero entiendo que no sería posible aplicarlo a variables de ingresos.

Siguiendo con el tema de la utilidad de las tablas espero que INDEC incorpore a CEMRepBoot la EPH, entonces se podría usar la función de estimación de varianza de esa aplicación en vez de las tablas de errores muestrales.

Respecto del warning que me aparecía con devtools: está resuelto, me faltaba instalar una librería en mi linux, no era algo del paquete en sí.

Respecto de la sugerencia de reemplazar pivot_longer por select: tenés razón, lo probé y es mejor así.

DiegoKoz commented 3 years ago

Buenas,

Perdón la demora, tuve unos días intensos de trabajo.

Respecto de la indicación del periodo: estoy de acuerdo con lo que decís. Pude armar la tabla para el periodo 2003 a 2014.02 pero usando la selección interactiva de tabulizer::extract_areas(). No estoy seguro si agregar eso al script de errores_muestrales porque no es replicable. Aunque pude localizar las areas correspondientes a las tablas con tabulizer::locate_areas(), cuando paso la lista de áreas al extract_areas no logra capturar las 34 tablas. Por ahora me quedé con el archivo .csv de errores para el periodo 2003-2014 que pude armar usando la seleccion interactiva. ¿Te parece que use este archivo para unirlo a la otra tabla de errores y completar la tabla para toda la EPH continua?

Dale, perfecto. Tratamos de ser replicables en la medida de lo posible, pero si no es posible, tampoco tenemos que hacer malabares. Genial todo el laburo que hiciste!

Siguiendo con el tema de la utilidad de las tablas espero que INDEC incorpore a CEMRepBoot la EPH, entonces se podría usar la función de estimación de varianza de esa aplicación en vez de las tablas de errores muestrales.

@gefero vos estabas con el tema del CEMRepBoot no? sabés que onda si se va a agregar la EPH al final o no?

Por lo demás, @jgjuara si podés manda un pull request con los cambios y lo agrego!

Ya que estás, también modifica el DESCRIPTION para agregarte como contributor: https://r-pkgs.org/description.html

jgjuara commented 3 years ago

Hola @DiegoKoz ! Perdón la demora, armé la tabla errores_muestrales con la info de los dos periodos y la función calculate_errors(). Para control de parametros de la función usé assert_that(). Ambas cosas documentadas, devtools::check() no devolvió errors, warnings ni notes. En el DESCRIPTION me agregué como contributor también. Hago el pull request, cualquier cosa si les parece que hay algo para modificar o corregir de mi contribución estoy atento. Gracias por todas las devoluciones y la ayuda con la contribución!

DiegoKoz commented 3 years ago

merged #35