Es una buena pregunta. Voy a utilizar un ejemplo sencillo para ilustrar mi planteamiento.
Supongamos que estoy trabajando con alguien que necesita proporcionarme valores a priori sobre la media y la varianza de una verosimilitud gaussiana. Algo como
$$ y \sim \mathcal{N}(\mu, \sigma^2) $$
La pregunta es: "¿Cuáles son los antecedentes de esta persona sobre $\mu$ y $\sigma^2$ ?"
En el caso de la media, puedo preguntar: "Dígame cuál cree que puede ser el valor esperado". Puede que digan "entre 20 y 30". Soy libre de interpretarlo como quiera (tal vez como el IQR del valor a priori de la media). $\mu$ ).
Ahora, usaré R (o más probablemente Stan) para simular posibles escenarios con el fin de acotar aún más lo que es un prior realista. Así, por ejemplo, mi colega dice $\mu$ está entre 20 y 30. Ahora tengo que decidir sobre un prior para $\sigma$ . Así, puedo mostrarles lo siguiente y decirles "¿cuál de estos cuatro parece más realista y por qué?".
Podrían decir "la primera es demasiado variable, y las dos últimas son demasiado precisas". La segunda parece más realista, ¡pero está demasiado concentrada en 25!".
En este momento, volveré atrás y ajustaré las a priori para la media mientras me concentro en una a priori para la varianza.
Esto se denomina "comprobación predictiva a priori", es decir, muestreo a partir de la predicción a priori para asegurarse de que ésta refleja realmente el estado del conocimiento. El proceso puede ser lento, pero si sus colaboradores no tienen datos ni conocimientos estadísticos, ¿qué pueden esperar de usted? No se puede dar una prioridad plana a todos los parámetros.
Código Stan utilizado para generar muestras:
data{
real mu_mean;
real mu_sigma;
real sigma_alpha;
real sigma_beta;
}
generated quantities{
real mu = normal_rng(mu_mean, mu_sigma);
real sigma = gamma_rng(sigma_alpha, sigma_beta);
real y = normal_rng(mu, sigma);
}
Código R utilizado para generar las cifras
library(rstan)
library(tidyverse)
library(patchwork)
make_plot = function(x){
fit1 = sampling(scode, data = x, algorithm = 'Fixed_param', iter = 10000, chains =1 )
t1 = tibble(y = extract(fit1)$y)
p1 = t1 %>%
ggplot(aes(y))+
geom_histogram()+
xlim(0,50)
return(p1)
}
d1 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = 5, sigma_beta = 1)
d2 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = 3, sigma_beta = 1)
d3 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = 1, sigma_beta = 1)
d4 = list(mu_mean = 25, mu_sigma = 1, sigma_alpha = .1, sigma_beta = 2)
d = list(d1, d2, d3, d4)
y = map(d, make_plot)
reduce(y,`+`)