Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
clase:iabd:pia:2eval:tema08.intervalo_confianza [2024/05/18 16:37] admin [Ejercicios] |
clase:iabd:pia:2eval:tema08.intervalo_confianza [2025/03/03 11:45] (actual) admin [Ejercicios] |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
- | ====== 8. Optimización | + | ====== 8.e Intervalos |
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. | 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. | ||
Línea 74: | Línea 74: | ||
<sxh python> | <sxh python> | ||
- | import | + | from statsmodels.stats.proportion |
# Número de éxitos | # Número de éxitos | ||
Línea 85: | Línea 85: | ||
methods=[' | methods=[' | ||
for method in methods: | for method in methods: | ||
- | lower, upper = smp.proportion_confint(success, | + | lower, upper = proportion_confint(success, |
print(f" | print(f" | ||
Línea 106: | Línea 106: | ||
¿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: | ¿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** | * **Intervalo de confianza** | ||
- | * **Intervalo de credibilidad** | + | * **Intervalo de credibilidad** |
En el siguiente código se puede ver como da el mismo resultado usando '' | En el siguiente código se puede ver como da el mismo resultado usando '' | ||
Línea 134: | Línea 134: | ||
</ | </ | ||
+ | ¿Y cuando se podrían usar otros? El resto no son bayesianos así que dan " | ||
+ | * Clopper-Pearson o Jeffreys: Tamaño de muestra pequeño | ||
+ | * Wilson o Agresti-Coull: | ||
+ | * Normal (Wald): No es recomendable | ||
Línea 144: | Línea 148: | ||
* Dos modelos tienen la **misma** métrica si sus intervalos **se solapan** en algún punto | * 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 | * Dos modelos tienen **distinta** métrica si sus intervalos **no se solapan** en ningún punto | ||
+ | * En caso de **" | ||
Veamos un ejemplo. | Veamos un ejemplo. | ||
Línea 170: | Línea 175: | ||
Se puede apreciar que: | Se puede apreciar que: | ||
- | * Los modelos 1 y 2 son iguales | + | * Los modelos 1 y 2 son iguales |
- | * Los modelos 3 y 4 son iguales | + | * Los modelos 3 y 4 son iguales |
+ | |||
+ | Por lo que el orden de los modelos de mejor a peor es: **1, 2, 5, 3 y 4** | ||
- | 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: | La siguiente función en Python crea un gráfico para poder comparar intervalos de confianza: | ||
Línea 220: | Línea 223: | ||
<sxh python> | <sxh python> | ||
- | def plot_intervals(axes, | + | def plot_intervals_with_guides(axes, |
for index, (inferior, superior) in enumerate(intervalos): | for index, (inferior, superior) in enumerate(intervalos): | ||
position=len(intervalos)-index-1 | position=len(intervalos)-index-1 | ||
Línea 243: | Línea 246: | ||
{{: | {{: | ||
+ | ===== Comparación avanzada de métricas ===== | ||
+ | En caso de que los intervalos se solapen, no significa exactamente que tengan la misma métrica. Para saber si realmente la tienen es necesario restar las distribuciones y ver si el cero (o algo cercano al cero) está en dicha resta. | ||
+ | Para hacer los cálculos vamos a crear una serie de funciones en python. | ||
+ | |||
+ | <sxh python> | ||
+ | def get_hdi(sample, | ||
+ | """ | ||
+ | Calculation of 100(1-a)% HDI for sample | ||
+ | Chen-Shao HPD Estimation algorithm | ||
+ | http:// | ||
+ | """ | ||
+ | smpl = np.sort(sample) | ||
+ | n = len(smpl) | ||
+ | ckW = max(smpl) - min(smpl) | ||
+ | cki = 0 | ||
+ | RB = int(n * (hdi_prob)) | ||
+ | L0 = 0 | ||
+ | U0 = n-1 | ||
+ | while (RB + cki < n): | ||
+ | if smpl[RB + cki] - smpl[cki] < ckW: | ||
+ | ckW = smpl[RB + cki] - smpl[cki] | ||
+ | L0 = cki | ||
+ | U0 = RB + cki | ||
+ | cki += 1 | ||
+ | ckW = max(smpl) - min(smpl) | ||
+ | cki = 1 | ||
+ | LB = n - int(n * (hdi_prob)) | ||
+ | L1 = 0 | ||
+ | U1 = n-1 | ||
+ | while (LB - cki >= 0): | ||
+ | if smpl[n - cki] - smpl[LB - cki] < ckW: | ||
+ | ckW = smpl[n - cki] - smpl[LB - cki] | ||
+ | U1 = n - cki | ||
+ | L1 = LB - cki | ||
+ | cki += 1 | ||
+ | return [smpl[int((L1+L0)/ | ||
+ | |||
+ | |||
+ | |||
+ | def get_interval(success, | ||
+ | beta_a=0.5+success | ||
+ | beta_b=0.5+total-success | ||
+ | actual_beta=beta(beta_a, | ||
+ | hdi=get_hdi(actual_beta.rvs(100000), | ||
+ | return hdi | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | def get_hdi_compare(success1, | ||
+ | beta_a1=0.5+success1 | ||
+ | beta_b1=0.5+total1-success1 | ||
+ | beta1=beta(beta_a1, | ||
+ | beta_a2=0.5+success2 | ||
+ | beta_b2=0.5+total1-success2 | ||
+ | beta2=beta(beta_a2, | ||
+ | |||
+ | n_samples = 100000 | ||
+ | datos1=beta1.rvs(n_samples) | ||
+ | datos2=beta2.rvs(n_samples) | ||
+ | |||
+ | resultado=datos1-datos2 | ||
+ | | ||
+ | lower, | ||
+ | |||
+ | return [lower, | ||
+ | </ | ||
+ | |||
+ | Lo primero es que hemos creado la función '' | ||
+ | |||
+ | <sxh python> | ||
+ | TP1=131 | ||
+ | FN1=16 | ||
+ | |||
+ | TP2=124 | ||
+ | FN2=23 | ||
+ | |||
+ | |||
+ | interval1=get_interval(TP1, | ||
+ | interval2=get_interval(TP2, | ||
+ | |||
+ | |||
+ | figure=plt.figure(figsize=(5.5, | ||
+ | axes = figure.add_subplot() | ||
+ | |||
+ | intervalos=[ | ||
+ | interval1, | ||
+ | interval2 | ||
+ | ] | ||
+ | ylabels=[' | ||
+ | |||
+ | plot_intervals(axes, | ||
+ | </ | ||
+ | |||
+ | La gráfica resultante es: | ||
+ | {{: | ||
+ | |||
+ | |||
+ | Y para saber si realmente tienen la misma métrica simplemente ejecutamos el siguiente código: | ||
+ | <sxh python> | ||
+ | print(get_hdi_compare(TP1, | ||
+ | </ | ||
+ | Y el resultado es: | ||
+ | <sxh base> | ||
+ | [-0.029769860656823077, | ||
+ | </ | ||
+ | |||
+ | **Si el intervalo incluye al cero es que tienen la misma métrica.** Y en el ejemplo como el intervalo contiene el cero es que tienen la misma métrica. | ||
+ | |||
+ | Veamos ahora otro ejemplo: | ||
+ | <sxh python> | ||
+ | TP1=131 | ||
+ | FN1=16 | ||
+ | |||
+ | TP2=116 | ||
+ | FN2=31 | ||
+ | |||
+ | |||
+ | interval1=get_interval(TP1, | ||
+ | interval2=get_interval(TP2, | ||
+ | |||
+ | |||
+ | figure=plt.figure(figsize=(5.5, | ||
+ | axes = figure.add_subplot() | ||
+ | |||
+ | intervalos=[ | ||
+ | interval1, | ||
+ | interval2 | ||
+ | ] | ||
+ | ylabels=[' | ||
+ | |||
+ | plot_intervals_with_guides(axes, | ||
+ | </ | ||
+ | {{: | ||
+ | |||
+ | <sxh python> | ||
+ | print(get_hdi_compare(TP1, | ||
+ | </ | ||
+ | |||
+ | <sxh base> | ||
+ | [0.018992455698845223, | ||
+ | </ | ||
+ | |||
+ | Por lo que en este caso se solapan pero no tiene la misma métrica. | ||
+ | |||
+ | De todas en este caso, el intervalo está rozando el cero, hay un concepto llamado [[https:// | ||
+ | |||
+ | Mas información: | ||
+ | * {{ : | ||
+ | * {{ : | ||
+ | * {{ : | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
===== Ejercicios ===== | ===== Ejercicios ===== | ||
Línea 254: | Línea 411: | ||
==== Ejercicio 3 ==== | ==== Ejercicio 3 ==== | ||
- | Crear 4 modelos distintos para el problema del cancer y para cada uno de ellos: | + | Crear 5 modelos distintos para el problema del cancer y para cada uno de ellos: |
* Calcula las métricas de sensibilidad y especificidad. | * 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? | * Calcula el intervalo de confianza de las métricas de sensibilidad y especificidad. ¿Que método se va a usar? | ||
Línea 265: | Línea 422: | ||
* Indica según la sensibilidad el orden de los bueno que es cada modelo (de mejor a peor). | * 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) | * Indica según la especificidad el orden de los bueno que es cada modelo (de mejor a peor) | ||
+ | * ¿Que modelo elegirías? | ||
+ | |||
+ | {{: | ||
+ | |||
==== Ejercicio 4 ==== | ==== Ejercicio 4 ==== | ||
- | Elige alguno | + | Elige el mejor de los 5 modelos anteriores y muestra ahora una gráfica, en la que se mostrará: |
* El valor de la sensibilidad y la especificidad según el valor del umbral. La gráfica tendrá un aspecto simular a la siguiente: | * El valor de la sensibilidad y la especificidad según el valor del umbral. La gráfica tendrá un aspecto simular a la siguiente: | ||
Línea 281: | Línea 442: | ||
¿Que umbral elegirías? | ¿Que umbral elegirías? | ||
- | <note tip> | + | <note tip> |
- | '' | + | '' |