49 votos

¿Como muestra de una distribución normal con media conocida y varianza usando un lenguaje de programación convencional?

Nunca he tenido un curso de estadística, así que espero que le estoy preguntando en el lugar correcto aquí.

Supongamos que tengo sólo dos datos que describen una distribución normal: la media de $\mu$ y la varianza $\sigma^2$. Quiero usar un equipo al azar de la muestra a partir de esta distribución, que yo respeto a estas dos estadísticas.

Es bastante obvio que puedo manejar el significa simplemente la normalización de alrededor de 0: simplemente añada $\mu$ a cada una de las muestras antes de la salida de la muestra. Pero no veo cómo generar mediante programación las muestras de respeto a $\sigma^2$.

Mi será un programa en un lenguaje de programación convencional; no tengo acceso a ninguna de paquetes estadísticos.

48voto

Nathan Long Puntos 30303

Si usted puede degustar de una distribución con media 0 y varianza 1, entonces usted puede probar fácilmente a partir de una escala de ubicación de la transformación de la distribución, que tiene una media $\mu$ y la varianza $\sigma^2$. Si $x$ se muestra un ejemplo de una media 0 y varianza 1 distribución de $$\sigma x + \mu$$ es una muestra con una media de $\mu$ y la varianza $\sigma^2$. Así que, todo lo que tienes que hacer es ajustar la escala de la variable por la desviación estándar $\sigma$ (raíz cuadrada de la varianza) antes de la adición de la media de $\mu$.

Cómo usted consigue realmente una simulación de una distribución normal con media 0 y varianza 1 es una historia diferente. Es muy divertido y interesante saber cómo implementar este tipo de cosas, pero si utilizar un paquete estadístico o lenguaje de programación o no, yo le recomendaría que obtenga y utilice una función adecuada o biblioteca para la generación de números aleatorios. Si desea asesoramiento sobre lo de la biblioteca para el uso que usted podría desear agregar información específica sobre qué lenguaje de programación(s) que usted está utilizando.

Edit: a la luz de los comentarios, algunas otras respuestas y el hecho de que Fixee aceptado esta respuesta, voy a dar algunos detalles más sobre cómo puede transformaciones en el uso del uniforme de variables para producir normal de las variables.

  • Uno de los métodos, ya mencionado en un comentario por VitalStatistix, es el de Box-Muller método que toma dos independientes uniforme de variables aleatorias y produce dos independientes normal de las variables aleatorias. Un método similar que evita el cálculo de dos funciones trascendentes pecado y cos a costa de un poco más de simulaciones fue publicado como una respuesta por francogrex.
  • Un completo método general es la transformación de una variable aleatoria uniforme por la inversa de la función de distribución. Si $U$ es distribuido uniformemente en $[0,1]$ $$\Phi^{-1}(U)$$ tiene una distribución normal estándar. Aunque explícitamente no hay fórmula analítica para $\Phi^{-1}$, se puede calcular precisa de aproximaciones numéricas. La implementación actual en R (última vez que lo comprobé) utiliza esta idea. El método es conceptualmente muy simple, pero requiere una exacta aplicación de la $\Phi^{-1}$, que probablemente no es tan generalizada como la que (otros) trascendental funciones de registro, el pecado y cos.
  • Varias respuestas a mencionar la posibilidad de utilizar el teorema central del límite a la aproximación de la distribución normal, como un promedio de uniforme de variables aleatorias. Esto generalmente no es recomendado. Los argumentos presentados, tales como la coincidencia de la media 0 y varianza 1, y las consideraciones de apoyo de la distribución no son convincentes. En el Ejercicio 2.3 en "la Introducción de Métodos de Monte Carlo con R" por Christian P. Robert y George Casella este generador se llama anticuado y la aproximación se llama muy baja.
  • Hay un gran número de otras ideas. En el capítulo 3 y, en particular, en la Sección 3.4, en "The Art of Computer Programming" Vol. 2 por Donald E. Knuth es un clásico de referencia en la generación de números aleatorios. Brian Ripley escribió Equipo de Generación de Variables Aleatorias: Un Tutorial, que pueden ser útiles. El libro mencionado por Robert y Casella, o tal vez el Capítulo 2 en su otro libro, "Monte Carlo métodos estadísticos", es también recomendable.

Al final del día, una implementado correctamente el método no es mejor que el uniforme pseudo generador de números aleatorios utilizado. Personalmente, yo prefiero confiar en especial a propósito de las bibliotecas que creo que son dignos de confianza. Yo casi siempre se basan en los métodos implementados en R, ya sea directamente en R o a través de la API en C/C++. Obviamente, esta no es una solución para todo el mundo, pero no estoy lo suficientemente familiarizado con otras bibliotecas para recomendar alternativas.

20voto

Dilip Sarwate Puntos 16161

Esto es realmente un comentario sobre Michael Lew respuesta y Fixee el comentario, pero se contabiliza como una respuesta porque no tengo la reputación en este sitio para comentar.

La suma de doce independiente de variables aleatorias uniformemente distribuidas en $[0, 1]$ es decir $6$ y la varianza $1$. En otras palabras, $$E\left [\sum_{i=1}^{12} X_i\right ] = \sum_{i=1}^{12} E[X_i] = 12\times \frac{1}{2} = 6$$ y $$\text{var} \left [\sum_{i=1}^{12} X_i\right ] = \sum_{i=1}^{12} \text{var}[X_i] = 12\times \frac{1}{12} = 1.$$ La CT puede entonces ser utilizado para afirmar que la distribución de $\sum_{i=1}^{12} X_i - 6$ es aproximadamente una distribución normal estándar. En comparación con los diez variables consideradas por Michael Lew y Fixee, dos llamadas adicionales para el generador de números aleatorios son necesarios, pero podemos evitar la división por $\sqrt{10/12}$ para obtener la deseada unidad de la varianza. Es también vale la pena recordar que $\sum_{i=1}^{12} X_i - 6$ puede tomar los valores sólo en el rango de $[-6, 6]$ y por lo tanto extremas (muy baja probabilidad) valores diferentes de la media por más de $6$ desviaciones estándar nunca ocurrir. Esto es a menudo un problema en las simulaciones de ordenador y sistemas de comunicación donde tal, muy baja probabilidad de eventos son de gran interés.

11voto

Utilizando el generador de números aleatorios de su lenguaje de programación, intente esto:

  1. Obtener el pdf de la normal de dist. con la media y la varianza. Escribir como una función de p(x). Ejemplo -

x = f(p(x))

  1. Elegir un número aleatorio entre 0 y 1. Dicen que esta es la p. ¿Cuál es el valor de x p(x)=p.(Usted puede alimentar a la ecuación). Ahora tiene x. Sabes que x tiene p% de probabilidades de quedar seleccionado.

  2. Elegir otro número aleatorio r entre 0 y 1. Si r < p, a continuación, elija x o bien ignorarlo.

  3. Sigo recorrer hasta obtener el número deseado de números.

9voto

Auron Puntos 2123

La distribución normal surge cuando uno añade una gran cantidad de valores aleatorios de distribución similar (similar a cada uno de los otros, quiero decir). Si se suman los diez o más uniformemente distribuidos valores aleatorios, entonces la suma es casi normalmente distribuida. (Agregar más de diez si quieres que sea aún más normal, pero diez es suficiente para casi todos los propósitos.)

Dicen que su uniforme de valores aleatorios uniformemente distribuidos entre 0 y 1. La suma será entre 0 y 10. Restar 5 a partir de la suma y la media de la distribución resultante será 0. Ahora usted tiene que dividir el resultado por la desviación estándar de la (cerca de) la distribución normal y multiplicar el resultado por el que desee desviación estándar. Por desgracia no estoy seguro de cuál es la desviación estándar de la suma de diez aleatorio uniforme se desvía, pero si tenemos la suerte de que alguien nos diga en un comentario!

Yo prefiero hablar con los estudiantes acerca de la distribución normal en estos términos porque la utilidad de la suposición de una distribución normal en muchos sistemas proviene enteramente de la propiedad de que la suma de muchas azar influye conduce a una distribución normal.

6voto

Maximus Puntos 141

Además de la respuesta por NRH, si usted todavía no disponen de los medios para generar muestras aleatorias a partir de una "distribución normal estándar N(0,1), a continuación es una buena y sencilla manera (ya que usted menciona que no tiene un paquete estadístico, las siguientes funciones deben estar disponibles en la mayoría de los lenguajes de programación estándares).

1. Generar u y v como dos números aleatorios uniformemente distribuidos en el intervalo de -1 a 1 por
u = 2 r1 - 1 y v = 2 r2 - 1

2.calcular el w = u^2 + v^2 si w > 1 el volver a 1

3.devolver u*z y y= v*z con z= sqrt(-2ln(w)/w) Un ejemplo de código sería este:

u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
    z = sqrt((-2 * log(w)) / w);
    x = u * z;
    y = v * z;
    }

a continuación, utilice lo de la FCM ha sugerido anteriormente para obtener el azar se desvía de N(mu, sigma^2).

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