library(dismodlite)
library(data.table)
#>
#> Attaching package: 'data.table'
#> The following object is masked from 'package:base':
#>
#> %notin%Qué vas a aprender
- Cómo se organiza un proyecto con varias causas: una configuración por causa y las tablas compartidas.
- Cómo se declara que una causa es la suma de otras (
subtipos) y qué heredan los subtipos de su causa padre. - Cómo se declara que la causa padre no se ajusta, sino que es la suma de las corridas de sus subtipos (
suma_de_subtipos), y cómo la sumadl_correr(), también dejando un subtipo fuera (subtipos_omitidos). - Cómo sumar corridas elegidas a mano con
dl_sumar_hijas(). - En qué se parece y en qué no la suma al ajuste directo de la causa padre.
- Dos temas avanzados: modelar un componente de una causa y derivar la severidad de una partición.
El ejemplo es el proyecto sintético del paquete: una enfermedad ficticia, la arteriopatía crónica sintética (causa 9100), que es la suma de tres subtipos (9101, 9102 y 9103), en el Perú y sus departamentos.
Varias causas en un proyecto
Un proyecto con una causa tiene config.yaml. Con varias, cada causa tiene su configuración en config/<causa>.yaml y todas comparten las tablas del proyecto:
list.files(dl_ejemplo(), recursive = TRUE)
#> [1] "ancla/sintetico_acs_v1.csv" "betas.csv"
#> [3] "config/9100.yaml" "config/9101.yaml"
#> [5] "config/9102.yaml" "config/9103.yaml"
#> [7] "covariables/HAQI.csv" "covariables/LDI_PC.csv"
#> [9] "covariables/SEV_SCALAR_CVD_PVD.csv" "datos.csv"
#> [11] "LEEME.md" "poblacion.csv"
#> [13] "proxies_crudos.csv" "severidad.csv"
#> [15] "ubicaciones.csv" "verdad.csv"-
ancla/trae las filas de todas las causas (una descarga de GBD Results puede tener varias); cada causa usa las suyas, por su columnacausa. -
severidad.csvydatos.csvllevan la columnacausa;betas.csvtrae las de la causa padre, que los subtipos heredan. -
ubicaciones.csv,poblacion.csvycovariables/son de todas.
Una fila sin causa vale para todas las causas del proyecto (la regla de omisión del contrato de insumos; ver Preparar tus datos).
dl_revisar_proyecto() sin causa revisa todas:
revision <- dl_revisar_proyecto(dl_ejemplo())
#> 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)
#> Revisión del proyecto «acs_peru», causa 9101
#> ✓ 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/9101.yaml: proyecto
#> ✓ proyecto: las reglas entre tablas se cumplen
#> ✓ insumos: dl_insumos() los arma y los valida (hash 7fa0edfdbee4)
#> Revisión del proyecto «acs_peru», causa 9102
#> ✓ 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/9102.yaml: proyecto
#> ✓ proyecto: las reglas entre tablas se cumplen
#> ✓ insumos: dl_insumos() los arma y los valida (hash 0e010e4636f0)
#> Revisión del proyecto «acs_peru», causa 9103
#> ✓ 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/9103.yaml: proyecto
#> ✓ proyecto: las reglas entre tablas se cumplen
#> ✓ insumos: dl_insumos() los arma y los valida (hash 1daa73285e5b)
#> Todo en orden.
subtipos: una causa que es la suma de otras
La configuración de la causa padre lista sus subtipos:
cat(readLines(dl_ejemplo("config", "9100.yaml"), encoding = "UTF-8"), sep = "\n")
#> # Arteriopatía crónica sintética (causa 9100): configuración de ejemplo con datos sintéticos.
#> # Las claves que no aparecen toman su valor por defecto: ver ?dl_configuracion y print(dl_proyecto(...)).
#> causa: 9100
#> nombre: Arteriopatía crónica sintética
#> anio: 2023
#> edad_inicio: 30
#>
#> mortalidad_exceso:
#> techo: 0.25 # por persona-año
#>
#> subnacional:
#> anio_validacion: 2019 # año de los datos subnacionales reservados para validar
#>
#> proxies: # la calibración de proxies_crudos.csv (?dl_calibrar_proxies)
#> transformacion:
#> haqi: diferencia # un índice de 0 a 100: en puntos; el SEV y el LDI, en cociente
#>
#> sensibilidad:
#> peso: [0.1, 0.5, 1.0]
#>
#> subtipos: [9101, 9102, 9103]
#>
#> notas:
#> - Datos sintéticos de ejemplo (dismodlite).y cada subtipo tiene su configuración, con su propio techo de la mortalidad en exceso:
cat(readLines(dl_ejemplo("config", "9101.yaml"), encoding = "UTF-8"), sep = "\n")
#> # ACS de miembros inferiores (causa 9101): configuración de ejemplo con datos sintéticos.
#> # Las claves que no aparecen toman su valor por defecto: ver ?dl_configuracion y print(dl_proyecto(...)).
#> causa: 9101
#> nombre: ACS de miembros inferiores
#> anio: 2023
#> edad_inicio: 30
#>
#> mortalidad_exceso:
#> techo: 0.20 # por persona-año
#>
#> subnacional:
#> anio_validacion: 2019 # año de los datos subnacionales reservados para validar
#>
#> proxies: # la calibración de proxies_crudos.csv (?dl_calibrar_proxies)
#> transformacion:
#> haqi: diferencia # un índice de 0 a 100: en puntos; el SEV y el LDI, en cociente
#>
#> sensibilidad:
#> peso: [0.1, 0.5, 1.0]
#>
#> notas:
#> - Datos sintéticos de ejemplo (dismodlite).Tres reglas:
- Cada subtipo se ajusta por separado, con su propia ancla (sus filas en
ancla/) y su propia severidad. - Un subtipo sin filas propias en
betasusa las de su causa padre (como en el ejemplo); con filas propias, usa las suyas. -
subtiposva solo en la causa padre; con ella el paquete arma el registro de padres e hijos que usa la suma, y cada subtipo encuentra a su padre. Por eso las configuraciones van en el mismo proyecto: un subtipo leído solo, en su propia carpeta, no conoce a su padre: lo declara consubtipo_dey, sin filas propias enbetas, usa las de esa causa (ver la sección 7 de Preparar tus datos). - Un subtipo tiene una sola causa padre: que dos configuraciones del proyecto lo declaren en
subtiposes un error.
Una causa padre con subtipos se ajusta como cualquier otra, con su propia ancla: así está la 9100 del ejemplo.
suma_de_subtipos: la causa padre no se ajusta, se suma
Cuando se publican los subtipos, la causa padre se reporta como su suma, para que las tablas sumen. Su configuración lo dice con suma_de_subtipos: sí. Aquí, en una copia del ejemplo, se lo agregamos a la causa 9100:
proyecto <- dl_ejemplo(copiar_en = file.path(tempdir(), "proyecto_con_suma"))
con <- file(file.path(proyecto, "config", "9100.yaml"), open = "a", encoding = "UTF-8")
writeLines("suma_de_subtipos: sí", con)
close(con)
dl_proyecto(proyecto, causa = 9100)
#> <dl_proyecto> Arteriopatía crónica sintética, causa 9100 | año 2023 | tablas del contrato
#> carpeta: /tmp/Rtmpl4NEGp/proyecto_con_suma
#> suma de los subtipos 9101 + 9102 + 9103: no se ajusta; dl_correr() suma las corridas de sus subtipos
#> tablas:
#> ubicaciones 26 fila(s), de ubicaciones.csv
#> poblacion 2100 fila(s), de poblacion.csvLa causa ya no se ajusta: de las tablas solo usa ubicaciones y poblacion, y las claves del modelo de su configuración (edad_inicio, mortalidad_exceso, subnacional…) no se usan; nombre es obligatoria. En un proyecto nuevo, la configuración de una suma es así de corta:
causa: 1010
nombre: Enfermedad de ejemplo
anio: 2023
subtipos: [1011, 1012, 1013]
suma_de_subtipos: síPuede ser una configuración más de un proyecto con varias causas o vivir en su propia carpeta, con ubicaciones y poblacion. dl_revisar_proyecto() la entiende: revisa su configuración, sus dos tablas y que los subtipos que entran tengan configuración en el proyecto (si no la tienen, avisa: pueden vivir en otra carpeta), sin pasos de modelo. Aquí avisa de las claves del modelo que quedaron en la configuración de la 9100 y que ya no se usan:
revision_suma <- dl_revisar_proyecto(proyecto, causa = 9100)
#> Revisión del proyecto «proyecto_con_suma», causa 9100
#> ✓ ubicaciones: leída: 26 fila(s)
#> ✓ poblacion: leída: 2100 fila(s)
#> ! configuración: la causa es una suma de subtipos (suma_de_subtipos: sí) y no se ajusta: no se usa(n) la(s) clave(s) edad_inicio, mortalidad_exceso, subnacional, proxies, sensibilidad
#> → ver ?dl_configuracion
#> ✓ configuración: config/9100.yaml: proyecto
#> ✓ proyecto: las reglas entre tablas se cumplen
#> ✓ proyecto: suma de los subtipos 9101 + 9102 + 9103: dl_correr() suma las corridas de sus subtipos
#> 0 error(es) y 1 aviso(s).Correr cada subtipo
Cada subtipo es una corrida completa. Aquí, corridas de prueba (rapido = TRUE, con cadenas algo más largas que las de prueba y en paralelo con nucleos = 4), que quedan en la carpeta resultados/ del proyecto; para publicar, rapido = FALSE:
opciones <- dl_opciones_mcmc(simulaciones = 200, cadenas = 2, iteraciones = 6000, calentamiento = 2000,
nucleos = 4)
de_subtipos <- lapply(c(9101, 9102, 9103), function(causa)
dl_correr(proyecto, causa = causa, semilla = 1, rapido = TRUE, sensibilidad = FALSE, opciones = opciones))
corridas <- vapply(de_subtipos, function(corrida) corrida$dir, "")
basename(corridas)
#> [1] "2026-10-15_causa-9101-prueba_v1" "2026-10-15_causa-9102-prueba_v1"
#> [3] "2026-10-15_causa-9103-prueba_v1"Cada corrida tiene la estimación nacional y la de las ubicaciones subnacionales (las tres usan las betas de la causa padre), con sus simulaciones guardadas en draws/.
Sumar: dl_correr() de la causa padre
dl_correr() de una causa con suma_de_subtipos: sí no ajusta nada (no pide semilla): busca en la carpeta de las corridas la más reciente de cada subtipo, del año que se estima, y escribe una corrida nueva para la causa padre. En cada celda (ubicación, sexo y grupo de edad) y cada medida (prevalencia, incidencia y AVD), suma las simulaciones de los subtipos una a una, y el intervalo sale de los cuantiles de esa suma, nunca de sumar los límites. Con rapido = TRUE suma las corridas de prueba, y la suma también es de prueba; sin él, las de producción:
suma <- dl_correr(proyecto, causa = 9100, rapido = TRUE)
#> dl_correr(): causa 9100: suma de los subtipos 9101 + 9102 + 9103, con sus corridas de prueba de 2023 en /tmp/Rtmpl4NEGp/proyecto_con_suma/resultados/mod/dismod_lite
#> dl_correr(): 9101: 2026-10-15_causa-9101-prueba_v1
#> dl_correr(): 9102: 2026-10-15_causa-9102-prueba_v1
#> dl_correr(): 9103: 2026-10-15_causa-9103-prueba_v1
#> dl_correr(): corrida escrita en /tmp/Rtmpl4NEGp/proyecto_con_suma/resultados/mod/dismod_lite/2026-10-15_causa-9100-prueba_v1 (prueba: no sirve para publicar)
suma
#> <dl_run> corrida 2026-10-15_causa-9100-prueba_v1 (suma de las hijas)
#> carpeta: /tmp/Rtmpl4NEGp/proyecto_con_suma/resultados/mod/dismod_lite/2026-10-15_causa-9100-prueba_v1
#> 3 particiones canónicas (una por medida)
suma$manifest$causa$agregacion
#> [1] "suma_de_hijas"
vapply(suma$manifest$causa$hijas, function(h) h$run_id, "")
#> [1] "2026-10-15_causa-9101-prueba_v1" "2026-10-15_causa-9102-prueba_v1"
#> [3] "2026-10-15_causa-9103-prueba_v1"Los mensajes dicen qué corrida tomó de cada subtipo. Antes de escribir nada comprueba que las corridas sean exactamente los subtipos declarados, que cada una declare a la causa como su causa padre y que coincidan en año, año del ancla, ronda de GBD, número de simulaciones y celdas. Si falta la corrida de un subtipo, el error dice cuál, de qué año y dónde se buscó. La corrida de la suma no tiene diagnósticos ni etiquetas propios: están en las de los subtipos, que su manifiesto cita. Sus limitaciones lo dicen:
unlist(suma$manifest$limitaciones)
#> [1] "suma simulación a simulación de 3 causas hijas (9101, 9102, 9103) — la correlación entre hijas no se modela (cada hija viene de su propio ajuste)"
#> [2] "sin ajuste propio — la corrida de la suma no tiene etiquetas, diagnósticos MCMC ni insumos congelados (están en las corridas de las hijas, inputs.runs_hijas)"Si la suma es de producción y la corrida de algún subtipo se escribió con forzar = TRUE (sin exigir la convergencia de sus cadenas), la suma la toma igual, lo dice en un mensaje y lo declara en una limitación más, que nombra esos subtipos.
La correlación entre subtipos no se modela: la simulación k de la suma es la suma de las simulaciones k de cada subtipo, que vienen de ajustes independientes.
Qué conviene saber de la búsqueda:
Dónde busca. En
carpeta_salida(por defecto,resultados/en la carpeta del proyecto). Las corridas se reconocen por su manifiesto (la causa y el año), así que valen las de un subtipo que vive en otra carpeta, si se escribieron en la misma carpeta de corridas y declaran a la causa padre (subtipo_de).Cuál es la más reciente. La del último día y, en ese día, la de mayor versión. Si ese día hay corridas del subtipo con nombres distintos (
causa-9101ycausa-9101-2023, por ejemplo), gana la que se escribió última, por la fecha de modificación de sumanifest.yaml: copiar la carpeta de las corridas sin conservar las fechas de los archivos puede cambiar ese desempate. Para no depender de él,dl_sumar_hijas()(abajo) recibe las corridas una por una.-
Varios años. Con
anios, los subtipos y la suma se corren igual, y cada año se suma con las corridas de ese año: Una suma no es subtipo de otra suma. Los subtipos que entran en una suma son causas que se ajustan.
Dejar un subtipo fuera: subtipos_omitidos
Si un subtipo no se puede estimar (por ejemplo, no hay datos suficientes), la configuración de la suma lo declara en subtipos_omitidos, con su motivo. La suma se hace con los demás, queda por debajo de la causa padre en la parte de ese subtipo, y el manifiesto lo registra entre sus limitaciones:
con <- file(file.path(proyecto, "config", "9100.yaml"), open = "a", encoding = "UTF-8")
writeLines(c("subtipos_omitidos:", " - {causa: 9103, motivo: subtipo sin datos suficientes (ejemplo)}"), con)
close(con)
dl_proyecto(proyecto, causa = 9100)
#> <dl_proyecto> Arteriopatía crónica sintética, causa 9100 | año 2023 | tablas del contrato
#> carpeta: /tmp/Rtmpl4NEGp/proyecto_con_suma
#> suma de los subtipos 9101 + 9102 (omitido: 9103): no se ajusta; dl_correr() suma las corridas de sus subtipos
#> tablas:
#> ubicaciones 26 fila(s), de ubicaciones.csv
#> poblacion 2100 fila(s), de poblacion.csv
suma_sin_9103 <- dl_correr(proyecto, causa = 9100, rapido = TRUE)
#> dl_correr(): causa 9100: suma de los subtipos 9101 + 9102 (omitido: 9103), con sus corridas de prueba de 2023 en /tmp/Rtmpl4NEGp/proyecto_con_suma/resultados/mod/dismod_lite
#> dl_correr(): 9101: 2026-10-15_causa-9101-prueba_v1
#> dl_correr(): 9102: 2026-10-15_causa-9102-prueba_v1
#> dl_correr(): corrida escrita en /tmp/Rtmpl4NEGp/proyecto_con_suma/resultados/mod/dismod_lite/2026-10-15_causa-9100-prueba_v2 (prueba: no sirve para publicar)
unlist(suma_sin_9103$manifest$limitaciones)
#> [1] "suma simulación a simulación de 2 causas hijas (9101, 9102) — la correlación entre hijas no se modela (cada hija viene de su propio ajuste)"
#> [2] "sin ajuste propio — la corrida de la suma no tiene etiquetas, diagnósticos MCMC ni insumos congelados (están en las corridas de las hijas, inputs.runs_hijas)"
#> [3] "hija 9103 omitida de la suma — subtipo sin datos suficientes (ejemplo)"Cada omitido debe estar en subtipos. Sin subtipos_omitidos, que falte la corrida de un subtipo es un error: la suma no deja fuera un subtipo sin decirlo.
Sumar a mano: dl_sumar_hijas()
dl_correr() suma lo más reciente de la carpeta de las corridas. Para sumar corridas elegidas a mano (las de otra carpeta, una que no es la más reciente, una variante con otros subtipos omitidos) está dl_sumar_hijas(), que es la que hace la suma por dentro. Recibe las carpetas de las corridas, la causa padre, el nombre de la corrida nueva y las rutas del proyecto de la causa padre (el registro de subtipos y los nombres de las ubicaciones); los subtipos que no entran van en omitidas:
rutas_padre <- dl_proyecto(proyecto, causa = 9100)$rutas
suma2 <- dl_sumar_hijas(corridas[1:2], causa = 9100, nombre = "suma-sin-renovascular",
carpeta = file.path(proyecto, "resultados"), rutas = rutas_padre,
nombre_causa = "Arteriopatía crónica sintética",
omitidas = list(list(cause_id = 9103, motivo = "subtipo sin datos suficientes (ejemplo)")))
suma2
#> <dl_run> corrida 2026-10-15_suma-sin-renovascular_v1 (suma de las hijas)
#> carpeta: /tmp/Rtmpl4NEGp/proyecto_con_suma/resultados/mod/dismod_lite/2026-10-15_suma-sin-renovascular_v1
#> 3 particiones canónicas (una por medida)Hace las mismas comprobaciones y, sin omitidas, pasar solo dos corridas es un error. nombre_causa es el nombre de la causa padre en las tablas: hay que darlo cuando las rutas son las de una causa con suma_de_subtipos: sí, que no trae ancla de donde tomarlo.
La suma frente al ajuste directo de la causa padre
La causa padre también se puede ajustar directamente, con su propia ancla. Es lo que hace el ejemplo tal como viene, sin suma_de_subtipos; la corrida va a otra carpeta, para no mezclarla con la suma:
directa <- dl_correr(dl_ejemplo(), causa = 9100, semilla = 1, rapido = TRUE, sensibilidad = FALSE,
opciones = opciones, carpeta_salida = file.path(tempdir(), "ajuste_directo"))Las celdas de cada corrida están en cause/<medida>/; la prevalencia va como proporción:
celdas <- function(corrida) {
archivo <- list.files(file.path(corrida, "cause", "prevalence"), full.names = TRUE)
fread(archivo, colClasses = list(character = "location_id"))[location_id == "123"]
}
comparacion <- merge(celdas(directa$dir)[, .(sex_id, age_group_id, age_group_name, directa = val,
directa_inf = lower, directa_sup = upper)],
celdas(suma$dir)[, .(sex_id, age_group_id, suma = val, suma_inf = lower, suma_sup = upper)],
by = c("sex_id", "age_group_id"))Y las anclas: la de la causa padre y la suma de las de sus subtipos, de la misma descarga.
ancla <- fread(list.files(dl_ejemplo("ancla"), full.names = TRUE)[1])
ancla <- ancla[measure_id == 5 & year == 2023 & location_id == 123]
anclas <- dcast(ancla[, .(sex_id, age_id, padre = cause_id == 9100, val)], sex_id + age_id ~ padre,
value.var = "val", fun.aggregate = sum)
setnames(anclas, c("FALSE", "TRUE"), c("suma_subtipos", "padre"))
anclas[, .(razon_minima = min(suma_subtipos / padre), razon_maxima = max(suma_subtipos / padre)), by = sex_id]
#> Key: <sex_id>
#> sex_id razon_minima razon_maxima
#> <int> <num> <num>
#> 1: 1 1 1
#> 2: 2 1 1En este ejemplo el ancla de la causa padre es, grupo a grupo, la suma de las de sus subtipos. Con datos reales puede no serlo, y conviene mirarlo con este mismo cálculo antes de comparar. Las dos estimaciones de la prevalencia nacional de las mujeres, en porcentaje, con el ancho de su intervalo del 95 %:
comparacion[sex_id == 2, .(age_group_name, directa = round(100 * directa, 2), suma = round(100 * suma, 2),
ancho_directa = round(100 * (directa_sup - directa_inf), 2),
ancho_suma = round(100 * (suma_sup - suma_inf), 2))]
#> age_group_name directa suma ancho_directa ancho_suma
#> <char> <num> <num> <num> <num>
#> 1: 40-44 years 0.98 0.97 0.57 0.45
#> 2: 45-49 years 1.48 1.48 0.65 0.60
#> 3: 50-54 years 2.05 2.06 0.79 0.73
#> 4: 55-59 years 2.72 2.74 1.07 1.07
#> 5: 60-64 years 3.50 3.52 1.34 1.29
#> 6: 65-69 years 4.41 4.43 1.74 1.59
#> 7: 70-74 years 5.51 5.50 2.35 2.02
#> 8: 75-79 years 6.83 6.81 2.89 2.46
#> 9: 80-84 years 8.37 8.36 3.36 2.81
#> 10: 85-89 years 9.91 9.91 3.88 3.59
#> 11: 90-94 years 11.36 11.35 5.00 4.18
#> 12: 95+ years 12.67 12.64 7.24 6.43Las medias coinciden de cerca porque las anclas suman lo mismo; si no sumaran, la suma y el ajuste directo se separarían más o menos en esa misma proporción. Las dos estimaciones responden preguntas distintas:
- El ajuste directo usa el ancla de la causa padre y una sola curva de incidencia y mortalidad en exceso.
- La suma respeta la composición: la causa padre es exactamente la suma de sus subtipos en cada celda y cada simulación, con la severidad de cada uno. Es la que se reporta cuando se publican los subtipos, para que las tablas sumen.
El intervalo de la suma suele ser más estrecho que el del ajuste directo: sus simulaciones suman errores independientes de tres ajustes, que se compensan en parte. Si los subtipos comparten fuentes de error (la misma encuesta, la misma definición de caso), el intervalo de la suma puede quedar corto; es una limitación que el manifiesto declara.
Las tablas consolidadas piden la suma para toda causa que declara subtipos. Si lo que se reporta de una causa es su ajuste directo (se modeló entera y sus subtipos no se corren), se dice al consolidar, con dl_consolidar(..., ajuste_directo = 9100), y el manifiesto del consolidado lo declara: ver Corridas, versiones y tablas consolidadas.
La suma toma de cada subtipo sus tres medidas. Un subtipo cuya configuración dice exportar: {incidencia: no} escribe su incidencia igual y entra con ella en la suma; la suma no hereda la marca (ver Una causa sin incidencia en el consolidado).
Temas avanzados: severidad desde una partición y componentes
Estos dos casos se declaran en la configuración, sin tablas nuevas. El ejemplo del paquete no los usa, así que aquí van solo las claves.
Severidad desde una partición
Una partición de severidad es una corrida que reparte la prevalencia de una causa entre sus secuelas y sus estados de salud: una carpeta con su manifest.yaml y las proporciones por secuela (cause_sequela/proportion/<corrida>.csv) y por estado (cause_health_state/proportion/<corrida>.csv), con sus intervalos. Con ella, la severidad de la causa sale de la partición (las proporciones por estado y los pesos de discapacidad del catálogo de GBD 2023 del paquete), en vez de la tabla severidad:
severidad:
particion: particion/mi_corrida # la carpeta de la partición, relativa al proyectoSi la partición es la de la causa padre (reparte la prevalencia del padre entre las secuelas de todos sus subtipos), severidad.padre la declara: el subtipo toma sus secuelas de la partición del padre y las divide por su cuota (la parte de la prevalencia del padre que es suya):
severidad:
particion: particion/corrida_del_padre
padre: 1010Las secuelas y los estados de salud de la partición deben estar en los catálogos de GBD 2023 que trae el paquete (system.file("referencia", package = "dismodlite")): una partición con secuelas o estados propios todavía no se puede leer. En una hija o en un componente, los límites de la severidad son los de la partición divididos por su cuota y pueden pasar de 1: a diferencia de la tabla severidad, que va en , se aceptan con un aviso que nombra los estados, como en la versión 0.2.2. Los AVD toman de ese intervalo la incertidumbre de la proporción; si es demasiado ancho para su media, el estado entra como constante en su media, con otro aviso. Sin carpeta de proyecto (la puerta de R), la ruta relativa se resuelve contra el directorio de trabajo. La corrida copia la partición en inputs/contrato/particion/<corrida>/ y se repite desde ahí (ver Corridas y consolidado). ?dl_severidad_desde_particion describe el cálculo.
Un componente de una causa
A veces solo interesa una parte de una causa: por ejemplo, solo sus estados sintomáticos. El componente se declara con las secuelas que lo forman, junto con la partición:
severidad:
particion: particion/mi_corrida
componente:
secuelas: [5001, 5002] # las secuelas del componente
notas:
- Solo los estados sintomáticos de la causa.El paquete escala la prevalencia del ancla por la fracción de la prevalencia que es del componente, y el AVD de referencia por su fracción de AVD; la severidad es la del componente (solo sus estados, con proporciones que suman 1). Los insumos se ajustan como los de cualquier causa, y la corrida declara el componente en su manifiesto.
Siguientes pasos
- Carga: los años vividos con discapacidad: la severidad, los pesos de discapacidad y el factor de comorbilidad.
- Estimación subnacional: la cascada que usa cada subtipo.
-
Datos locales: la tabla
datoscon la columnacausaen un proyecto de varias causas.