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

Наложение нормальной кривой на гистограмму в R

Мне удалось найти онлайн, как наложить нормальную кривую на гистограмму в R, но я хотел бы сохранить нормальную "частоту" оси y гистограммы. См. Два сегмента кода ниже и обратите внимание, как во втором, ось y заменяется на "плотность". Как я могу сохранить эту ось y как "частоту", как это показано на первом графике.

КАК БОНУС: Я бы хотел отметить области SD (до 3 SD) на кривой плотности. Как я могу это сделать? Я пробовал abline, но строка простирается до вершины графика и выглядит уродливой.

g = d$mydata
hist(g)

enter image description here

g = d$mydata
    m<-mean(g)
    std<-sqrt(var(g))
    hist(g, density=20, breaks=20, prob=TRUE, 
         xlab="x-variable", ylim=c(0, 2), 
         main="normal curve over histogram")
    curve(dnorm(x, mean=m, sd=std), 
          col="darkblue", lwd=2, add=TRUE, yaxt="n")

enter image description here

Посмотрите, как на изображении выше, ось y - это "плотность". Я бы хотел, чтобы это была "частота".

4b9b3361

Ответ 1

Вот хороший простой способ:

h <- hist(g, breaks = 10, density = 10,
          col = "lightgray", xlab = "Accuracy", main = "Overall") 
xfit <- seq(min(g), max(g), length = 40) 
yfit <- dnorm(xfit, mean = mean(g), sd = sd(g)) 
yfit <- yfit * diff(h$mids[1:2]) * length(g) 

lines(xfit, yfit, col = "black", lwd = 2)

Ответ 2

Вам просто нужно найти правильный множитель, который можно легко вычислить из объекта hist.

myhist <- hist(mtcars$mpg)
multiplier <- myhist$counts / myhist$density
mydensity <- density(mtcars$mpg)
mydensity$y <- mydensity$y * multiplier[1]

plot(myhist)
lines(mydensity)

enter image description here

Более полная версия с нормальной плотностью и строками при каждом стандартном отклонении от среднего (включая среднее):

myhist <- hist(mtcars$mpg)
multiplier <- myhist$counts / myhist$density
mydensity <- density(mtcars$mpg)
mydensity$y <- mydensity$y * multiplier[1]

plot(myhist)
lines(mydensity)

myx <- seq(min(mtcars$mpg), max(mtcars$mpg), length.out= 100)
mymean <- mean(mtcars$mpg)
mysd <- sd(mtcars$mpg)

normal <- dnorm(x = myx, mean = mymean, sd = mysd)
lines(myx, normal * multiplier[1], col = "blue", lwd = 2)

sd_x <- seq(mymean - 3 * mysd, mymean + 3 * mysd, by = mysd)
sd_y <- dnorm(x = sd_x, mean = mymean, sd = mysd) * multiplier[1]

segments(x0 = sd_x, y0= 0, x1 = sd_x, y1 = sd_y, col = "firebrick4", lwd = 2)