Mcmc

¿Cuántas iteraciones necesita mi MCMC?

Es el tema de este reciente artículo de Gelman. Cabe esperar que algunos se sientan decepcionados porque no tenga solo una página en la que se lea algo así como: usa cuatro cadenas de 4000 iteraciones, 1000 de ellas de warmup. Lo siento: son 26 páginas y sin recetas copy-paste.

Tampoco puedo añadir nada de sustancia a lo que ahí se cuenta. Me voy a limitar a subrayar una idea e ilustrarla con un caso con el que me enfrenté hace unos años.

¿Qué nos enseña la historia de los granos de trigo sobre el muestreo de las posterioris?

No hace falta que cuente aquella historia del tablero de ajedrez, los granos de trigo, etc. ¿verdad? (Desavisados: leed esto.) La entrada de hoy se ocupa de un problema dual: el número de granos de trigo será fijo, pero hay que repartirlo en un número explosivamente creciente de casillas.

Imagina ahora que quieres ajustar un modelo bayesiano usando MCMC. Imagina que tienes 1, 2, 3,… variables. Imagina el espacio de dimensión $n$ definido por dichas variables. El número de cuadrantes es $2^n$.

¿Dónde son más frecuentes las muestras de una distribución en dimensiones altas?

Esta es una cosa bastante contraintituiva. Uno diría que en la moda, pero no es exactamente así.

Veamos qué pasa con la distribución normal conforme aumenta la dimensión.

En una dimensión son más frecuentes los valores próximos al centro:

hist(abs(rnorm(10000)), breaks = 100,
    main = "distribución de la distancia al centro")

Pero en dimensiones más altas (p.e., 10), la cosa cambia:

library(mvtnorm)
muestra <- rmvnorm(10000, rep(0, 10),
    diag(rep(1, 10)))
distancias <- apply(muestra, 1,
    function(x) sqrt(sum(x^2)))
hist(distancias, breaks = 100,
     main = "distribución de la distancia al centro")

Optimización estocástica

R

Una de los proyectos en los que estoy trabajando últimamente está relacionado con un problema de optimización no lineal: tengo un modelo (o una familia de modelos) no lineales con una serie de parámetros, unos datos y se trata de lo que no mercería más explicación: encontrar los que minimizan cierta función de error.

Tengo implementadas dos vías:

  • La nls, que usa un optimizador numérico genérico para encontrar esos mínimos. (Nótese que uso nls y no nls porque esa función me queda muy corta).
  • La stan, donde especifico el modelo, introduzco una serie de prioris más o menos informativas según lo que sepa de mi problema y estimo la distribución a posteriori de mis parámetros.

Ambas tienen sus ventajas y desventajas. La una es rápida y la otra no; la una me da poca información sobre los parámetros y la otra, mucha; una me permite introducir mucha información a priori y la otra casi nada, etc.

Sr. Python, muchas gracias por su candidatura; ya le llamaremos cuando... tenga modelos mixtos

Era casi todavía el siglo XX cuando yo, desesperado por hacer cosas que consideraba normales y que SAS no me permitía, pregunté a un profesor por algo como C pero para estadística. Y el profesor me contó que conocía a alguien que conocía a alguien que conocía a alguien que usaba una cosa nueva que se llamaba R y que podía servirme.

Fue amor a primera vista, pero esa es otra historia. La relevante aquí es que volví a hablar con aquel profesor para agradecerle el consejo y, de paso, le pregunté que por qué no lo usaba él. Me contestó que porque en R no había modelos mixtos (aunque nlme es anterior, del 99; ¡a saber en qué estado se encontraba entonces!).

ABC

ABC significa, entre otras cosas, approximate bayesian computation. Por lo que parece, consiste en calcular $latex P(\theta ,|, \text{datos})$ por el tradicional y directo método del rechazo. Es decir:

  • Planteas un modelo generativo, con sus prioris y todo.
  • Simulas casos, casos y casos.
  • Te quedas con los que cumplen un criterio de aceptación.

La distribución empírica de los parámetros en el subconjunto de los casos aceptados representa, en los libros está escrito, la distribución a posteriori. Sin MCMC ni historias.

Hamilton al rescate de Metropolis-Hastings

El algoritmo de Metropolis-Hastings se usa para muestrear una variable aleatoria con función de densidad $latex p$. Permite crear una sucesión de puntos $latex x_i$ que se distribuye según $latex p$.

Funciona de al siguiente manera: a partir de un punto $latex x_i$ se buscan candidatos a $latex x_{i+1}$ de la forma $latex x_i + \epsilon$, donde $latex \epsilon$ es, muy habitualmente, $latex N(0, \delta)$ y $latex \delta$ es pequeño. De otra manera, puntos próximos a $latex x_i$. Un candidato se acepta (y se convierte en $latex x_{i+1}$) o se rechaza (y toca probar con otro) según los valores de $latex p(x_i)$ y $latex p(x_i + \epsilon)$:

Metropolis-Hastings en Scala

Tengo la sensación de que un lenguaje funcional (como Scala) está particularmente bien adaptado al tipo de operaciones que exige MCMC.

Juzguen Vds.

Primero, genero datos en R:

datos <- rnorm(500, 0.7, 1)
writeLines(as.character(datos), "/tmp/datos.txt")

Son de una normal con media 0.7. En el modelo que vamos a crear, suponemos conocida (e igual a 1) la varianza de la normal y trataremos de estimar la media suponiéndole una distribución a priori normal estándar. Y con Scala, así: