En este Google Colab He simulado datos de recuento binomial y he comparado el rendimiento de los modelos de verosimilitud binomial y de verosimilitud beta binomial. Ambos modelos tienen la misma Beta a priori en theta, el parámetro de tasa. Y de forma multinivel, sus parámetros alfa y beta tienen sus propias priorizaciones (cada una medio-normal.) Del mismo modo, muchos de estos mismos detalles se capturan en Discurso PyMC3 .
En ambos casos, la inferencia sobre el valor medio de theta se aproximó mucho a lo que especifiqué en las simulaciones. Sin embargo, me di cuenta de algo desconcertante. En el modelo binomial, las distribuciones posteriores inferidas eran inconsistentes. A saber, la expectativa de theta dados alfa y beta difería de la expectativa de theta $E[P(\theta|E[\alpha], E[\beta])] \neq E[P(\theta)]$ .
Gráficos posteriores de PyMC3:
Theta posterior dado alfa, beta:
Esto me desconcertó. Así que, para comparar, cambié la probabilidad binomial por una probabilidad binomial beta. La expectativa de theta es igual a la expectativa de theta dado alfa y beta $E[P(\theta|E[\alpha], E[\beta])] = E[P(\theta)]$ .
Gráficos posteriores de PyMC3:
Theta dado alfa,beta posterior:
A primera vista, esto parece intuitivo; alfa y beta no formaban parte de la función de verosimilitud binomial y, por tanto, no había ningún "paso de mensajes" de theta a alfa y beta. Por lo tanto, sus estimaciones posteriores no tienen sentido.
Pero cuanto más pensaba en ello, más me daba cuenta de que esto ponía en tela de juicio mi comprensión de los modelos multinivel. Pensaba que con un modelo multinivel se podía poner priors sobre priors e inferir la distribución de cada parámetro del modelo, no sólo de los parámetros a los que se hace referencia explícita en la función de verosimilitud. Ahora no estoy tan seguro...
Tal vez sea necesaria una función de verosimilitud personalizada para cada modelo multinivel con el fin de combatir las estimaciones de parámetros sin sentido (es decir, no se puede confiar en las priores multinivel para pasar eficazmente mensajes entre parámetros ).
¿O tal vez tomé algunas decisiones de diseño en mi simulación de datos que son matizadas y no ideales para el modelo de probabilidad Binomial?
Edición: Vale la pena señalar cómo se generan los gráficos "Posterior de Theta dado alfa y Beta". Algunos datos se captura a continuación, la función de python está por debajo:
def sample_post_plot(samples=100, trace_obj=trace1):
X = np.linspace(0,1,1000)
for i in range(samples):
idx = random.randint(0,len(trace_obj.get_values('alpha')))
a = trace_obj.get_values('alpha')[idx]
b = trace_obj.get_values('beta')[idx]
Y = stats.beta(a=a,b=b).pdf(X)
plt.plot(X,Y)
Algunas notas:
- trace_obj es un objeto devuelto por PyMC3 post-inferencia.
- El método
get_values('parameter')[idx]
devuelve el valor concreto que tomó el parámetro en un índice concreto de la cadena. - Muestreo uniformemente un índice (ubicación en la cadena) y lo utilizo para recuperar el $\alpha, \beta$ observados en ese índice de la cadena.
- Yo uso estos $\alpha, \beta$ en conjunción con scipy's
stats.beta(a,b).pdf(X)
para evaluar la probabilidad de cada $x_i$ en el intervalo [0,1]. - Repito esto iterativamente según el argumento
samples=100
. Así, muestro $P(\theta|\alpha,\beta)$ . - Observamos que, para el modelo de probabilidad Binomial, este gráfico es completamente diferente de la cadena posterior de PyMC3 sobre $\theta$ . Así que mi conclusión es que la deducción de PyMC3 $\alpha, \beta$ distribuciones no tienen sentido.