Как построить нормальное распределение путем маркировки определенных частей оси х?
Я использую следующий код для создания стандартного нормального распределения в R:
x <- seq(-4, 4, length=200)
y <- dnorm(x, mean=0, sd=1)
plot(x, y, type="l", lwd=2)
Мне нужно, чтобы ось х была помечена в среднем значении и в точках три стандартных отклонения выше и ниже среднего. Как добавить эти ярлыки?
Ответы
Ответ 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.
У вас есть это