Skip to contents

Revisa la carpeta de un proyecto antes de correrlo, sin detenerse en el primer problema: cada tabla del contrato de insumos (dl_tablas), la configuración de cada causa, las reglas que cruzan tablas y, al final, los insumos completos. Muestra una línea por comprobación, marcada como en orden, aviso (!) o error, con la corrección sugerida. No ajusta nada.

Usage

dl_revisar_proyecto(carpeta, causa = NULL)

Arguments

carpeta

Carpeta del proyecto, o un proyecto de dl_proyecto().

causa

Causa que se revisa (cause_id); NULL (por defecto) revisa todas las causas con configuración. Con un proyecto de dl_proyecto(), que ya es de una causa, NULL o esa misma causa.

Value

Una tabla (data.frame), invisible, con una fila por comprobación: causa, paso (la tabla, la configuración, proyecto o insumos), estado ("ok", "aviso", "error" u "omitido": un paso que espera a que se corrija otro), detalle y sugerencia (la corrección; vacía si está en orden o se omitió).

Details

La revisión usa los mismos lectores y validadores que dl_proyecto() y dl_insumos(): lo que pasa la revisión es lo que ellos aceptan. Sus pasos, en orden (los de una causa que se ajusta; los de una suma de subtipos, más abajo):

  1. cada tabla (ubicaciones, poblacion, ancla, ...), leída por su lector y validada sola, como en dl_tabla(): una columna que falta, un CSV guardado desde Excel con «;» o coma decimal, un sexo, una medida o un número que no se reconoce, bandas de edad que se solapan... La línea en orden dice cuántas filas trae (leída: N fila(s)) y, si pasó por un lector, cuál (descarga de GBD Results). Una tabla obligatoria que falta (o que solo trae el encabezado) es un error;

  2. configuración: sus claves y valores, como los lee dl_configuracion(). Su traducción toma cosas de las tablas (la ubicación nacional, las betas): si ubicaciones, betas o covariables tienen un error, espera (-). Avisa (!) de una clave que el bloque avanzado también declara, en su clave del formato completo, con otro valor (por ejemplo ancla.error_maximo y avanzado: anchor.gate_err_mediano): rige el de avanzado, y dl_proyecto() no lo dice;

  3. proyecto: las reglas que cruzan tablas, cada problema con su tabla delante: que toda ubicación esté en ubicaciones (sin códigos repetidos, una sola sin padre, la nacional; las subnacionales con la nacional de padre); que la población traiga el año que se estima y los sexos del modelo, con las mismas bandas de edad en todas las ubicaciones, años y sexos, seguidas (sin huecos) y desde edad_inicio; que el ancla traiga la prevalencia de la causa (y la mortalidad, si la usa el prior de la mortalidad en exceso) en el año del ancla y en cada sexo, y la columna causa si el proyecto tiene varias; que cada banda del ancla sea una unión de bandas de la población o se pueda agrupar con poblacion_detalle; que cada covariable de betas tenga su valor nacional en el año del ancla (el suyo o, con valor_nacional_de y valores subnacionales de la covariable, el de la covariable que nombra) y que escala vaya solo con la transformación lineal; que cada ubicación subnacional con proxies los traiga de todas las covariables y que el valor nacional en que se anclan traiga su intervalo (inferior y superior); que las proporciones de severidad sumen 1; con subnacional.modo: razon, que la tabla razones traiga, en el año que se estima, la razón de cada ubicación subnacional de la población y de ninguna otra, con números finitos y alguna razón mayor que 0; con mortalidad_exceso.prior: tabla, que la tabla prior_mortalidad_exceso traiga, en el año que se estima y en cada sexo, un tramo de edad para cada nudo, sin solapes, con mu_log finito y sd_log mayor que 0 (y el paso insumos falla si el centro de algún nudo supera el techo). Avisa (!) de una covariable con proxies y sin beta (no se usa), de una ubicación subnacional sin proxies (queda fuera de la estimación subnacional), de una tabla razones sin el modo razon o prior_mortalidad_exceso sin el prior tabla (no se usan) y de valores de mortalidad de datos que parecen tasas por 100 000 en vez de por persona-año (mayores que 1, o más de 1000 veces la mortalidad del ancla en la misma causa, año, sexo y banda);

  4. insumos: si nada falló, los insumos completos (dl_insumos()), con las reglas que necesitan todo armado: que la población nacional sea la suma de las subnacionales, que el promedio de los proxies, ponderado por la población, sea el valor nacional de la covariable o que los datos locales tengan valores posibles; y la severidad: una causa sin estados de salud es un error, porque sin ellos no hay AVD y dl_correr() no puede escribir la corrida. Un problema de los insumos que es de una tabla va al paso de esa tabla. Avisa también de lo que no detiene los insumos pero conviene mirar (datos locales en el ajuste con ancla.peso 1, un posible doble conteo, las filas de datos que quedan fuera).

Cada problema lleva una sugerencia: dl_configuracion() si nombra una clave de la configuración, las columnas de su tabla (dl_tablas) o dl_proyecto(). Un paso que espera a que se corrija otro (-) no cuenta como error ni como aviso.

De una causa que es la suma de sus subtipos (suma_de_subtipos: sí; ver dl_proyecto()) se revisan sus dos tablas (ubicaciones y poblacion), su configuración y, en proyecto, las reglas de esas tablas; no hay paso insumos, porque la causa no se ajusta. Avisa (!) de las claves de la configuración que una suma no usa y de los subtipos que entran en la suma y no tienen configuración en el proyecto: pueden estar en otra carpeta, y dl_correr() busca sus corridas al sumar.

En un proyecto en el formato completo de la 0.2.2 se revisan la configuración, los insumos completos y la severidad.

En vez de una carpeta se puede dar un proyecto ya leído con dl_proyecto(), por ejemplo uno armado con tablas de R (dl_proyecto(configuracion = ..., ubicaciones = ..., poblacion = ...)). Sus tablas ya se leyeron, su configuración ya se tradujo y las reglas entre tablas se cumplen (si no, dl_proyecto() se habría detenido con todos sus problemas): la revisión dice de dónde salió cada tabla y sus avisos, los avisos de las reglas entre tablas y sigue con los insumos, para su única causa.

Examples

r <- dl_revisar_proyecto(dl_ejemplo(), causa = 9100)
#> Revisión del proyecto «acs_peru», causa 9100
#>   ✓ ubicaciones: leída: 26 fila(s)
#>   ✓ poblacion: leída: 2100 fila(s)
#>   ✓ ancla: leída: 768 fila(s) (descarga de GBD Results)
#>   ✓ covariables: leída: 8 fila(s) (descarga de covariables del GHDx)
#>   ✓ betas: leída: 3 fila(s)
#>   ✓ datos: leída: 185 fila(s)
#>   ✓ severidad: leída: 12 fila(s)
#>   ✓ proxies_crudos: leída: 1500 fila(s)
#>   ✓ proxies: SEV_scalar_agestd_cvd_pvd: paseo_aleatorio, q = 2.26e-05, ediciones 2019, 2021, 2023
#>       LDI_pc: paseo_aleatorio, q = 0.000373, ediciones 2019, 2021, 2023
#>       haqi: paseo_aleatorio, q = 0.406, ediciones 2019, 2021, 2023
#>   ✓ configuración: config/9100.yaml: proyecto
#>   ✓ proyecto: las reglas entre tablas se cumplen
#>   ✓ insumos: dl_insumos() los arma y los valida (hash 0e52c7277b9a)
#> Todo en orden.
table(r$estado)
#> 
#> ok 
#> 12 

# una copia con un problema de una tabla (la población sin la columna `sexo`)
carpeta <- dl_ejemplo(copiar_en = file.path(tempdir(), "proyecto_con_errores"))
pob <- read.csv(file.path(carpeta, "poblacion.csv"), colClasses = c(ubicacion = "character"))
write.csv(pob[names(pob) != "sexo"], file.path(carpeta, "poblacion.csv"), row.names = FALSE)
r <- dl_revisar_proyecto(carpeta, causa = 9100)
#> Revisión del proyecto «proyecto_con_errores», causa 9100
#>   ✓ ubicaciones: leída: 26 fila(s)
#>   ✗ poblacion: faltan las columnas sexo (trae: ubicacion, anio, edad_inicio, edad_fin, poblacion)
#>       → columnas ubicacion, anio, sexo, edad_inicio, edad_fin, poblacion (ver ?dl_tablas)
#>   ✓ ancla: leída: 768 fila(s) (descarga de GBD Results)
#>   ✓ covariables: leída: 8 fila(s) (descarga de covariables del GHDx)
#>   ✓ betas: leída: 3 fila(s)
#>   ✓ datos: leída: 185 fila(s)
#>   ✓ severidad: leída: 12 fila(s)
#>   ✓ proxies_crudos: leída: 1500 fila(s)
#>   - proxies: la calibración espera a la tabla poblacion
#>   - configuración: su traducción espera a la calibración de proxies_crudos
#>   - proyecto: las reglas entre tablas esperan a que se corrijan los errores de arriba
#>   - insumos: no se armaron: primero corrige los errores de arriba
#> 1 error(es) y 0 aviso(s): corrige los errores y vuelve a revisar.
r[r$estado == "error", c("paso", "detalle", "sugerencia")]
#>        paso
#> 2 poblacion
#>                                                                              detalle
#> 2 faltan las columnas sexo (trae: ubicacion, anio, edad_inicio, edad_fin, poblacion)
#>                                                                          sugerencia
#> 2 columnas ubicacion, anio, sexo, edad_inicio, edad_fin, poblacion (ver ?dl_tablas)

# y uno entre tablas (un dato de una ubicación que no está en ubicaciones.csv)
write.csv(pob, file.path(carpeta, "poblacion.csv"), row.names = FALSE)
datos <- read.csv(file.path(carpeta, "datos.csv"), colClasses = c(ubicacion = "character"))
datos$ubicacion[1] <- "99"
write.csv(datos, file.path(carpeta, "datos.csv"), row.names = FALSE, na = "")
r <- dl_revisar_proyecto(carpeta, causa = 9100)
#> Revisión del proyecto «proyecto_con_errores», causa 9100
#>   ✓ ubicaciones: leída: 26 fila(s)
#>   ✓ poblacion: leída: 2100 fila(s)
#>   ✓ ancla: leída: 768 fila(s) (descarga de GBD Results)
#>   ✓ covariables: leída: 8 fila(s) (descarga de covariables del GHDx)
#>   ✓ betas: leída: 3 fila(s)
#>   ✓ datos: leída: 185 fila(s)
#>   ✓ severidad: leída: 12 fila(s)
#>   ✓ proxies_crudos: leída: 1500 fila(s)
#>   ✓ proxies: SEV_scalar_agestd_cvd_pvd: paseo_aleatorio, q = 2.26e-05, ediciones 2019, 2021, 2023
#>       LDI_pc: paseo_aleatorio, q = 0.000373, ediciones 2019, 2021, 2023
#>       haqi: paseo_aleatorio, q = 0.406, ediciones 2019, 2021, 2023
#>   ✓ configuración: config/9100.yaml: proyecto
#>   ✗ proyecto: datos: la(s) ubicación(es) 99 no está(n) en la tabla ubicaciones: agrégala(s) ahí o corrige el código
#>       → columnas causa, ubicacion, anio, sexo, edad_inicio, edad_fin, medida, valor, error_estandar, fuente (ver ?dl_tablas)
#>   - insumos: no se armaron: primero corrige los errores de arriba
#> 1 error(es) y 0 aviso(s): corrige los errores y vuelve a revisar.
r[r$estado == "error", c("paso", "detalle", "sugerencia")]
#>        paso
#> 11 proyecto
#>                                                                                                  detalle
#> 11 datos: la(s) ubicación(es) 99 no está(n) en la tabla ubicaciones: agrégala(s) ahí o corrige el código
#>                                                                                                              sugerencia
#> 11 columnas causa, ubicacion, anio, sexo, edad_inicio, edad_fin, medida, valor, error_estandar, fuente (ver ?dl_tablas)
unlink(carpeta, recursive = TRUE)

# un proyecto con las tablas en R (la puerta de los data.frame): con un problema entre tablas,
# dl_proyecto() se detiene con todos juntos (read.csv() sin colClasses lee el código «01» como 1)
pob <- read.csv(dl_ejemplo("poblacion.csv"))
e <- tryCatch(dl_proyecto(configuracion = list(causa = 9101, anio = 2023, edad_inicio = 30),
                          ubicaciones = dl_ejemplo("ubicaciones.csv"), poblacion = pob,
                          ancla = dl_ejemplo("ancla")),
              error = function(e) e)
e$problemas
#> [1] "poblacion: la(s) ubicación(es) 1, 2, 3, 4, 5 y 4 más no está(n) en la tabla ubicaciones: agrégala(s) ahí o corrige el código"
# con los códigos como texto, el proyecto se arma y se revisa
pob <- read.csv(dl_ejemplo("poblacion.csv"), colClasses = c(ubicacion = "character"))
p <- dl_proyecto(configuracion = list(causa = 9101, anio = 2023, edad_inicio = 30),
                 ubicaciones = dl_ejemplo("ubicaciones.csv"), poblacion = pob,
                 ancla = dl_ejemplo("ancla"))
r <- dl_revisar_proyecto(p)
#> Revisión del proyecto (sin carpeta: las tablas vienen como argumentos), causa 9101
#>   ✓ ubicaciones: leída: 26 fila(s), de ubicaciones.csv
#>   ✓ poblacion: leída: 2100 fila(s), de argumento `poblacion` (data.frame)
#>   ✓ ancla: leída: 768 fila(s), de ancla (descarga de GBD Results)
#>   ✓ configuración: la configuración dada como lista: proyecto
#>   ✓ proyecto: las reglas entre tablas se cumplen
#>   ✓ insumos: dl_insumos() los arma y los valida (hash 13cec7850ab3)
#>   ✗ severidad: la causa 9101 no tiene estados de salud en la tabla severidad: sin ellos no hay AVD. Agrégalos (ver ?dl_proyecto) o, sin AVD, corre los pasos por separado: dl_ajustar(), dl_cascada() y dl_estimaciones()
#>       → columnas causa, estado, proporcion, inferior, superior, peso_discapacidad, peso_inferior, peso_superior (ver ?dl_tablas)
#> 1 error(es) y 0 aviso(s): corrige los errores y vuelve a revisar.