2012-05-07 38 views
12

estoy usando el siguiente código para crear una distribución normal estándar en R:Realización de una distribución normal estándar en R

x<-seq(-4,4,length=200) 
y<-dnorm(x,mean=0, sd=1) 
plot(x,y, type="l", lwd=2) 

necesito el eje x para ser etiquetados en la media y en los puntos de tres desviaciones estándar por encima y debajo de la media ¿Cómo puedo agregar estas etiquetas?

+0

deberes ...? Intenta configurar 'axes = FALSE' en el comando' plot() 'y luego ve'? Axis' ... –

+2

Incluso si esto es tarea, y estás buscando una función diseñada para mostrar aspectos de la distribución normal, vine across 'normal.and.t.dist' en el paquete' HH' hace un tiempo. – BenBarnes

Respuesta

16

La manera más fácil (pero no general) es restringir los límites del eje x. La sigma +/- 1: 3 se etiquetará como tal y la media se etiquetará como 0, lo que indica 0 desviaciones de la media.

plot(x,y, type = "l", lwd = 2, xlim = c(-3.5,3.5)) 

enter image description here

Otra opción es el uso de etiquetas más específicas:

plot(x,y, type = "l", lwd = 2, axes = FALSE, xlab = "", ylab = "") 
axis(1, at = -3:3, labels = c("-3s", "-2s", "-1s", "mean", "1s", "2s", "3s")) 
14

Mediante el código de David, puede omitir la creación de x y sólo tiene que utilizar curve() en la función dnorm:

curve(dnorm, -3.5, 3.5, lwd=2, axes = FALSE, xlab = "", ylab = "") 
axis(1, at = -3:3, labels = c("-3s", "-2s", "-1s", "mean", "1s", "2s", "3s")) 

Pero esto ya no usa el código dado. Si esta es una tarea asignada, por favor marquela como tal.


pequeño consejo, o bien utilizar constantemente <- o = con espacios alrededor de ellos, que le hará la vida mucho más fácil. Por ejemplo:

x <- seq(-4, 4, length=200) 
y <- dnorm(x, mean=0, sd=1) 
plot(x, y, type="l", lwd=2) 
5

Un extremadamente ineficiente y poco común, pero bella solución, que trabaja basado en las ideas de la simulación de Monte Carlo, es la siguiente:

  1. simular muchos sorteos (o muestras) a partir de una determinada distribución (decir lo normal).
  2. grafica la densidad de estos dibujos usando rnorm. La función rnorm toma como argumentos (A, B, C) y devuelve un vector de A muestras de una distribución normal centrada en B, con desviación estándar C.

Así, para tomar una muestra de tamaño 50 000 a partir de una normal estándar (es decir, una normal con media 0 y desviación estándar 1), y la trama de su densidad, que hace lo siguiente:

x = rnorm(50000,0,1) 

plot(density(x)) 

Como el número de sorteos va al infinito, esto convergerá en distribución a lo normal. Para ilustrar esto, vea la imagen a continuación que muestra de izquierda a derecha y de arriba a abajo 5000,50000,500000, y 5 millones de muestras. 5000,50000,500000, and 5 million samples from the normal PDF

+0

buena respuesta: aunque no utiliza el PDF normal directamente, se puede generalizar para representar cualquier distribución que pueda muestrearse. –

3

Si le gusta la forma difícil de hacer algo sin utilizar la función R integrada o si desea hacer esto fuera de R, puede usar la siguiente fórmula.

enter image description here

x<-seq(-4,4,length=200) 
s = 1 
mu = 0 
y <- (1/(s * sqrt(2*pi))) * exp(-((x-mu)^2)/(2*s^2)) 
plot(x,y, type="l", lwd=2, col = "blue", xlim = c(-3.5,3.5)) 
3

En el caso general, por ejemplo: Normal (2, 1)

f <- function(x) dnorm(x, 2, 1) 
plot(f, -1, 5) 

Esta es una muy general, f se puede definir libremente, con los parámetros dados, para ejemplo:

f <- function(x) dbeta(x, 0.1, 0.1) 
plot(f, 0, 1) 
0

Particularmente me encanta Lattice para este objetivo. Se implementa fácilmente información gráfica como áreas específicas bajo una curva, el más habitual requerir cuando se trata de problemas de probabilidades como encontrar P (a < X < b) etc. Por favor tenga una mirada:

library(lattice) 

e4a <- seq(-4, 4, length = 10000)   # Data to set up out normal 
e4b <- dnorm(e4a, 0, 1) 

     xyplot(e4b ~ e4a,     # Lattice xyplot 
       type = "l", 
       main = "Plot 2", 
       panel = function(x,y, ...){ 
        panel.xyplot(x,y, ...) 
        panel.abline(v = c(0, 1, 1.5), lty = 2) #set z and lines 

        xx <- c(1, x[x>=1 & x<=1.5], 1.5)   #Color area 
        yy <- c(0, y[x>=1 & x<=1.5], 0) 
        panel.polygon(xx,yy, ..., col='red') 
       }) 

enter image description here

En este ejemplo hago que el área entre z = 1 y z = 1.5 se destaque. Puede mover fácilmente estos parámetros de acuerdo con su problema.

Las etiquetas de eje son automáticas.

Cuestiones relacionadas