dismodlite 2.4.0
Prior de la mortalidad en exceso dado por tabla
-
mortalidad_exceso: {prior: tabla}(en el formato completo,emr_prior.tipo: tabla) toma el prior de la mortalidad en exceso de una tabla del proyecto,prior_mortalidad_exceso(la duodécima del contrato): por sexo y tramo de edad, el centro (mu_log) y la desviación estándar (sd_log) del logaritmo de la mortalidad en exceso. Sirve cuando esa mortalidad se conoce por otra vía: un estudio de seguimiento, otra corrida de la causa o los años vecinos de un año sin muertes fiables. Cada nudo toma el tramo
[edad_inicio, edad_fin)que lo contiene; todos los nudos deben caer en un tramo (el prior no se extrapola) y los tramos de un sexo no se solapan: la revisión del proyecto lo dice.sexo: ambos, o la tabla sin la columnasexo, vale para los dos sexos; sin la columnaanio, la tabla vale para todos los años.Por nudo, log f sigue una Normal con ese centro y esa desviación, truncada bajo el techo: el mismo término y el mismo rango del prior que sale del ancla, con otra fuente.
mu_loges el centro antes de truncar y no puede superar el techo: si el de algún nudo lo supera,dl_insumos()se detiene y la revisión del proyecto lo marca, con los nudos y el techo (suele ser un error de unidades, o un techo que no corresponde: se declara otro enmortalidad_exceso.techo). No usa la mortalidad del ancla, salvo para derivar el techo si no se damortalidad_exceso.techo. Vale con los dos motores ("mh"y"rcpp").Con este prior,
mortalidad_exceso.fraccion_agudano cambia el prior: mueve el techo que sale del ancla y la corrida sigue declarando la fase aguda (su incidencia es el flujo de sobrevivientes a 28 días). Por esosensibilidad.fraccion_aguda(ofraccion_agudaen la rejilla dedl_sensibilidad()) es un error.emr_prior.factor_sdtampoco se admite: la desviación se cambia en la tabla.La tabla entra en el hash de los insumos (solo con este prior) y se congela en
inputs/prior_emr_dado.csvy, como vino, eninputs/contrato/prior_mortalidad_exceso.csv. El manifiesto lo declara:params.emr_prior: tablay una limitación con el techo. En el formato completo, la tabla va endl_rutas(prior_mortalidad_exceso = ).dl_prior_emr()devuelve la tabla tal como entra al ajuste.dl_nuevo_proyecto()deja su plantilla.Los proyectos con los otros priores (
desde_ancla,plano,cero) dan los mismos números y el mismo hash de insumos que en la versión 2.3.0.
dismodlite 2.3.0
Más causas caben en un proyecto sin recetas: las que no tienen mortalidad propia, las que se reparten entre ubicaciones con una razón ya calculada, las que no reportan su incidencia y las que se modelan enteras aunque tengan subtipos. Además, una corrección en el peso de los datos de bandas anchas y una corrida completa más rápida.
Mortalidad en exceso fija en cero
-
mortalidad_exceso: {prior: cero}(en el formato completo,emr_prior.tipo: cero) fija la mortalidad en exceso en 0 y no la estima, para una causa sin muertes (o cuyas muertes no se modelan). Los parámetros son solo log i en los nudos (un bloque del muestreador en lugar de dos), la ecuación se resuelve con f = 0 exacto, en R y en C++ (los motores"mh"y"rcpp"), y la log-posterior no tiene término de mortalidad en exceso ni techo. Sin esta opción, log f de una causa sin muertes no tiene información y sus cadenas no convergen. No pide la
mortalidaden la tablaancla(si la trae, no se usa). No admitemortalidad_exceso.techo,mortalidad_exceso.fraccion_aguda,sensibilidad.fraccion_agudanimortalidadendatos_en_ajuste(con f = 0 el modelo predice 0 muertes): la revisión del proyecto lo dice con la clave.dl_sensibilidad()tampoco admite el ejefraccion_agudaen su grilla con este prior.Vale en todo el recorrido de
dl_correr(), con los dos motores: en la cascada, f es 0 en toda ubicación (una beta conefecto_sobre: mortalidad_excesono tiene efecto); la validación con la mortalidad subnacional reservada se omite, con su motivo;dl_estimaciones(x, "mortalidad_exceso")da 0.El manifiesto de la corrida lo declara:
params.emr_prior: cero,params.emr_cota: [0, 0],params.emr_cota_origen: ceroy una limitación;diagnostics/mcmc.csvno trae filas de log f.Los proyectos con los otros priores (
desde_ancla,plano) dan los mismos números que en la versión 2.2.0.
Reparto subnacional por razón
-
Modo subnacional nuevo,
subnacional: {modo: razon}(cascada.modo: razonen el formato completo), para una causa cuyo patrón entre ubicaciones sale de una razón ya calculada y no de covariables: cada ubicación recibe la tasa nacional por su razón, simulación a simulación y con cierre exacto en el valor nacional, en la prevalencia, la incidencia y los AVD. La razón es la misma en todas las edades y sexos, y el manifiesto lo declara como limitación. En un proyecto el modo se declara solo consubnacional.modo:avanzado: {cascada: {modo: }}no puede cambiarlo arazonni desderazon, ni quitarlo con un nulo (es un error de configuración). Tabla nueva del contrato de insumos,
razones(la undécima;?dl_tablas):ubicacion,anio,razonyerror_log(el error estándar del logaritmo de la razón), concausayfuenteopcionales. Una razón 0 deja la ubicación sin casos.dl_plantilla("razones")da su plantilla ydl_nuevo_proyecto()la escribe; suLEEME.mddice cuándo llenarla.dl_proyecto()ydl_revisar_proyecto()comprueban que, en el año que se estima, la tabla traiga la razón de cada ubicación subnacional de la población y de ninguna otra (tampoco de la nacional), con números finitos y alguna razón mayor que 0; el modo exige la tabla y no admite valores subnacionales de covariables (niproxies_crudos). Condl_correr(anios = ), un año sin razones detiene la corrida antes de correr el primero. Una tablarazonessin el modo es un aviso.dl_repartir_razon()es el paso nuevo, después dedl_avd(); su resultado es la piezarepartodedl_resumir(). Con el modorazon,dl_cascada()da la cascada plana.dl_correr()hace todos los pasos y escribe una sola corrida, ya repartida:cascada.modo: razony el bloquerazonen el manifiesto (la semilla del sorteo, cuántas ubicaciones, el rango de las razones, cuántas son cero y sus fuentes) ydiagnostics/razon.csv(la razón aplicada por ubicación). El nivel nacional, la validación contra el ancla, los factores de renormalización (renorm.csv), las etiquetas y la sensibilidad son los del ajuste nacional (la cascada plana). La validación con la mortalidad subnacional reservada se omite, con su motivo: no hay un gradiente por covariables que comparar. El reparto lleva la huella de la tablarazonesque lo produjo (huella_razones), ydl_resumir()rechaza uno hecho con otra tabla.El reparto se detiene con un error que nombra el sexo y la banda de edad si en una celda las tasas repartidas no son finitas (por ejemplo, si las ubicaciones con razón mayor que 0 no tienen población en esa celda), y con otro, que nombra las ubicaciones, si una prevalencia repartida pasa de 1.
La semilla del sorteo de las razones es la de la corrida; otra se fija con
avanzado: {cascada: {razon_semilla: <entero>}}.
Datos locales y ancla
- Corrección. El peso de un dato cuyo intervalo de edad cruza bandas de población con distinto número de edades reparte la población de cada banda entre sus edades. El caso típico es un dato de todas las edades, de 0 a 125 años, sobre una población por quinquenios con una banda abierta de 80 años y más: antes cada edad llevaba la población entera de su banda y, con las edades del modelo hasta los 99 años, la banda abierta pesaba 4 veces lo que le corresponde frente a un quinquenio. Dentro de una banda, o entre bandas con el mismo número de edades (varios quinquenios), los pesos son los de antes bit a bit: el ancla y las tablas de la corrida no cambian si sus bandas no cruzan bandas de población con distinto número de edades.
- El ancla puede ir a peso completo (
ancla.peso1) aunque la tablafuentes_gbd(en el formato completo, la evidencia) traiga fuentes locales no fatales de la causa, si ningún dato local entra al ajuste (datos_en_ajustevacío): sin datos en el ajuste no hay nada que contar dos veces. Antes era un error.dl_insumos()lo dice con un mensaje, quedl_revisar_proyecto()muestra como aviso, y la corrida lo declara entre las limitaciones de su manifiesto («ancla a peso completo (lambda = 1) con N fuente(s) local(es) no fatal(es) en la evidencia…»), además deparams.fuentes_locales_no_fatales. Con alguna medida endatos_en_ajustesigue siendo un error, que ahora nombra las medidas; con mortalidad en el ajuste y causas de muerte en la evidencia, también.
Corridas y tablas consolidadas
-
exportar: {incidencia: no}: la incidencia de la causa no entra en las tablas consolidadas. La corrida no cambia: la escribe igual (cause/incidence/ydraws/), para el diagnóstico y las sumas; su manifiesto llevacausa.exporta_incidencia: falsey una limitación.dl_consolidar()ydl_consolidado_canonico()omiten la incidencia de esas corridas (la prevalencia y los AVD entran); el bloque de la causa en el manifiesto del consolidado llevaincidencia_exportada: falsey sus limitaciones la nombran. Es para una causa cuya incidencia el modelo no identifica (la fija la remisión declarada, sin datos de incidencia). En el formato completo,exportar.incidencia: {valor: false, procedencia: ...}; solo el «no» llega al formato completo (sin la clave, o con «sí», no hay bloqueexportar).dl_revisar_proyecto()lo dice en la línea de la configuración. La suma de subtipos no hereda la marca: suma la incidencia de todos sus subtipos, así que un consolidado puede traer la incidencia de la causa padre y no la de uno de sus subtipos. dl_consolidar(..., ajuste_directo = 9100)ydl_consolidado_seleccionar(..., ajuste_directo = ): las causas nombradas se consolidan desde su propio ajuste aunquemaster_gbd.csvles declare subtipos (sin el argumento, una causa con subtipos debe venir de su suma, como antes). Para una causa que se modeló entera. El bloque de la causa en el manifiesto del consolidado llevaajuste_directo: truey las limitaciones lo dicen. Es un error nombrar una causa que no está entre las que se consolidan o cuya corrida vigente es una suma; nombrar una sin subtipos en el maestro da un aviso. Si los subtipos de esa causa también están en el consolidado, sus filas no tienen por qué sumar las de la causa: cada una sale de su propio ajuste.
dl_correr() más rápida
-
dl_correr()corre la sensibilidad con elmotorde susopcionesy usa susnucleoscomo procesos, que reparten las combinaciones de la grilla; las cadenas siguen siendo las propias de la sensibilidad (200 simulaciones, 2 cadenas de 6000 iteraciones con 3000 de calentamiento). Antes la corría siempre con el motor"mh"en un proceso. Los núcleos solo cambian el tiempo, no los números. La corrida de producción del ejemplo conmotor = "rcpp"pasa de unos 2.5 minutos a alrededor de 1, y con 4 núcleos además, a alrededor de medio minuto. Conrapido = TRUEtodo sigue igual. -
dl_etiquetas()hace sus reajustes por rho con adelgazamiento 10, no con el del ajuste, cuando no recibeopciones(así la llamadl_correr()): 2 cadenas de 6000 iteraciones con 3000 de calentamiento guardan 600 simulaciones, y los reajustes piden a lo sumo esas y a lo sumo las del ajuste. Con un ajuste de adelgazamiento 30 quedaban 200, pocas para la varianza de cada celda.
Cambios de comportamiento
- El peso de los datos que cruzan bandas de población con distinto número de edades (arriba) cambia los resultados de los proyectos con datos así en el ajuste, y la validación de la mortalidad subnacional si sus intervalos cruzan bandas de ese modo. Un proyecto sin esos datos da lo mismo; el arnés de compatibilidad no cambia.
- El ancla a peso completo con fuentes locales no fatales en
fuentes_gbdy ningún dato en el ajuste era un error y ahora corre, con un aviso y una limitación en el manifiesto. - Con
motor = "rcpp"en lasopcionesdedl_correr(),diagnostics/sensibilidad.csvcambia en las últimas cifras decimales respecto de la versión 2.2.0, como el resto de la corrida (el motor"rcpp"no coincide con"mh"bit a bit). Con el motor por defecto ("mh") no cambia, con cualquier número de núcleos. - Las etiquetas de
dl_correr()y dedl_etiquetas()sinopcionescambian solo si el ajuste usa otro adelgazamiento que 10 (el valor por defecto) y la grilla de rho pide reajustes. Con un adelgazamiento menor que 10, los reajustes pueden guardar menos simulaciones que antes.
Compatibilidad
- Sin las claves, la tabla ni los argumentos nuevos, un proyecto que corría con la versión 2.2.0 da los mismos insumos, las mismas salidas y los mismos manifiestos, salvo por los cambios de comportamiento de arriba. El arnés de compatibilidad sigue reproduciendo la versión 0.2.2 bit a bit.
- El argumento nuevo (
ajuste_directo) va al final de las firmas. Los nombres anteriores de esas dos funciones (?dl_nombres_anteriores) conservan los argumentos de la versión 0.2.2 y no lo tienen: para usarlo,dl_consolidar()ydl_consolidado_seleccionar().
Guías
- «Preparar tus datos»: las once tablas, con
razones, y cuándo usarprior: cero,subnacional.modo: razonyexportar: {incidencia: no}. - «Estimación subnacional»: el modo
razon, con su fórmula, un ejemplo y la semilla del sorteo. - «El modelo»: la mortalidad en exceso en cero, el peso de cada edad en un intervalo que cruza bandas y el reparto por razón.
- «Datos locales»: cuándo el ancla puede ir a peso completo con fuentes locales, y el peso de un dato de banda ancha.
- «Corridas, versiones y tablas consolidadas»:
diagnostics/razon.csv, una causa sin incidencia en el consolidado yajuste_directo. - «Subtipos y suma»: la suma no hereda
exportar: {incidencia: no}, y cuándo se consolida el ajuste directo. - «Diagnóstico y sensibilidad»: el motor y los núcleos de la sensibilidad de
dl_correr(), los tiempos medidos de nuevo y el adelgazamiento de los reajustes de las etiquetas.
dismodlite 2.2.0
Un proyecto se corre como se corre de verdad sin recetas propias: varios años con una sola configuración, el año que todavía no tiene estimación de referencia, la causa que es la suma de sus subtipos, y como claves de la configuración lo que antes pedía avanzado.
Varios años con una configuración
-
dl_correr(..., anios = 2018:2023)corre la causa una vez por año, en orden, y vuelve a leer el proyecto para cada uno. Devuelve una lista de corridas (clasedl_corridas, con los años como nombres:corridas[["2023"]]) y el nombre de cada corrida lleva el año (causa-<causa>-<año>). El proyecto de todos los años se lee antes de correr el primero: un año que no se puede leer (el ancla no lo trae ni trae el anterior, falta su población…) detienedl_correr()con el año y el problema, sin haber escrito ninguna corrida. Si un año falla al correr, se detiene ahí con el error de ese año y dice qué años quedaron escritos. Los dos errores conservan la clase y los campos del original (comoproblemas) y llevan ademásanioyescritas. Un proyecto leído con tablas dadas como argumentos se vuelve a leer con esas mismas tablas, tenga carpeta o no. Sinanios, todo como antes. -
dl_proyecto(..., anio = 2021)lee el proyecto para otro año que el de su configuración, sin editarla (los proxies deproxies_crudosse calibran para ese año). Las lecturas de años distintos del mismo proyecto conviven en la sesión. - El año del ancla sale de una sola regla. Sin
ancla.anio, es el año que se estima si la tablaanclalo trae; si no, el año anterior, y el nivel nacional se proyecta desde él: un mensaje lo anuncia («el ancla no trae 2024: se proyecta desde 2023»),dl_revisar_proyecto()lo muestra como aviso y queda en el manifiesto (la procedencia del año del ancla y las limitaciones). La proyección es de un año a lo sumo. Conancla.aniodeclarado y un año pedido conaniooanios, el año del ancla es el menor de los dos: una configuración conanio: 2024yancla: {anio: 2023}sirve para 2024 y para los años anteriores, cada uno con su propia ancla (y la procedencia del año del ancla lo dice).
Escribir una corrida que aún no converge
-
dl_correr(..., forzar = TRUE)escribe la corrida aunque las cadenas no pasen la compuerta de la convergencia: un mensaje da su R-hat y su ESS y el manifiesto lo declara (validacion.gates.force), como endl_exportar_corrida(). No salta la compuerta del ancla. Sirve para mirar una corrida mientras se afinan las cadenas; sus números no sirven para publicar.
Claves nuevas de la configuración
Cuatro claves que antes solo se podían declarar bajo avanzado, con los nombres del formato completo:
-
ancla.error_maximo(un número entre 0 y 1; por defecto, 0.05): el error relativo mediano máximo entre la prevalencia ajustada y la del ancla con que la corrida se escribe. Los mensajes de la compuerta del ancla la nombran. -
mortalidad_exceso.fraccion_aguda(de 0 a menos de 1): la parte de las muertes de la causa que ocurre en la fase aguda y no entra al compartimento crónico. -
sensibilidad.fraccion_aguda: los valores de la anterior que recorre el análisis de sensibilidad. -
subtipo_de: la causa padre de un subtipo que vive en su propia carpeta. Sin betas propias, usa las de esa causa, y su corrida declara a la causa padre, que es lo que pide la suma. Si la configuración del padre, en el mismo proyecto, también lo declara ensubtipos, las dos deben decir la misma causa.
Una clave ausente no cambia nada: los proyectos de la versión 2.1.0 dan la misma configuración. Siguen en avanzado emr_prior.factor_techo, nsub y emr_prior.fraccion_aguda.cfr_30d.
Una causa que es la suma de sus subtipos
-
Claves nuevas
suma_de_subtiposysubtipos_omitidos: la causa padre no se ajusta, se reporta como la suma de las corridas de sus subtipos. El proyecto de una suma solo necesita
ubicacionesypoblacion: no pideedad_inicio, ancla, severidad ni betas.print()dice qué suma,dl_revisar_proyecto()revisa su configuración, sus dos tablas y qué subtipos tienen configuración en el proyecto, ydl_insumos()la rechaza con un mensaje claro (no hay nada que ajustar).-
dl_correr()de esa causa busca en la carpeta de las corridas la más reciente de cada subtipo que entra, del año que se estima (las de prueba conrapido = TRUE, las de producción sin él), y las suma simulación a simulación. No pidesemilla. Los mensajes dicen qué corrida tomó de cada subtipo y cuáles se escribieron conforzar = TRUE, que en una suma de producción quedan también entre las limitaciones de su manifiesto; si falta la de un subtipo, el error dice cuál, de qué año y dónde se buscó. Conanios, suma cada año con las corridas de ese año. Límites: una suma no puede ser subtipo de otra suma; y entre corridas de un subtipo escritas el mismo día con nombres distintos, la más reciente es la que se escribió última (por la fecha de su
manifest.yaml: copiar la carpeta de las corridas sin conservar las fechas cambia ese desempate).dl_sumar_hijas()no cambia: queda para sumar corridas elegidas a mano.
Covariables y ancla
-
valor_nacional_de(tablabetas): la beta que lo declara ya no necesita la fila nacional de su propia covariable, copiada con otro nombre; basta la de la covariable que nombra. La exención vale para una covariable con valores subnacionales (encovariableso enproxies_crudos). Conproxies_crudos, la calibración cierra en el valor nacional de la covariable nombrada:dl_proyecto()lo toma debetas,dl_calibrar_proxies()tiene el argumentovalor_nacional_de, y el manifiesto lo registra enparams.proxies, solo en la covariable que toma su valor nacional de otra. Un proyecto que trae la fila copiada sigue dando lo mismo. - Las filas de ambos sexos del ancla, que el modelo no usa, ya no piden
poblacion_detalledeamboscuando el ancla trae bandas más finas que la población: sin ese detalle, se dejan fuera.
Cambios de comportamiento
- Un ancla que no trae el año que se estima ya no es un error si trae el año anterior: se proyecta desde él y se anuncia (arriba). Antes había que declarar
ancla: {anio: ...}. Si no trae el año ni el anterior, sigue siendo un error, que dice qué años trae. - Un subtipo declarado en
subtipospor dos configuraciones del mismo proyecto es ahora un error: un subtipo tiene una sola causa padre.
Revisión del proyecto
-
dl_revisar_proyecto()avisa (!), en el paso de la configuración, cuando una clave y su equivalente del formato completo bajoavanzadoestán las dos declaradas con valores distintos (por ejemploancla: {error_maximo: 0.1}yavanzado: {anchor: {gate_err_mediano: {valor: 0.2, ...}}}): nombra las dos y dice que rige la deavanzado. Vale para las claves de números (ancla.error_maximo,mortalidad_exceso.fraccion_aguda,sensibilidad.fraccion_aguda,subtipo_de,ancla.peso,remision…). La lectura no cambia.
Compatibilidad
- Un proyecto que corría con la versión 2.1.0 da los mismos insumos, las mismas salidas y los mismos manifiestos. El arnés de compatibilidad sigue reproduciendo la versión 0.2.2 bit a bit.
- Los argumentos nuevos (
anio,anios,forzar,valor_nacional_de) van al final de las firmas.
Guías
- «Corridas, versiones y tablas consolidadas»: varios años con
anios, la regla del año del ancla y la proyección,forzary cómo correr todas las causas de un proyecto, con las que son la suma de sus subtipos al final. - «Subtipos y suma»: el flujo con
dl_correr()para los subtipos y para la suma (suma_de_subtipos,subtipos_omitidos), condl_sumar_hijas()como la forma manual. - «Preparar tus datos»: las claves nuevas, la configuración de una suma,
valor_nacional_desin fila copiada y las filas de ambos sexos del ancla.
dismodlite 2.1.0
Los valores subnacionales de una covariable pueden venir de una encuesta: el paquete los calibra al leer el proyecto.
De la encuesta a la covariable
- Tabla nueva del contrato,
proxies_crudos(la décima): un indicador de encuesta, u otra fuente con ediciones, ya agregado por ubicación subnacional y edición, con su error estándar (ubicacion,anio,sexo, edades,covariable,indicador,valor,error_estandaryfuente). Una fila sin edades es de todas las edades de la población, empiece donde empiece. -
dl_calibrar_proxies()convierte esos valores en las filas subnacionales decovariablesdel año que se estima:- el gradiente de cada ubicación en cada edición, frente al promedio de la edición ponderado por la población, en
cociente(log de la razón) o endiferencia(puntos); - el gradiente del año: un paseo aleatorio observado con error, suavizado con todas las ediciones (filtro de Kalman y suavizador RTS), con su varianza por año q estimada por máxima verosimilitud para cada covariable; o la edición del año o la más cercana (
metodo = "edicion"); - el cierre exacto en el valor nacional: el promedio ponderado por la población de las filas calibradas es el valor nacional de
covariables. Devuelve también la calibración de cada covariable (método, transformación, q, ediciones usadas y excluidas, años de la población), las series observadas y suavizadas y las ediciones excluidas. Conubicacion_gbdleecovariablesdesde una carpeta de descargas del GHDx con varias ubicaciones (como endl_tabla()).
- el gradiente de cada ubicación en cada edición, frente al promedio de la edición ponderado por la población, en
-
dl_proyecto()ydl_configuracion()calibranproxies_crudosal leer el proyecto, para el año que se estima y con el valor nacional del año del ancla. Claves nuevas de la configuración:proxies.metodo,proxies.transformacion(por covariable; por defecto,cociente) yproxies.excluir(ediciones que no entran, cada una con su motivo). Las filas subnacionales de cada covariable vienen de una sola tabla: si vienen decovariablesy deproxies_crudos, es un error. -
print()del proyecto ydl_revisar_proyecto()(paso «proxies») muestran, por covariable, el método, q y las ediciones, y dicen si q quedó en un borde de su intervalo de búsqueda (relativo al error de las ediciones, así que no depende de las unidades del indicador). -
dl_correr()congelaproxies_crudoseninputs/contrato/(repetir la corrida desde ahí vuelve a calibrar igual), escribe las series endiagnostics/proxies_series.csvy registra la calibración enparams.proxiesdel manifiesto. -
dl_nuevo_proyecto()escribe también la plantillaproxies_crudos.csv. - Los proxies de un proyecto son los del año con que se tradujo: si el año de su configuración cambia después (
p$configuracion$years$ajuste),dl_insumos()se detiene con un error que pide volver a llamar adl_proyecto()con ese año (antes, la tablacov_proxyquedaba vacía y la cascada fallaba más adelante).
El ejemplo
- El proyecto de ejemplo (
dl_ejemplo()) traeproxies_crudos.csv, una encuesta sintética con tres ediciones (2019, 2021 y 2023), en lugar decovariables/proxies.csv; su configuración declara el HAQ endiferencia. Sus proxies departamentales son ahora los de la calibración, así que las estimaciones departamentales del ejemplo cambian un poco.acs_peru_completono cambia. -
dl_rutas_ejemplo(anio = 2019)ydl_rutas_ejemplo(anio = 2024)traen los proxies de ese año (en la versión 2.0.0, la tablacov_proxydel formato simple quedaba vacía en esos años).
Compatibilidad
- Un proyecto sin
proxies_crudosda exactamente los mismos insumos que con la versión 2.0.0. El arnés de compatibilidad sigue reproduciendo la versión 0.2.2 bit a bit (sus escenarios del contrato leen el ejemplo con los proxies ya calibrados deacs_peru_completo).
Guías
- «Estimación subnacional» explica, en la sección «De la encuesta a la covariable», el gradiente, el paseo aleatorio, cómo leer q, el cierre, cuándo usar
cocienteodiferenciay cómo queda registrada la calibración. - «Preparar tus datos» describe las diez tablas, con
proxies_crudosy la regla de una sola fuente por covariable.
dismodlite 2.0.0
Los insumos pasan a ser un contrato público y corto: unas pocas tablas con un eje común, que se preparan igual vengan de donde vengan los datos. Es una versión mayor porque los proyectos de la versión 1.0.0 se rehacen (abajo).
El contrato de insumos
- Nueve tablas como máximo:
ubicaciones,poblacionyancla(obligatorias),covariables,betas,datos,severidad,fuentes_gbdypoblacion_detalle.?dl_tablasdocumenta cada una, con sus columnas, unidades y valores, desde una sola definición (inst/referencia/tablas.csv) que usan también el validador, las plantillas y los mensajes. - Todas comparten un eje:
causa,ubicacion,anio,sexo,edad_inicioyedad_fin. Una columna del eje que no viene significa que la tabla no varía en esa dimensión (sinubicacion, la nacional; sinsexo, ambos; sin edades, todas…). Las unidades son fijas: proporciones de 0 a 1 y tasas por persona-año. - Las ubicaciones se declaran una vez en
ubicaciones, con códigos propios: la nacional sinpadrey las subnacionales con la nacional de padre. Salenlocation_id,age_group_id,sex_idy los ids inventados. - Una sola tabla
covariablespara el valor nacional de cada covariable y sus valores subnacionales (los proxies). Las betas pasan de la configuración a la tablabetas; un subtipo sin filas propias usa las de su causa padre (la que lo declara ensubtiposo, en su propia carpeta, la deavanzado: extraction). - Las descargas de GBD Results y del GHDx se reconocen por sus columnas y se convierten solas (el Rate entre 100 000, las edades de GBD a bandas,
measure_idamedida). La claveubicacion_gbd(antesubicacion_nacional) dice quélocation_idde GBD es el país; por defecto, el código nacional deubicacionessi está en la descarga, o la única ubicación de la descarga (la misma regla en los tres lectores). La lista de fuentes del GHDx queda con el código nacional del proyecto, con cada fuente una vez (la lista del GHDx la repite en varias filas); sus fuentes de otras ubicaciones de GBD se descartan, con un aviso. - La configuración guarda decisiones y las tablas, números con su fuente. Entran
severidad.particion,severidad.padreycomponente.secuelas, que antes solo existían en el formato completo. - La corrida congela las tablas del contrato que usó y la configuración del proyecto tal como se leyó (
inputs/contrato/<tabla>.csvyinputs/contrato/config.yaml) con su sha256 en el manifiesto:inputs/contrato/es la carpeta de un proyecto, y una corrida hecha con tablas o una configuración de R se repite sin ellas. La de un subtipo con las betas de su causa padre las congela a su nombre, con la causa padre enavanzado: extraction. La carpeta deseveridad.particionse congela eninputs/contrato/particion/<corrida>/, con la ruta de la configuración congelada cambiada a ella (la tablaseveridad, que sale de ella, no se congela aparte). - La severidad que sale de la partición de una hija o de un componente puede tener límites mayores que 1 (los de la partición divididos por su cuota): se acepta con un aviso que nombra los estados, como en la versión 0.2.2. La tabla
severidadescrita por el usuario sigue en . - Los proxies de
covariablespueden venir en bandas de edad propias, uniones de las de la población (por ejemplo 45-59 con bandas de 5 años). - Las bandas de la población van seguidas: un hueco entre ellas es un problema de la población. En
datos,anio_iniciomayor queanio_fines un problema de la tabla. Las filas de los mensajes se cuentan como las líneas del CSV (el encabezado es la 1) o, en undata.frame, por su número de fila.
Dos puertas, una función
-
dl_proyecto()recibe las tablas de la carpeta del proyecto (nombres fijos:poblacion.csv,ancla/…) o como argumentos, undata.frameo la ruta de un CSV o de una carpeta:dl_proyecto(configuracion = list(...), ubicaciones = ..., poblacion = ..., ancla = ...). Las dos puertas se mezclan (lo que se pasa reemplaza a la tabla de la carpeta) y pasan por el mismo validador.dl_proyecto()se detiene con el problema de una tabla sola o, si todas están bien, con todos los problemas entre tablas juntos (una sola ubicación nacional, ubicaciones conocidas, población y ancla que cubren el modelo…), y avisa de sus sospechas. -
dl_tabla()lee, convierte y valida una tabla suelta;dl_plantilla()da la plantilla de una tabla (sus columnas y una fila de ejemplo).dl_nuevo_proyecto()crea la carpeta con las plantillas de todas. -
dl_revisar_proyecto()revisa cada tabla, la configuración, las reglas que cruzan tablas y los insumos, y acepta también un proyecto ya leído condl_proyecto(). Cada mensaje dice la tabla, su origen (el archivo o el argumento), la columna, las filas y cómo corregirlo.
Bandas de edad del ancla
- El ancla usa sus bandas de edad tal como vienen cuando la población tiene ese detalle: cada banda (80-84, 85-89, 90-94, 95 y más…) es un término del ajuste y una celda de los resultados, también en los AVD, las etiquetas y el consolidado. La versión 1.0.0 agrupaba siempre el ancla de 80 años y más (y la de menos de 5) en una sola banda.
-
Los resultados de un proyecto rehecho cambian en las edades de 80 años y más: hay una celda por banda del ancla y el ajuste usa la información de cada una. Para reproducir la agrupación de la 1.0.0, la configuración declara
avanzado: {anchor: {agrupar_bandas_finas: true}}. - Si la población es más gruesa que el ancla (por ejemplo, solo 80 y más, o los menores de 5 en una banda), las bandas del ancla se agrupan en las de la población con los pesos de la tabla nueva
poblacion_detalle(la población nacional con más detalle de edad). Reemplaza apesos_80mas.csv. -
ancla.correlacion_edad(ρ) cuenta la distancia en bandas: con más bandas en las edades altas, la misma ρ las correlaciona menos.
Catálogos de GBD en el paquete
- Los catálogos de GBD 2023 de estados de salud (con sus pesos de discapacidad) y de secuelas vienen en
inst/referencia/, con su cita a IHME y sus términos de uso. En la tablaseveridad, un estado de salud de GBD (por nombre o id) toma sus pesos del catálogo; un estado propio trae los tres pesos. En cualquier estado van los tres o ninguno.
Los proyectos 1.0.0 se rehacen
- El formato simple de la versión 1.0.0 (con
proxies.csv,pesos_80mas.csv,location_iden las tablas ycovariables:en la configuración) no se lee: esos proyectos se rehacen en el contrato. La revisión de la configuración señala las claves que ya no existen (por ejemplo,ubicacion_nacionalahora esubicacion_gbd), y la guía «Preparar tus datos» explica cada tabla. - Los proyectos de la versión 0.2.2 (el formato completo, con
schema: dismod_lite/v1) se siguen leyendo igual y dan los mismos números; salen de las guías y quedan documentados en?dl_proyectoy?dl_configuracion. - El proyecto de ejemplo (
dl_ejemplo()) está en el contrato.
Corrección: la prevalencia del ancla se lee en Rate
- El paquete leía la prevalencia de las estimaciones de GBD en la métrica Percent, como si fuera la proporción de la población. No lo es: GBD Results calcula ese Percent sobre las personas con alguna causa (la prevalencia de todas las causas), no sobre la población, y supera a Rate / 100 000 en la inversa de esa prevalencia. En el país del ejemplo, en 2023, la diferencia es nula desde los 75 años, menor que 1 % entre los 20 y los 60, de 1,5 % a 6 % entre los 2 y los 19 y de 22 % a 37 % antes de los 2. En las causas cardiovasculares, el total de todas las edades baja entre 0,02 % y 2,4 %. Ahora la prevalencia se lee en Rate / 100 000, como las demás medidas.
- Las descargas de
ancla/deben traer la prevalencia en Rate; si solo la traen en Percent, el mensaje lo dice. -
anchor.metrica_prevalencia: {valor: Percent, procedencia}(en un proyecto, dentro deavanzado:) repite la lectura anterior, para reproducir corridas hechas hasta la versión 1.0.0. - Los datos de ejemplo traen la prevalencia en las dos métricas.
dismodlite 1.0.0
Primera versión como paquete independiente y en español. Los proyectos y los scripts de la versión 0.2.2 siguen funcionando y, con los mismos insumos, la misma semilla y las mismas opciones, dan los mismos números.
Formato simple de proyecto
- Un proyecto es una carpeta con una configuración corta (
config.yaml, oconfig/<causa>.yamlcon varias causas), las descargas de GBD Results (ancla/) y del GHDx (covariables/) tal como se descargan, y unas pocas tablas planas:poblacion.csv,severidad.csvy, si hacen falta,proxies.csv,datos.csvypesos_80mas.csv.?dl_proyectodocumenta cada archivo y cada columna, con sus unidades;?dl_configuracion, cada clave, su símbolo en el modelo y su valor por defecto. - Lo mínimo de la configuración son tres claves:
causa,anioyedad_inicio. Las demás tienen un valor por defecto, queprint()del proyecto muestra y el manifiesto de cada corrida registra (configuracion.por_defecto). Las claves tienen nombres descriptivos, con el símbolo del modelo en la ayuda:ancla.peso(λ),ancla.correlacion_edad(ρ),incidencia.suavidad(σ),subnacional.kappa(κ)… - El bloque
avanzado:pasa claves del formato completo tal cual, para las opciones que no tienen clave simple. -
dl_proyecto()lee la carpeta y la traduce al formato completo que usa el resto del paquete; la traducción solo renombra columnas y agrega constantes, así que los números medidos pasan tal cual.dl_insumos(dl_proyecto(...))es el primer paso de una corrida, y con un proyecto simple los mensajes citan sus claves y sus archivos. - Datos locales: entran al ajuste solo los tipos que declara
datos_en_ajuste(por defecto ninguno: validan). Con datos en el ajuste y el ancla a peso completo, un aviso recuerda el posible doble conteo. - Los proyectos de la versión 0.2.2 (el formato completo, con
schema: dismod_lite/v1) se leen igual; es el formato de las opciones avanzadas (componentes de una causa, severidad desde una partición, tablas consolidadas).
Ubicaciones de cualquier país
- El país es el de
ubicacion_nacional(ellocation_idde GBD) y las ubicaciones subnacionales son las depoblacion.csv, con códigos libres: departamentos, regiones, provincias… El bloque de la configuración se llamasubnacional(departamentos, su nombre anterior, sigue valiendo). - Si
poblacion.csvno trae las filas nacionales, el total nacional es la suma exacta de las subnacionales; los pesos de las bandas de 80 años y más salen de la población. - El formato completo conserva las reglas de la versión 0.2.2 para las ubicaciones.
Herramientas del proyecto
-
dl_nuevo_proyecto()crea la carpeta de un proyecto con la configuración comentada (cada clave con su explicación y su valor por defecto), las plantillas de las tablas y unLEEME.mdcon los pasos. Nunca sobrescribe. -
dl_revisar_proyecto()revisa la configuración, cada archivo y los insumos completos sin detenerse en el primer problema, y dice cómo corregir cada uno. -
dl_correr()hace la corrida completa en una llamada (insumos, ajuste, estimación subnacional, validación, AVD, etiquetas, sensibilidad, resumen y carpeta de la corrida), con las cadenas de producción por defecto; conrapido = TRUE, una prueba corta que no sirve para publicar; conregistro, la corrida queda además en el registro de corridas.
Funciones y argumentos en español
- Todas las funciones y sus argumentos tienen nombres en español:
dl_ajustar(),dl_cascada(),dl_avd(),semilla,simulaciones,calentamiento… Los nombres de la versión 0.2.2 siguen exportados, con sus argumentos, y dan el mismo resultado (ver?dl_nombres_anteriores). Los objetos, sus clases y sus campos no cambian. - Nuevas:
dl_estimaciones()(media e intervalo por edad, sexo y ubicación de un ajuste, una cascada o los AVD),dl_ejemplo()(concopiar_en, una copia del proyecto de ejemplo para editar),dl_rutas_ejemplo()ydl_configuracion_ejemplo(). - Los mensajes están en español, nombran la función que se llamó y dicen el archivo, la columna y la corrección. Un CSV guardado desde Excel con separador
;, coma decimal o códigos sin el cero inicial se reconoce y se explica. - Datos de ejemplo sintéticos: una enfermedad ficticia con tres subtipos, con la geografía del Perú como ejemplo, en los dos formatos (
acs_peruyacs_peru_completo), con las curvas verdaderas enverdad.csv.
Tablas consolidadas con nombres neutros
- La función del consolidado se llama
dl_consolidar()(su nombre anterior sigue funcionando). Escribe enmod/consolidado/<id>/la tabla canónica (canonico/), una tabla por medida con la forma de un perfil de columnas (tablas/) y el manifiesto, con las limitaciones armadas a partir de lo que se consolidó. - Los perfiles de columnas vienen con el paquete, en
system.file("perfiles", package = "dismodlite"), con las mismas columnas que en la versión 0.2.2. - Una corrida se anota en el registro de corridas solo si se da el registro, y ese archivo debe existir.
Paquete independiente
- El paquete ya no necesita el repositorio en el que se desarrolló: los esquemas, los perfiles y el núcleo en C++ vienen con él, y la variable de entorno que apuntaba a ese repositorio ya no se usa. Del entorno solo se leen
DATA_ROOTyCATALOGOS_DIR, como respaldo de las rutas. - Funciona en rutas con espacios y tildes (por ejemplo
C:/Users/Ana María/Mis análisis/) y en una sesión con locale C.
Compatibilidad con la versión 0.2.2
- Las pruebas del paquete corren doce escenarios con la API nueva (cinco de ellos también con el proyecto de ejemplo en el formato simple) y comprueban que dan los mismos números que la versión 0.2.2, bit a bit en la misma máquina.
- Diferencias de comportamiento, todas para entradas que antes pasaban sin aviso: una ruta opcional que se da y no existe es un error; una tabla de severidad de otra causa detiene
dl_insumos(); los datos locales con valores imposibles (una prevalencia fuera de 0 a 1, casos que superan la muestra, un error estándar no positivo) o un dato excluido con el motivo vacío lo detienen también.?dl_nombres_anterioreslista las diferencias de los nombres anteriores.
Motor en C++
-
motor = "rcpp"(endl_opciones_mcmc()) sigue siendo opcional y evalúa la log-posterior varias veces más rápido;"mh", en R, es el valor por defecto y la referencia, y el motor no se elige solo según lo que haya instalado (?dl_opciones_mcmcexplica por qué). Sin Rcpp o sin compilador, un mensaje dice qué instalar o que se usemotor = "mh".
Documentación
- Ayuda en español para cada función, con ejemplos que corren sobre el proyecto de ejemplo, y guías que explican el modelo, cómo preparar los datos y cada etapa de una corrida.
- Las guías están escritas en Quarto y el sitio tiene un diseño propio, con modo claro y oscuro.
- Logo del paquete: la prevalencia por edad del proyecto de ejemplo, con la curva nacional y las 25 subnacionales (
data-raw/logo.R).