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


91

R中是否有将曲线拟合为直方图的函数?

假设您有以下直方图

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

看起来很正常,但是歪斜了。我想拟合一条偏斜的正态曲线以围绕此直方图。

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


您是否要找到m和s以便高斯分布N(m,s)符合您的数据?
SteinNorheim

我不确定这是什么意思...> _>
user5243421

10
@mathee:我认为他的意思是m =平均值,s =标准偏差。高斯分布是正态分布的另一个名称。
彼得·莫滕森

Answers:


154

如果我正确理解了您的问题,那么您可能想要密度估计值和直方图:

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) 

连同它产生的图形:

在此处输入图片说明


3
+1-您是否也可以反过来做,即调整密度图以适合直方图?
vonjd 2013年

2
我建议给其他参数,lines(density(X,na.rm= TRUE)因为矢量可能包含NA值。
Anirudh 2014年

30

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()

28

这是我的方法:

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

一个额外的练习是使用ggplot2软件包来做到这一点...


但是,如果您想要歪斜的东西,则可以从上方进行密度示例,转换数据(例如foo.log&lt;-log(foo)并尝试上面的方法),或尝试拟合歪斜的分布,例如gamma或对数正态(对数正态等效于取对数并拟合法线,顺便说一句)。
约翰逊

2
但这仍然需要首先估计分发的参数。
Dirk Eddelbuettel,2009年

这与简单讨论R有点儿距离,因为我们越来越多地关注理论统计数据,但是您可以尝试使用以下有关Gamma的链接:en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation 对于对数正态,只需取对数(假设所有数据均为正数),并使用对数转换后的数据。对于任何更喜欢的人,我认为您都必须使用统计教科书。
约翰逊

3
我认为您会误解原始海报以及所有其他答案对于使用非参数估算值的满足感如何-例如老式的直方图或更现代的数据驱动的密度估算值。如果您有充分的理由怀疑分布,则参数估计值将非常有用。但事实并非如此。
Dirk Eddelbuettel,2009年

11

Dirk解释了如何在直方图中绘制密度函数。但是有时您可能希望采用偏态正态分布的更强假设,并绘制密度而不是密度。您可以估计分布的参数,并使用sn软件包对其进行绘制:

> 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 

偏态正态分布数据图

这对于偏斜正态的数据可能会更好:

另一个偏正态图


3

我遇到了同样的问题,但是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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.