用正态分布覆盖直方图

时间:2019-05-20 12:15:17

标签: r statistics normal-distribution

我需要绘制一条数据(权重)的直方图,上面覆盖着一条预期的正态分布线

我对R和统计完全陌生。我知道我可能在频率密度和范数方面存在根本性的错误,但是我被卡住了。

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 个答案:

答案 0 :(得分:2)

您需要的是绘制带有示例频率的直方图,然后绘制权重的密度,即

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 :(得分:1)

代码中的问题是hist绘制频率,而dnorm计算密度。 您可以尝试制作具有密度的直方图,然后您将看到直方图或仅向直方图添加freq=F的线: hist(weights, freq = F)

答案 2 :(得分:1)

您快到了,您只需要考虑直方图bin宽度即可。

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