Наложение гистограммы с нормальным распределением - PullRequest
1 голос
/ 20 мая 2019

Мне нужно нарисовать гистограмму данных (весов) с наложением на линию ожидаемого нормального распределения

Я совершенно новичок в R и статистике. Я знаю, что, возможно, что-то неправильно поняло плотность частот и dnorm, но я застрял.

weights <- c(97.6,95,94.3 ,92.3 ,90.7 ,89.4 ,88.2 ,86.9 ,85.8 ,85.5 ,84.4 ,84.1 ,82.5 ,81.4 ,80.8 ,80  ,79.8 ,79.5 ,78.4 ,78.4 ,78.2 ,78.1 ,78  ,77.4 ,76.5 ,75.4 ,74.8 ,74.1 ,73.5 ,73.2 ,73  ,72.3 ,72.3 ,72.2 ,71.8 ,71.7 ,71.6 ,71.6 ,71.5 ,71.3 ,70.7 ,70.6 ,70.5 ,69.2 ,68.6 ,68.3 ,67.5 ,67  ,66.8 ,66.6 ,65.8 ,65.6 ,64.9 ,64.6 ,64.5 ,64.5 ,64.3 ,64.2 ,63.9 ,63.7 ,62.7 ,62.3 ,62.2 ,59.4 ,57.8 ,57.8 ,57.6 ,56.4 ,53.6 ,53.2 )
hist(weights)
m <- mean(weights)
sd <- sd(weights)
x <- seq(min(weights), max(weights), length.out length(weights))
xn <- dnorm(x, mean = m, sd = sd) * length(weights) #what is the correct factor???
lines(x, xn)

Я ожидал, что линия будет приблизительно следовать гистограмме, но она слишком мала в гистограмме

Ответы [ 3 ]

2 голосов
/ 20 мая 2019

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

weights = c(97.6,95,94.3 ,92.3 ,90.7 ,89.4 ,88.2 ,86.9 ,85.8 ,85.5 ,84.4 ,84.1 ,82.5 ,81.4 ,80.8 ,80  ,79.8 ,79.5 ,78.4 ,78.4 ,78.2 ,78.1 ,78  ,77.4 ,76.5 ,75.4 ,74.8 ,74.1 ,73.5 ,73.2 ,73  ,72.3 ,72.3 ,72.2 ,71.8 ,71.7 ,71.6 ,71.6 ,71.5 ,71.3 ,70.7 ,70.6 ,70.5 ,69.2 ,68.6 ,68.3 ,67.5 ,67  ,66.8 ,66.6 ,65.8 ,65.6 ,64.9 ,64.6 ,64.5 ,64.5 ,64.3 ,64.2 ,63.9 ,63.7 ,62.7 ,62.3 ,62.2 ,59.4 ,57.8 ,57.8 ,57.6 ,56.4 ,53.6 ,53.2 )

hist(weights, prob = T)
lines(density(weights), col = "red")

Надеюсь, это поможет.

1 голос
/ 20 мая 2019

Вы почти у цели, вам просто нужно учитывать ширину бункера гистограммы.

weights <- c(97.6, 95, 94.3, 92.3, 90.7, 89.4, 88.2, 86.9, 85.8,
  85.5, 84.4, 84.1, 82.5, 81.4, 80.8, 80, 79.8, 79.5, 78.4, 78.4,
  78.2, 78.1, 78, 77.4, 76.5, 75.4, 74.8, 74.1, 73.5, 73.2, 73,
  72.3, 72.3, 72.2, 71.8, 71.7, 71.6, 71.6, 71.5, 71.3, 70.7,
  70.6, 70.5, 69.2, 68.6, 68.3, 67.5, 67, 66.8, 66.6, 65.8, 65.6,
  64.9, 64.6, 64.5, 64.5, 64.3, 64.2, 63.9, 63.7, 62.7, 62.3,
  62.2, 59.4, 57.8, 57.8, 57.6, 56.4, 53.6, 53.2)

h <- hist(weights, freq=TRUE)
binwi <- diff(h$breaks)[1]

x <- seq(min(weights)-10, max(weights)+10, 0.01)
xn <- dnorm(x, mean=mean(weights), sd=sd(weights)) * length(weights) * binwi
lines(x, xn)

enter image description here

1 голос
/ 20 мая 2019

Проблема в вашем коде в том, что hist отображает частоты, а dnorm вычисляет плотности.Вы можете попытаться создать гистограмму с плотностями, а затем вы увидите гистограмму или линию, просто добавив к гистограмме freq=F: hist(weights, freq = F)

...