2012-05-07 4 views
12

Я использую следующий код, чтобы создать стандартное нормальное распределение в R:Создание стандартного нормального распределения в R

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

мне нужна ось х, чтобы быть маркированы в среднем и в точках три стандартных отклонения выше и ниже среднего. Как добавить эти ярлыки?

+0

домашнее задание ...? Попробуйте установить 'axes = FALSE' в' plot() ', а затем увидите'? Axis' ... –

+2

Даже если это домашнее задание, и вы ищете функцию, предназначенную для отображения аспектов нормального распространения, я пришел через 'normal.and.t.dist' в пакете' HH' некоторое время назад. – BenBarnes

ответ

16

Самый простой (но не общий) способ - ограничить пределы оси x. Сигма +/- 1: 3 будет обозначена как таковая, а среднее значение будет обозначаться как 0, что означает 0 отклонений от среднего.

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

enter image description here

Другой вариант заключается в использовании более конкретные метки:

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

Используя код Давида, вы можете пропустить создание x и просто использовать curve() на 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")) 

Но это больше не использует данный код. Если это домашнее задание, пометьте его как таковое.


Небольшой совет, использовать последовательно либо <- или = с пробелами вокруг них, это сделает вашу жизнь намного проще. Например:

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

Крайне неэффективное и необычное, но красивое решение, которое работает на основе идей моделирования методом Монте-Карло, это:

  1. имитировать много дро (или образцы) из данной распределение (скажем, нормальное).
  2. рассчитать плотность этих ничьих, используя rnorm. rnorm функция принимает в качестве аргументов (А, В, С) и возвращает вектор A образцов из нормального распределения с центром в точке B , со стандартным отклонением C.

Таким образом, чтобы взять образец размера 50000 от стандартного нормального (то есть, нормального со средним значением 0 и стандартным отклонением 1), и участок его плотности, мы следующее:

x = rnorm(50000,0,1) 

plot(density(x)) 

As число ничьих уходит в бесконечность, это сходится в распределении к нормали. Чтобы проиллюстрировать это, см. Изображение ниже, которое показывает слева направо и сверху вниз 5000 500000000000 и 5 миллионов образцов. 5000,50000,500000, and 5 million samples from the normal PDF

+0

Хороший ответ - даже если он не использует обычный PDF напрямую, он обобщен для построения любого распределения, которое можно отбирать. –

3

Если вам нравится тяжелый способ сделать что-то без использования встроенной функции R или вы хотите сделать это за пределами R, вы можете использовать следующую формулу.

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

В общем случае, к примеру: Normal (2, 1)

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

Это очень общее, е могут быть определены свободно, с любыми заданными параметрами, пример:

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

Мне особенно нравится решетка для этой цели. Он легко реализует графическую информацию, такую ​​как конкретных областях под кривой, который вы обычно требуется при работе с вероятностями таких проблем, как найти Р (а < < X б) и т.д. Пожалуйста, посмотрите:

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

В этом примере я делаю область между z = 1 и z = 1.5 выделяется. Вы можете легко перемещать эти параметры в соответствии с вашей проблемой.

Осевые этикетки автоматические.

Смежные вопросы