在频率直方图上添加拟合的曲线-以对数正态分布为例

以下为R代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
\##### 第一个方案
\##### 拟合正态分布
x <- log(rlnorm(1000))*500 ### 提取数据框
h <- hist(x, ylim = c(0, 300)) ## 绘制频率直方图
xfit <- seq(min(x),max(x),length=500) ### 取要计算的x值
yfit <- dnorm(xfit, mean=mean(x), sd=sd(x)) ### 假设是正态分布, 则对应的概率密度为 yfit
yfit <- yfit*diff(h$mids[1:2])*length(x) ### 求x向量内每一个值与前面数值的差, 以确定在y方向上, 应该放大多少倍
lines(xfit, yfit, col="blue", lwd=2) ### 绘制曲线


\##### 第二个方案
\##### 拟合对数正态分布
x <- rlnorm(1000)*1000 ### 提取第一列
h <- hist(x, ylim = c(0, 1000), breaks = 25) ## 绘制频率直方图
xfit <- seq(min(x),max(x),length=500) ### 取要绘图的x值取值范围
yfit <- dlnorm(xfit, meanlog=log(mean(x)), sdlog=sd(log(x))) ### 假设是对数正态分布, 则对应的概率密度为 yfit
yfit <- yfit*diff(h$mids[1:2])*length(x) ### 求x向量内每一个值与前面数值的差, 以确定在y方向上, 应该放大多少倍
lines(xfit, yfit, col="blue", lwd=2) ### 绘制曲线


\##### 第三个方案
\##### 基于核密度估计
x <- rlnorm(1000)*1000 ### 提取第一列
h <- hist(x, breaks = 25) ## 绘制频率直方图
xfit <- seq(min(x),max(x),length=500) ### 取要绘图的x值取值范围
yfit <- density(x, n = length(xfit))$y ### 假设是对数正态分布, 则对应的概率密度为 yfit
yfit <- yfit*diff(h$mids[1:2])*length(xfit) ### 求x向量内每一个值与前面数值的差, 以确定在y方向上, 应该放大多少倍
lines(xfit, yfit, col="blue", lwd=2) ### 绘制曲线