martes, 11 de febrero de 2025

La transformada de Box-Muller con R

La transformada de Box-Muller es un método de generación de pares de números aleatorios independientes con distribución normal de media nula y varianza 1, a partir de pares de números aleatorios con distribución uniforme. La transformación consiste en mapear pares de coordenadas (U1,U2) pertenecientes al cuadrado unidad definido por (0,0) y (1,1), sobre puntos (Z0,Z1) cuyo dominio se extiende a cualquier punto del plano.

Las ecuaciones que definen esta transformación son las siguientes:

Fuente: Wikipedia


Construimos una función rnorm.boxmuller() en R que, aceptando como argumento una matriz de dos columnas, devuelve otra matriz del mismo tamaño con los valores transformados correspondientes a los originales.

Así pasando a la función una matriz de números aleatorios con distribución uniforme tendremos de vuelta una matriz de números aleatorios con distribución normal. Se muestran los scatter plots de la matriz original (distrib. uniforme) y de la matriz resultante (distrib. normal):



Al margen de la visualización geométrica el objetivo de la transformación es obtener una distribución normal a partir de la uniforme, lo cual podemos constatar en los histogramas de cada serie:


~~~

Podemos hacernos una idea gráfica de cómo opera la transformación en el espacio 2D solapando trazos origen/destino con cierta transparencia. Los "flecos" que saliendo del cuadrado unidad parecen curvarse a modo de plumero son en realidad una ilusión óptica fruto de sumar miles de pequeños tramos rectos:


Aumentamos a 400.000 el número de pares numéricos a ser transformados, y acumulamos los trazos de los mismos sobre una matriz que guardamos como imagen de 16 bits. Surgen claramente no sólo el cuadrado unidad de la distribución uniforme, sino también curiosos patrones allí donde la transformación genera mayor densidad de paso. Se ha añadido color en Photoshop (recomendable hacer clic para ver en todo su esplendor):


Repositorio con el código R: GitHub.

No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.