将密度曲线拟合到R中的直方图

时间:2009-09-30 11:23:09

标签: r histogram curve-fitting r-faq

R中是否有适合直方图曲线的函数?

假设你有以下直方图

hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))

看起来很正常,但它是偏斜的。我想要拟合一条倾斜的正常曲线来包裹这个直方图。

这个问题很基本,但我似乎无法在互联网上找到R的答案。

6 个答案:

答案 0 :(得分:147)

如果我理解你的问题,那么你可能需要密度估计和直方图:

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE)            # prob=TRUE for probabilities not counts
lines(density(X))             # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted")   # add another "smoother" density

很久以后编辑:

这是一个稍微装扮一点的版本:

X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE, col="grey")# prob=TRUE for probabilities not counts
lines(density(X), col="blue", lwd=2) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted", col="darkgreen", lwd=2) 

以及它产生的图表:

enter image description here

答案 1 :(得分:28)

ggplot2

这样容易
library(ggplot2)
dataset <- data.frame(X = c(rep(65, times=5), rep(25, times=5), 
                            rep(35, times=10), rep(45, times=4)))
ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..)) + 
  geom_density()

或模仿Dirk解决方案的结果

ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..), binwidth = 5) + 
  geom_density()

答案 2 :(得分:26)

这就是我的方式:

foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)

奖励练习是使用ggplot2包...

答案 3 :(得分:11)

Dirk解释了如何在直方图上绘制密度函数。但是有时候你可能想要采用偏态正态分布的强假设,而不是密度。您可以使用sn package

估算分布参数并绘制它
> sn.mle(y=c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
$call
sn.mle(y = c(rep(65, times = 5), rep(25, times = 5), rep(35, 
    times = 10), rep(45, times = 4)))

$cp
    mean     s.d. skewness 
41.46228 12.47892  0.99527 

Skew-normal distributed data plot

对于更偏斜的数据,这可能效果更好:

Another skew-normal plot

答案 4 :(得分:2)

我有同样的问题但Dirk的解决方案似乎没有用。 我每次都收到这个警告消息

"prob" is not a graphical parameter

我通读了?hist并找到了freq: a logical vector set TRUE by default.

对我有用的代码是

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)

答案 5 :(得分:0)

这是核密度估计,请点击 this link 查看概念及其参数的精彩插图。

曲线的形状主要取决于两个元素:1)内核(通常是Epanechnikov or Gaussian),它通过输入和权衡所有数据,为x坐标中的每个值估计y坐标中的一个点;它是对称的,通常是积分为一个的正函数; 2)带宽,越大曲线越平滑,越小曲线越摆动。

对于不同的需求,应该应用不同的包,可以参考这个文档:Density estimation in R。对于多变量变量,您可以使用 multivariate kernel density estimation