From 70d32a7693d83e69b3aa479f845ffdac4de39048 Mon Sep 17 00:00:00 2001 From: Felipe Gonzalez Date: Tue, 16 Jan 2024 22:02:13 -0600 Subject: [PATCH] =?UTF-8?q?Agregar=20m=C3=A1s=20de=20chequeos=20a=20priori?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notas/02-flujo-basico.qmd | 142 +++++++++++++++++++++++++++++++++++++- 1 file changed, 139 insertions(+), 3 deletions(-) diff --git a/notas/02-flujo-basico.qmd b/notas/02-flujo-basico.qmd index 4088df0..d3226b6 100644 --- a/notas/02-flujo-basico.qmd +++ b/notas/02-flujo-basico.qmd @@ -193,7 +193,7 @@ independientes): $$\theta(1-\theta)(1-\theta)\theta(1-\theta) = \theta^2(1-\theta)^3$$ Para algunos valores de $\theta$ (posibles conjeturas acerca del valor de $\theta$) podemos -escribir una tabla como sigue (Nota: discretizamos por el momento a un número finito de valores de $p$ +escribir una tabla como sigue (Nota: discretizamos por el momento a un número finito de valores de $\theta$ para hacer el argumento más simple): @@ -234,8 +234,8 @@ Por el momento, podríamos poner $p(\theta)$ constante, de manera que es parte de la constante de normalización, y sólo tendríamos que normalizar como sigue: ```{r} -p <- seq(0, 1, length.out = 11) -prob_post <- tibble(conjetura = p, probablidad = p^2 * (1 - p)^3) |> +theta <- seq(0, 1, length.out = 11) +prob_post <- tibble(conjetura = theta, probablidad = theta^2 * (1 - theta)^3) |> mutate(prob_posterior = probablidad / sum(probablidad)) prob_post |> kable(col.names = c("Conjetura θ", "p(D|θ)","p(θ|D)")) |> @@ -349,6 +349,70 @@ calcular_posterior(rep(1, 50)) |> round(3) calcular_posterior(c(rep(0, 100), rep(1, 100))) |> round(3) ``` +### Más verificaciones a priori {-} + +Otra verificación útil que podemos hacer es, una vez que hemos definido +nuestro modelo generativo y un modelos estadístico asociado, generar +bajo simulación datos que podríamos observar. Esto tiene como fin verificar +que nuestro modelo generativo y nuestro modelo estadístico producen +datos que están de acuerdo con el conocimiento experto (teoría científica o +conocimiento de negocio). + +Así que simulamos datos del modelo: + +```{r} +set.seed(231) +simulacion_datos_tbl <- map_df(1:500, + function(rep){ + # simular valor inicial + theta_sim <- sample(seq(0, 1, length.out = 11), + prob = prob_priori$prob_priori, size = 1) + datos_sim <- sim_pos_neg(theta = theta_sim, N = 30) + tibble(rep = rep, theta_sim = theta_sim, datos_sim) + }) +``` + +Podemos ver por ejemplo dónde esperamos ver el número de positivos +a lo largo de distintas muestras, cuando $N=30$: + +```{r} +simulacion_datos_tbl |> + group_by(rep, theta_sim) |> + summarise(Npos = sum(Pos)) |> + ggplot(aes(x = Npos)) + + geom_bar() + + labs(x = "Número de positivos", y = "Frecuencia (muestras)") +``` + +Observamos que con nuestros supuestos, hay una probabilidad alta de +observar 0 positivos (alrededor de 0.30). Esto se debe en parte a la +discretización que hicimos, y que nuestra apriori pone peso considerable +en prevalencia igual a cero, lo que quizá no es muy realista, y probablemente +deberíamos escoger al menos una discretización más fina. + +También, si consideramos los supuestos como correctos, esto puede indicar +el riesgo de usar una muestra chica para estimar prevalencia si esta es +muy baja: es probable que obtengamos 0 observaciones positivas. + + +::: callout-note +# Verificación predictiva a priori + +Con este tipo de verificaciones podemos detectar las consecuencias de +nuestros supuestos (incluyendo la elección de distribuciones a prior), así +como otras decisiones de modelado (como la discretización). + +Conflictos con el conocimiento del área deben ser explorados para entenderlos +y si es necesario corregir nuestros supuestos. + +::: + +Este tipo de verificaciones es muy flexible, y debe adaptarse a los aspectos +del conocimiento del área que son importantes para los expertos. Podemos usar +todos nuestros recursos analíticos (tablas, resúmenes, gráficas) para producir +estos chequeos. + + ## Paso 4: Probar el proceso de estimación Antes de utilizar datos, verificamos cómo se comporta nuestro proceso de estimación @@ -714,6 +778,74 @@ ya implementadas) esos resúmenes de interés que podamos llevar muy lejos. +### Más de verificaciones apriori {-} + +Antes de continuar, sin embargo, veremos cómo se veo el chequeo predictivo +a priori que consideramos en la sección de arriba. + +```{r} +set.seed(231) +simulacion_datos_tbl <- map_df(1:500, + function(rep){ + # apriori seleccionada + theta_sim <- rbeta(1, 1, 3) + datos_sim <- sim_pos_neg(theta = theta_sim, N = 30) + tibble(rep = rep, theta_sim = theta_sim, datos_sim) + }) +``` + +Podemos ver por ejemplo dónde esperamos ver el número de positivos +a lo largo de distintas muestras, cuando $N=30$: + +```{r} +simulacion_datos_tbl |> + group_by(rep, theta_sim) |> + summarise(Npos = sum(Pos)) |> + ggplot(aes(x = Npos)) + + geom_bar() + + labs(x = "Número de positivos", y = "Frecuencia (muestras)") +``` + +Este resultado es consecuencia de nuestros supuestos, antes de ver los datos, +y resume que esperamos con mayor probabilidad un número bajo de positivos +(en una muestra de N=30), +y que es muy poco probable que observemos prevalencias muy altas. Dependiendo +de la situación, este puede ser un resultado aceptable. + +Un resultado no aceptable para una enfermedad que sabemos que es relativamente +rara (aunque tenemos incertidumbre), por ejemplo, podría ser el siguiente: + +```{r} +set.seed(231) +simulacion_datos_tbl <- map_df(1:500, + function(rep){ + # apriori seleccionada + theta_sim <- rbeta(1, 30, 3) + datos_sim <- sim_pos_neg(theta = theta_sim, N = 30) + tibble(rep = rep, theta_sim = theta_sim, datos_sim) + }) +simulacion_datos_tbl |> + group_by(rep, theta_sim) |> + summarise(Npos = sum(Pos)) |> + ggplot(aes(x = Npos)) + + geom_bar() + + labs(x = "Número de positivos", y = "Frecuencia (muestras)") +``` + +Este resultado no es aceptable cuando sabemos que es prácticamente imposible +que la mayoría de la población está infectada. Debemos entonces +regresar y ajustar nuestros supuestos: el problema en este caso es la elección +de la distribución a priori para $\theta$. + +**Observación**: la crítica es sobre el conjunto completo de supuestos +iniciales que hacemos acerca del problema. Cuando los diagnósticos no son +aceptables desde el punto de vista teórico es necesario investigar dónde +está el problema. Las distribuciones apriori que usamos, igual que cualquier +supuesto, **están sujetas a esta crítica**. Nótese que esta crítica la estamos +haciendo sin ver los datos que esperamos observar: es una crítica de supuestos. + + + ### Métodos Monte Carlo @@ -857,4 +989,8 @@ la inferencia (verificación apriori) es correcta bajo nuestros supuestos. arriba están resueltos, para tener confianza en nuestras conclusiones. +## Ventajas y desventajas de métodos bayesianos + + +