Calibraciones

Calibrar modelos

Tinamït puede calibrar modelos según variables observados. Las calibraciones se efectuan con calibradores (CalibradorMod), por ejemplo, CalibradorModSpotPy.

import numpy as np

from tinamit.ejemplos import obt_ejemplo
from tinamit.envolt.mds import gen_mds

mod = gen_mds(obt_ejemplo('enfermedad/mod_enferm.mdl'))

Generaremos unos datos artificiales (sí, hacemos trampa).

from tinamit.datos.fuente import FuenteDic

paráms = {
    'taza de contacto': 81.25,
    'taza de infección': 0.007,
    'número inicial infectado': 22.5,
    'taza de recuperación': 0.0375
}

simul = mod.simular(
    t=100, extern=paráms,
    vars_interés=['Individuos Suceptibles', 'Individuos Infectados', 'Individuos Resistentes']
)
datos = FuenteDic({ll: v[:, 0] for ll, v in simul.a_dic().items()}, nombre='Datos', fechas=np.arange(101))

Y efectuamos la calibración.

from tinamit.calibs.mod import CalibradorModSpotPy

líms_paráms={
    'taza de contacto': (0, 100),
    'taza de infección': (0, 0.02),
    'número inicial infectado': (0, 50),
    'taza de recuperación': (0, 0.1)
}

calibs = CalibradorModSpotPy(mod).calibrar(líms_paráms=líms_paráms, datos=datos, n_iter=50)

Calibrar ecuaciones

En el caso de modelos de dinámicas de sistemas, también se pueden calibrar los parámetros de ecuaciones individuales si tienes los datos necesarios.

Las calibraciones se pueden hacer con optimización (CalibradorEcOpt) o con inferencia bayesiana (CalibradorEcBayes).

Note

Casos sencillos con muchos datos disponibles generalmente se pueden resolver mucho más rápido con optimización normal que con la más sofisticada inferencia bayesiana.

El el modelo epidemiológico, el número de contactos con susceptibles se determina por el número de suceptibles y la taza de contacto según la ecuación contactos con suceptibles = Individuos Suceptibles * taza de contacto. Suponiendo que tenemos datos para el número de suceptibles y el número de contactos, podemos estimar la taza de contacto.

from tinamit.calibs.ec import CalibradorEcOpt
from tinamit.datos.bd import BD
from tinamit.datos.fuente import FuenteDic

n_obs = 100
taza_contacto = 125
individuos_suceptibles = np.random.random(n_obs)

contactos_con_suceptibles = individuos_suceptibles * taza_contacto + np.random.normal(0, 1, n_obs)
bd = BD(
    fuentes=FuenteDic({
            'contactos con suceptibles': contactos_con_suceptibles,
            'Individuos Suceptibles': individuos_suceptibles,
            'f': np.arange(n_obs)
        },
        nombre='Datos generados',
        fechas='f'
    )
)

calibrador = CalibradorEcOpt(
    ec=mod.variables['contactos con suceptibles'].ec, nombre='contactos con suceptibles',
    paráms=['taza de contacto']
)
calib_ec = calibrador.calibrar(líms_paráms={'taza de contacto': (0, 200)}, bd=bd)

Validar

Por supuesto, no hay calibración sin validación. (Al menos que tengas que publicar ya.) Las validaciones se efectuan con ValidadorMod.

from tinamit.calibs.valid import ValidadorMod

valid = ValidadorMod(mod).validar(
    t=100, datos=datos, paráms={prm: trz['mejor'] for prm, trz in calibs.items()}
)