Herramientas de usuario

Herramientas del sitio


clase:iabd:pia:2eval:tema08.intervalo_confianza

8. Optimización de redes neuronales b) Evaluación de Modelos

Cuando calculamos una métrica realmente no tenemos el valor real de la métrica sino un valor (llamado estimador) que nos ayuda para saber el verdadero valor de la métrica.

El valor real de la métrica no lo podemos obtener pero si al menos in intervalo en el que es probable que esté ese valor real. A ese intervalo se le llama el intervalo de confianza.

En este prospecto médico para un test de COVID se muestran los intervalos de confianza la para la sensibilidad y la especificidad: sars-cov-2_rapid_antigen_test_es.pdf.

Los datos que se muestran son los siguientes:

$$ \begin{array} \\ E&=&115&=&Nº \; de \; enfermos \\ S&=&311&=&Nº \; de \; sanos \\ TP&=&111&=&Nº \; predichos \; positivos \\ TN&=&310&=&Nº \; predichos \; negativos \end{array} $$

$$ \begin{array} \\ Sensibilidad&=&\frac{111}{115}&=&0,9652&=&96,52\% \\ Especificidad&=&\frac{310}{311}&=&0,9968&=&99,68\% \end{array} $$

La sensibilidad real y la especificidad real no la conocemos ya que con otros paciente habría dado unos resultados distintos, por ello se calcula el intervalo de confianza que nos dice que ese intervalo con un 95% de probabilidad tendrá dentro el valor buscado.

Siguiendo con el test de covid los intervalos de confianza mostrados son:

$$ \begin{array} \\ Sensibilidad&=&[91,33\% \; ‑ \; 99,04\%] \\ Especificidad&=&[98,22\% \; ‑ \; 99,99\%] \end{array} $$

Es decir que:

  • El intervalo de confianza de $[91,33\% \; ‑ \; 99,04\%]$ tiene una probabilidad del 95% de contener al valor real de la Sensibilidad
  • El intervalo de confianza de $[98,22\% \; ‑ \; 99,99\%]$ tiene una probabilidad del 95% de contener al valor real de la Especificidad

Cálculo del intervalo de confianza

Hay varias formas de calcular el intervalo de confianza, en el ejemplo de COVID se usa Clopper-Pearson.

Para calcular esos intervalos se necesitan los siguientes datos:

  • Tamaño de la muestra o número de intentos: Realmente es el denominador de nuestra métrica
  • Número de éxitos o de positivos: Realmente es el numerador de nuestra métrica
  • Nivel de confianza: Suele ser el 95% pero podría ser cualquier valor , aunque si se cambia debería ser un valor mayor aun para estar más seguro.

La forma de calcular los intervalos de confianza es:

Desgraciadamente hay varios formas de calcular el intervalo de confianza, los vamos a nombrar ahora y tambien como se llaman en la función de proportion_confint.

Nombre Nombre en proportion_confint
Aproximación normal (Wald) normal
Clopper-Pearson exacto basado en la distribución Beta beta
Wilson wilson
Jeffreys con pior Beta(0.5, 0.5) jeffreys
Agresti-Coull agresti_coull

Veamos un ejemplo en Python que calcula todos los intervalos de confianza para todos los tipos:

import statsmodels.stats.proportion as smp

# Número de éxitos
success = 111
# Número total de ensayos
total = 115
# Nivel de confianza deseado
confianza=95

methods=['normal','beta','wilson','jeffreys','agresti_coull']
for method in methods:
    lower, upper = smp.proportion_confint(success, total, alpha=1-(confianza/100), method=method)

    print(f"Intervalo de confianza al {confianza}% con el método \"{method}\"= [{lower:.4f}, {upper:.4f}]")

Y el resultado es:

Intervalo de confianza al 95% con el método "normal"= [0.9317, 0.9987]
Intervalo de confianza al 95% con el método "beta"= [0.9133, 0.9904]
Intervalo de confianza al 95% con el método "wilson"= [0.9140, 0.9864]
Intervalo de confianza al 95% con el método "jeffreys"= [0.9194, 0.9881]
Intervalo de confianza al 95% con el método "agresti_coull"= [0.9111, 0.9893]

Y podemos observar que el cálculo del intervalo del test de COVID se hizo con Clopper-Pearson

Elección del método

De forma general y sin querer entrar en detalles el método que deberemos usar en las métricas será el Jeffreys (jeffreys)

¿Porque Jeffreys? Porque es el que usa estadística bayesiana para calcular el intervalo de confianza. Así que realmente no es un intervalo de confianza sino un intervalo de credibilidad. ¿cual es la diferencia? Vamos a explicarlo con el ejemplo que estamos usando:

  • Intervalo de confianza de Clopper-Pearson de [0.9133, 0.9904] significa que hay un 95% de probabilidad de que ese intervalo contenga al valor real que estamos buscando.
  • Intervalo de credibilidad de Jeffreys de [0.9194, 0.9881] significa que hay un 95% de probabilidad de que el valor real que estamos buscando esté en ese intervalo.

En el siguiente código se puede ver como da el mismo resultado usando proportion_confint(method="jeffreys") que calculándolo mediante el teorema de bayes y usando como prior una $Beta(0.5,0.5)$. Y por lo tanto Jeffreys es un Intervalo de credibilidad ya que es lo que se calcula en la estadística bayesiana.

NOTA:La explicación del cálculo bayesiano va más allá del ámbito de este curso de especialización.

from scipy.stats import beta
from statsmodels.stats.proportion import proportion_confint

success=111
total=115
confidence=0.95

lower,upper=proportion_confint(success,total,method="jeffreys",alpha=1-confidence)
print(f"Intervalo de confianza usando \"Jeffreys\"\t\t\t=[{lower:.6f} - {upper:.6f}]")
beta_a=0.5+success
beta_b=0.5+total-success
lower,upper=beta.interval(confidence,beta_a,beta_b)
print(f"Intervalo de confianza usando Bayes con prior Beta(0.5,0.5)\t=[{lower:.6f} - {upper:.6f}]")

Intervalo de confianza usando "Jeffreys"			=[0.919431 - 0.988148]
Intervalo de confianza usando Bayes con prior Beta(0.5,0.5)	=[0.919431 - 0.988148]

Comparación de métricas

La mayor utilidad del cálculo del intervalo de confianza es la comparación de las métricas entre distintos modelos y así saber si los modelos realmente tienen las mismas métricas.

Para ello seguiremos la siguiente regla:

  • Dos modelos tienen la misma métrica si sus intervalos se solapan en algún punto
  • Dos modelos tienen distinta métrica si sus intervalos no se solapan en ningún punto

Veamos un ejemplo.

Supongamos que tenemos la sensibilidad de 5 modelos y queremos saber si realmente son iguales o no. Los intervalos de confianza de la sensibilidad de los 4 modelos son:

$$ \begin{array} \\ Modelo \; 1&=&[0.9678,0.9856] \\ Modelo \; 2&=&[0.9464,0.9789] \\ Modelo \; 3&=&[0.8567,0.9126] \\ Modelo \; 4&=&[0.7986,0.8934] \\ Modelo \; 5&=&[0.9245,0.9403] \\ \end{array} $$

Podemos comparar los valores pero es mejor mostrarlos en una gráfica para ayudarnos en el trabajo.

Se puede apreciar que:

  • Los modelos 1 y 2 son iguales
  • Los modelos 3 y 4 son iguales

Por lo que:

  • Los mejores modelos son el 1 y el 2
  • Después va el modelo 5
  • Y los 2 peores modelos son el 3 y el 4.

La siguiente función en Python crea un gráfico para poder comparar intervalos de confianza:

def plot_intervals(axes,intervalos,title,xlabel,ylabels):
    for index, (inferior, superior) in enumerate(intervalos):
        position=len(intervalos)-index-1
        media=((superior-inferior)/2)+inferior
        axes.plot([inferior, superior], [position, position], marker='|', markersize=10, linestyle='-', color='#003B80')
        axes.scatter(media, position, color='#003B80')        

    axes.set_yticks(np.arange(len(ylabels)))
    axes.set_yticklabels(ylabels[::-1])
    axes.set_xlabel(xlabel)
    axes.set_title(title)

    axes.set_facecolor("#F0F7FF")
    axes.grid(visible=True, which='major', axis='both',color="#FFFFFF",linewidth=1)

Y para crear la gráfica de nuestro ejemplo se llamaría así

figure=plt.figure()
axes = figure.add_subplot()

intervalos=[
    [0.9678,0.9856],
    [0.9464,0.9789],
    [0.8567,0.9126],
    [0.7986,0.8934],
    [0.9245,0.9403]
]
ylabels=['Modelo 1', 'Modelo 2', 'Modelo 3', 'Modelo 4', 'Modelo 5']

plot_intervals(axes,intervalos,"Comparación de modelos","Sensibilidad",ylabels)

Otra forma de hacer el gráfico es poner lineas en los extremos de los intervalos, que aunque se ve mejor, queda un gráfico muy recargado.

def plot_intervals(axes,intervalos,title,xlabel,ylabels):
    for index, (inferior, superior) in enumerate(intervalos):
        position=len(intervalos)-index-1
        media=((superior-inferior)/2)+inferior
        color=next(axes._get_lines.prop_cycler)['color']
        axes.plot([inferior, superior], [position, position], marker='|', markersize=10, linestyle='-', color=color)
        axes.scatter(media, position, color=color) 
        axes.plot([inferior, inferior], [0, len(intervalos)-1], linewidth=0.5, linestyle='dashed', color=color)   
        axes.plot([superior, superior], [0, len(intervalos)-1], linewidth=0.5, linestyle='dashed', color=color)
        
    axes.set_yticks(np.arange(len(ylabels)))
    axes.set_yticklabels(ylabels[::-1])
    axes.set_xlabel(xlabel)
    axes.set_title(title)

    axes.set_facecolor("#F0F7FF")
    axes.grid(visible=True, which='major', axis='both',color="#FFFFFF",linewidth=1)


Ejercicios

Ejercicio 1

Mirando el test de COVID de sars-cov-2_rapid_antigen_test_es.pdf. Usando la web Calcular límites de confianza para una proporción muestral calcula el intervalo de confianza de la especificidad y comprueba que coincide con el del prospecto.

Ejercicio 2

Mirando el test de COVID de sars-cov-2_rapid_antigen_test_es.pdf. Calcula en Python el intervalo de confianza de la especificidad y comprueba que coincide con el del prospecto.

Ejercicio 3

Crear 4 modelos distintos para el problema del cancer y para cada uno de ellos:

  • Calcula las métricas de sensibilidad y especificidad.
  • Calcula el intervalo de confianza de las métricas de sensibilidad y especificidad. ¿Que método se va a usar?

Tambien:

  • Muestra en una gráfica el intervalo de confianza de la métrica de sensibilidad de todos los modelos
  • Muestra en una gráfica el intervalo de confianza de la métrica de especificidad de todos los modelos

Ahora:

  • Indica según la sensibilidad el orden de los bueno que es cada modelo (de mejor a peor).
  • Indica según la especificidad el orden de los bueno que es cada modelo (de mejor a peor)
clase/iabd/pia/2eval/tema08.intervalo_confianza.txt · Última modificación: 2024/05/11 13:38 por admin