In [2]:
"""
DEMO 04: Análisis de Sensibilidad Global (Python / gsua_csb)
Curso guiado de GSUA-CSB
Cuantifica cuánto contribuye cada factor a la varianza de la salida:
- Índices de Sobol de primer orden S_i,
- Índices de orden total ST_i,
- Índices dependientes del tiempo S_i(t), ST_i(t),
- Comparación entre métodos estimadores (xiao vs saltelli).
Con esto decidimos qué parámetros ESTIMAR (los influyentes) y cuáles FIJAR.
Modelo: SIR continuo del Módulo 01, salida Infectados.
"""
import os
import sys
import numpy as np
import matplotlib.pyplot as plt
from gsua_csb import (
design_matrix,
sensitivity_analysis,
plot_sensitivity_bar,
plot_sensitivity_area,
)
In [3]:
module1_py_path = os.path.abspath(
os.path.join(os.path.dirname(__file__), "..", "..", "01_Introduccion_Modelos", "python")
)
if module1_py_path not in sys.path:
sys.path.append(module1_py_path)
from sir_continuous_userdefined import create_sir_continuous_model
In [4]:
def run_demo():
print("=========================================================================")
print(" MÓDULO 04: ANÁLISIS DE SENSIBILIDAD GLOBAL (PYTHON)")
print("=========================================================================\n")
# 1. Modelo SIR sobre TODO el espacio de factores (rangos amplios por defecto).
model = create_sir_continuous_model(output_selection="Infectados")
free_names = [n for n, fx in zip(model.names, model.fixed) if not fx]
# 2. Muestreo base para el estimador de índices.
M = design_matrix(model, n=500, method="latin_hypercube", seed=0)
# 3. Análisis de sensibilidad con el método Xiao (estimador propio de la toolbox).
res = sensitivity_analysis(model, M, method="xiao")
print("Índices de sensibilidad (método Xiao):")
for name, si, sti in zip(free_names, res.Si, res.STi):
print(f" {name:6s} S_i = {si: .3f} ST_i = {sti: .3f}")
i_max = int(np.argmax(res.STi))
i_min = int(np.argmin(res.STi))
print(f"\nFactor MÁS influyente : {free_names[i_max]} (ST_i = {res.STi[i_max]:.3f})")
print(f"Factor MENOS influyente: {free_names[i_min]} (ST_i = {res.STi[i_min]:.3f})")
print("=> Estima los factores con ST_i alto; considera FIJAR los de ST_i ~ 0.\n")
# 4. Gráfica de barras S_i y ST_i (dos paneles con las funciones de la toolbox).
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
plot_sensitivity_bar(res, index="Si", ax=axes[0]); axes[0].set_title("Primer orden S_i")
plot_sensitivity_bar(res, index="STi", ax=axes[1]); axes[1].set_title("Orden total ST_i")
fig.tight_layout(); fig.savefig("demo_04_indices_barras.png")
# 5. Sensibilidad dependiente del tiempo (¿cuándo importa cada factor?).
fig2, ax2 = plt.subplots(figsize=(9, 4.5))
plot_sensitivity_area(res, xdata=model.domain, index="STi_vec", ax=ax2)
ax2.set_title("Fracción de ST_i(t): factor dominante en cada instante")
fig2.tight_layout(); fig2.savefig("demo_04_sensibilidad_tiempo.png")
# 6. Comparación entre métodos estimadores (robustez del resultado).
res_salt = sensitivity_analysis(model, M, method="saltelli")
print("Comparación ST_i (xiao vs saltelli):")
for name, a, b in zip(free_names, res.STi, res_salt.STi):
print(f" {name:6s} xiao = {a: .3f} saltelli = {b: .3f}")
print("\nFiguras guardadas: demo_04_indices_barras.png, demo_04_sensibilidad_tiempo.png")
# 7. PREGUNTAS Y EJERCICIOS PARA EL ESTUDIANTE
print("\n=========================================================================")
print(" PREGUNTAS DE ANÁLISIS Y EJERCICIOS DOCENTES (MÓDULO 04) ")
print("=========================================================================")
print("1. ¿Qué factor domina la varianza de Infectados? ¿Coincide con tu intuición?")
print("2. ¿Para algún factor ST_i >> S_i? ¿Con quién interactúa? (pista: beta, S0, gamma via R0).")
print("3. Cambia n de 500 a 2000. ¿Se estabilizan los índices? (convergencia del estimador).")
print("4. Si fijas el factor menos sensible, ¿cambia mucho la banda de incertidumbre del Módulo 03?")
print("=========================================================================\n")
In [5]:
if __name__ == "__main__":
run_demo()
========================================================================= MÓDULO 04: ANÁLISIS DE SENSIBILIDAD GLOBAL (PYTHON) =========================================================================
Índices de sensibilidad (método Xiao): beta S_i = 0.244 ST_i = 0.727 gamma S_i = 0.249 ST_i = 0.675 S0 S_i = 0.001 ST_i = 0.074 I0 S_i = 0.031 ST_i = 0.314 Factor MÁS influyente : beta (ST_i = 0.727) Factor MENOS influyente: S0 (ST_i = 0.074) => Estima los factores con ST_i alto; considera FIJAR los de ST_i ~ 0.
Comparación ST_i (xiao vs saltelli): beta xiao = 0.727 saltelli = 0.533 gamma xiao = 0.675 saltelli = 0.557 S0 xiao = 0.074 saltelli = 0.017 I0 xiao = 0.314 saltelli = 0.137 Figuras guardadas: demo_04_indices_barras.png, demo_04_sensibilidad_tiempo.png ========================================================================= PREGUNTAS DE ANÁLISIS Y EJERCICIOS DOCENTES (MÓDULO 04) ========================================================================= 1. ¿Qué factor domina la varianza de Infectados? ¿Coincide con tu intuición? 2. ¿Para algún factor ST_i >> S_i? ¿Con quién interactúa? (pista: beta, S0, gamma via R0). 3. Cambia n de 500 a 2000. ¿Se estabilizan los índices? (convergencia del estimador). 4. Si fijas el factor menos sensible, ¿cambia mucho la banda de incertidumbre del Módulo 03? =========================================================================