Skip to content

🇬🇧 English · 🇪🇸 Español

Diferenciación automática y adaptadores de modelos

La aritmética dual e hiperdual de PureMacro diferencia funciones compatibles sobre NumPy. El protocolo de modelos es una interfaz distinta: no garantiza que todas las operaciones estén implementadas ni usen diferenciación automática.

Cálculos compatibles

Modelo Verosimilitud y gradiente Límites
StateSpaceModel escalar Verosimilitud nativa de Kalman y recursión analítica de sensibilidades Sistema estacionario; parámetros rho, sigma_eps y sigma_meas; conserva cargas e interceptos
LinearModel de primer orden Verosimilitud nativa y gradiente de Kalman Requiere ecuaciones resolubles y nombres estructurales; las sensibilidades pueden usar diferencias finitas
BlockDAG Whittle nativo y gradiente por diferencias centrales Requiere datos, observables, covarianza de choques, parámetros y estado estacionario explícitos
Adaptadores DFM, SVAR, comercio y espacio Delegan métodos nativos compatibles Una operación no implementada produce NotImplementedError
Adaptador con model=None Demostración sintética con derivadas DualArray Emite una advertencia; no estima un modelo económico

Las clases desconocidas producen TypeError. Verificar el protocolo comprueba nombres de métodos, no validez científica.

La verosimilitud DSGE usa inicialización estacionaria de Kalman. El gradiente estructural vuelve a resolver el modelo con los parámetros solicitados. Especifique las covarianzas de choques y errores de medición cuando no correspondan varianzas unitarias y ruido de medición nulo. Kalman admite observaciones faltantes; Whittle requiere observaciones completas y finitas.

El gradiente DAG mantiene fijo el estado estacionario suministrado. Es una derivada condicional: no incluye la recalibración del estado estacionario. Cuando esta sea necesaria, debe incorporarse en una función objetivo externa.

Aritmética de derivadas

Para \(x+\varepsilon d\), con \(\varepsilon^2=0\), se cumple \(f(x+\varepsilon d)=f(x)+\varepsilon f'(x)d\). La aritmética hiperdual agrega un término mixto para segundas derivadas. Esto no elimina problemas de identificación, decisiones no suaves ni error de Monte Carlo.

import numpy as np
from puremacro._autodiff import value_and_grad, hessian_forward

def loss(theta):
    return 100*(theta[0]-0.02)**2 + 50*theta[1]**2 + 20*theta[0]*theta[1]

theta = np.array([0.035, 0.015])
value, gradient = value_and_grad(loss, theta)
_, _, hessian = hessian_forward(loss, theta)
np.testing.assert_allclose(hessian, [[200, 20], [20, 100]])
print(value, gradient)

Ejemplo con espacio de estados nativo

Aquí los datos se simulan explícitamente. Para estimación, sustitúyalos por datos observados conservando el orden de las columnas.

import numpy as np
from puremacro.state_space import StateSpaceModel
from puremacro.core.protocol import wrap_differentiable_model

ssm = StateSpaceModel(
    T=np.array([[0.75]]), Z=np.array([[1.0]]),
    Q=np.array([[0.20**2]]), H=np.array([[0.05**2]]),
)
model = wrap_differentiable_model(ssm)
data = model.simulate(periods=100, seed=42)
loglik, score = model.loglik_and_grad([0.75, 0.20, 0.05], data)
irf = model.impulse_response(shock=0, horizon=12)
print(loglik, score)

Para un DSGE resuelto, seleccione parámetros estructurales, por ejemplo wrap_differentiable_model(dsge, param_names=["beta", "sigma", "kappa"]). Use observables=["y", "pi"] si esas son las variables observadas. Un nombre de parámetro incorrecto produce un error.

Un contrafactual DSGE puede suministrar param_override y shock_sequence. El adaptador vuelve a resolver las ecuaciones y simula las innovaciones dadas. Los formatos de escenario no compatibles producen un error explícito.

flowchart TD
    A[Supplied model and observed data] --> B{Supported native operation?}
    B -- Yes --> C[Native equations or state space]
    C --> D[Likelihood and documented score method]
    B -- No --> E[Explicit unsupported-operation error]
    F[Explicit model=None] --> G[Warned synthetic demonstration]

Validación e interpretación

tests/test_protocol_model_fidelity.py compara contra evaluaciones separadas de Kalman y Whittle, cambia cargas estructurales y comprueba que cambie la verosimilitud, verifica derivadas y evita sustituciones sintéticas silenciosas.

La concordancia con diferencias finitas verifica una derivada local de ese objetivo. No establece identificación, precisión posterior ni adecuación económica. Los scripts de tools/reference_validation/ permiten continuar con comparaciones independientes antes de una aplicación de investigación.