1 votos

Transformar números estándar de distribución normal en una distribución normal arbitraria

Necesito un generador de números aleatorios con una distribución normal, con media y desviación estándar parametrizables. Sólo tengo un generador de números aleatorios de distribución uniforme. Aplicando una transformación de Box-Muller a dos números uniformemente distribuidos en [0,1), obtengo una distribución normal estándar. Sin embargo, me he confundido sobre cómo obtener una distribución normal arbitraria y parametrizada mediante este procedimiento.

Dado que se puede utilizar una transformación z para cambiar una distribución normal no estándar en una estándar, pensé que podría simplemente utilizar la inversa de una transformación z, y pasar el resultado de los números uniformemente distribuidos transformados por Box-Muller a $(x \times \sigma) + \mu$ , donde $\sigma$ es la desviación estándar deseada y $\mu$ es la media deseada. Me he convencido de que esto es un error. Mi simulación, usando el RNG transformado no se comportó correctamente (puedo compararlo con un RNG bien probado de distribución normal), y un gráfico de la distribución transformada no parece en absoluto correcto.

Creo que lo que necesito es hacer algo con la media y la desviación estándar dentro de el código Box-Muller, en lugar de procesar su valor de retorno de forma sencilla. Sin embargo, estoy confundido acerca de cómo hacer esto.

En caso de que sea útil, aquí está mi código Box-Muller. (Está en el NetLogo lenguaje, que puede no ser familiar, pero creo que este código de bits será inteligible para cualquier persona con experiencia en programación).

to-report box-muller-random-normal [mn stddev]
  if-else box-muller-cache-exists = 0 [  ; using 1 for true and 0 for false means we don't have to initialize to false in setup; just use default zero init value
    ; cache is unfilled, so compute new pair of values
    let x1 random-float 1
    let x2 random-float 1
    let y1 sqrt (-2 * ln x1) * cos (2 * pi * x2)
    let y2 sqrt (-2 * ln x1) * sin (2 * pi * x2)
    set box-muller-cache y2
    set box-muller-cache-exists 1
    report y1
  ][
    set box-muller-cache-exists 0    ; so cache will be refilled next time
    report box-muller-cache
  ]
end

¿Dónde debo insertar las transformaciones que implican la media y la desviación estándar? ( to-report es el comando de definición de funciones de NetLogo. El código que utiliza ...cache... está diseñado para recordar uno de los valores entre invocaciones, generando nuevos números sólo si no hay ningún valor recordado).

7voto

Dilip Sarwate Puntos 16161

Si $X \sim N(0,1)$ entonces $Y = \sigma X + \mu \sim N(\mu,\sigma^2)$ . Así que, deja el RNG y el Box-Muller en paz, y cuando obtengas el generada, simplemente multiplique por $\sigma$ y añadir $\mu$ . Podrías pegar estos dentro del código de Box-Muller si realmente quieres un código sencillo modificando modificando

let y1 sqrt (2 - ln x1) * cos (2 * pi * x2)

a

let y1 sigma * sqrt (-2 * ln x1) * cos (2 * pi * x2) + mu

y de forma similar para y2 .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X