2010-08-25 32 views
7

Me gustaría generar una secuencia aleatoria compuesta de 3000 puntos, que sigue la distribución normal. La media es c y la desviación estándar es d. Pero me gustaría que estos 3000 puntos se encuentren en el rango de [a, b].generar secuencia aleatoria y trazar en R

¿Puede decirme cómo hacerlo en R?

Si quisiera trazar esta secuencia, si el eje Y usa los 3000 puntos generados, entonces ¿cómo debería generar los puntos correspondientes al eje X.?

Respuesta

5

Usted puede hacer esto usando funciones R estándar como esta:

c <- 1 
d <- 2 

a <- -2 
b <- 3.5 

ll <- pnorm(a, c, d) 
ul <- pnorm(b, c, d) 

x <- qnorm(runif(3000, ll, ul), c, d) 
hist(x) 
range(x) 
mean(x) 
sd(x) 
plot(x, type='l') 

La función pnorm se utiliza para encontrar los límites que se utilizan para la distribución uniforme, los datos se generan a partir de un uniforme y luego se transforman a la normalidad.

Esto es aún más simple utilizando el paquete Distr:

library(distr) 

N <- Norm(c,d) 
N2 <- Truncate(N, lower=a, upper=b) 

plot(N2) 
x <- r(N2)(3000) 
hist(x) 
range(x) 
mean(x) 
sd(x) 
plot(x, type='l') 

Nótese que en ambos casos la media no es C y la SD no es d. Si desea que la media y la sd de los datos truncados resultantes sean cyd, entonces necesita que la distribución principal (antes de truncar) tenga valores diferentes (una sd más alta, la media depende de los valores truncados), encontrar esos valores sería una buen problema de tarea para un curso de teoría matemática/estadística. Si eso es lo que realmente necesita, agregue un comentario o edite la pregunta para decirlo específicamente.

Si desea generar los datos de la normal no truncada, pero sólo representar los datos dentro del rango [a, b] entonces sólo tiene que utilizar el argumento ylim para trazar:

plot(rnorm(3000, c, d), ylim=c(a,b)) 
3

generar una secuencia aleatoria de números de cualquier distribución de probabilidad es muy fácil en R. Para hacer esto para la distribución normal específicamente

c = 1 
d = 2 
x <- rnorm(3000, c, d) 

Clipping los valores en x para que sean sólo dentro de un rango dado es una cosa extraña de querer hacer con una muestra de la distribución normal. Tal vez lo que realmente quieres hacer es muestrear una distribución uniforme.

a = 0 
b = 3 
x2 <- runif(3000, a, b) 

En cuanto a la forma en la trama de la distribución, no estoy seguro de entender su pregunta. Puede representar una estimación de la densidad de la muestra con el código

plot(density(x)) 

Pero, si se desea trazar estos datos como un gráfico de dispersión de algún tipo, que realmente necesita para generar una segunda muestra de números.

0
a = -2; b = 3 
plot(dnorm, xlim = c(a, b)) 
+0

Esto no hace lo que el OP pedido. Quiere 3000 puntos siguiendo la distribución normal, por lo que 'rnorm' es el camino a seguir – nico

+0

es una pregunta mal formada ... Adiviné. Si en realidad estaba trazando los valores aleatorios en el eje y, como parte de ello sugiere, ¿qué diablos es la solicitud de límite del eje x? No tiene sentido. Mi suposición es que los valores aleatorios se solicitan para generar una función de densidad como hicieron @joFrhwld y @Joris Mays. Esta es la forma correcta de generar una función de densidad. – John

1

Si Me gustaría trazar esta secuencia, si el eje Y utiliza los 3000 puntos generados, entonces cómo debería generar los puntos correspondientes a X-eje.

Si acaba de generar sus puntos, como JoFrhwld dijo con

y <- rnorm(3000, 1, 2) 

Entonces

plot(y) 

trazará automáticamente utilizando los índices de matriz como eje x

Cuestiones relacionadas