Подтвердить что ты не робот

Как построить нормальное распределение путем маркировки определенных частей оси х?

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

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

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

4b9b3361

Ответ 1

Самый простой (но не общий) способ - ограничить пределы оси 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"))

Ответ 2

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

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

Ответ 3

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

  • смоделировать много ничьих (или выборок) из заданного распределения (скажем, нормального).
  • запишите плотность этих ничьих с помощью rnorm. Функция rnorm принимает в качестве аргументов (A, B, C) и возвращает вектор выборок A из нормального распределения с центром в B со стандартным отклонением C.

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

x = rnorm(50000,0,1)

plot(density(x))

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

Ответ 4

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

введите описание изображения здесь

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))

Ответ 5

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

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

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

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

Ответ 6

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

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')
               })

введите описание изображения здесь

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

Ярлыки осей автоматические.

Ответ 7

Вот как записать его в функции:

normalCriticalTest <- function(mu, s) {
  x <- seq(-4, 4, length=200) # x extends from -4 to 4
  y <- (1/(s * sqrt(2*pi))) * exp(-((x-mu)^2)/(2*s^2)) # y follows the formula 
of the normal distribution: f(Y)
  plot(x,y, type="l", lwd=2, xlim = c(-3.5,3.5))
  abline(v = c(-1.96, 1.96), col="red") # draw the graph, with 2.5% surface to 
either side of the mean
}
normalCriticalTest(0, 1) # draw a normal distribution with vertical lines.

У вас есть это