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.
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 dedl_proyecto(), que ya es de una causa,NULLo 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):
cada tabla (
ubicaciones,poblacion,ancla, ...), leída por su lector y validada sola, como endl_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;configuración: sus claves y valores, como los leedl_configuracion(). Su traducción toma cosas de las tablas (la ubicación nacional, las betas): siubicaciones,betasocovariablestienen un error, espera (-). Avisa (!) de una clave que el bloqueavanzadotambién declara, en su clave del formato completo, con otro valor (por ejemploancla.error_maximoyavanzado: anchor.gate_err_mediano): rige el deavanzado, ydl_proyecto()no lo dice;proyecto: las reglas que cruzan tablas, cada problema con su tabla delante: que toda ubicación esté enubicaciones(sin códigos repetidos, una sola sinpadre, 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 desdeedad_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 columnacausasi el proyecto tiene varias; que cada banda del ancla sea una unión de bandas de la población o se pueda agrupar conpoblacion_detalle; que cada covariable debetastenga su valor nacional en el año del ancla (el suyo o, convalor_nacional_dey valores subnacionales de la covariable, el de la covariable que nombra) y queescalavaya 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 (inferiorysuperior); que las proporciones deseveridadsumen 1; consubnacional.modo: razon, que la tablarazonestraiga, 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; conmortalidad_exceso.prior: tabla, que la tablaprior_mortalidad_excesotraiga, en el año que se estima y en cada sexo, un tramo de edad para cada nudo, sin solapes, conmu_logfinito ysd_logmayor que 0 (y el pasoinsumosfalla 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 tablarazonessin el modorazonoprior_mortalidad_excesosin el priortabla(no se usan) y de valores de mortalidad dedatosque 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);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 ydl_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 conancla.peso1, un posible doble conteo, las filas dedatosque 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.
See also
dl_tablas (las tablas y sus columnas), dl_proyecto() (la carpeta), dl_configuracion() (las claves),
dl_nuevo_proyecto() y dl_correr().
Funciones del proyecto:
dl_calibrar_proxies(),
dl_correr(),
dl_ejemplo(),
dl_nuevo_proyecto(),
dl_plantilla(),
dl_proyecto(),
dl_tabla(),
dl_tablas
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.