R:ogive曲线下面积?

时间:2016-04-29 18:05:51

标签: r integration cdf

我有一个算法,它使用排序的y数据的x,y图来产生一个ogive。

然后我得出曲线下的面积来推导出%s。

我想使用内核密度估计做类似的事情。我喜欢如何使用内核密度平滑上/下边界(即最小值和最大值将略微超出我的硬编码输入)。

无论哪种方式......我想知道是否有办法将一个ogive视为一种累积分布函数和/或使用内核密度估计来得出y数据给出的累积分布函数?

如果这是一个令人困惑的问题,我道歉。我知道有一种方法可以得出累积频率图(即ogive)。但是,在给定此累积频率图的情况下,我无法确定如何导出%。

我不想要的是ecdf。我知道如何做到这一点,我并不是想捕获一个ecdf。但是,给两个间隔给出一个ogive的整合​​。

1 个答案:

答案 0 :(得分:2)

我不确定你的想法,但是这里有一种计算核心密度估计曲线下面积的方法(或者更常见的是,对于你的y值等间距x值的任何情况) (当然,你也可以推广到变量x区间)):

library(zoo)

# Kernel density estimate
# Set n to higher value to get a finer grid
set.seed(67839)
dens = density(c(rnorm(500,5,2),rnorm(200,20,3)), n=2^5)

# How to extract the x and y values of the density estimate
#dens$y
#dens$x

# x interval
dx = median(diff(dens$x))

# mean height for each pair of y values
h = rollmean(dens$y, 2)

# Area under curve
sum(h*dx)  # 1.000943

# Cumulative area
# cumsum(h*dx)

# Plot density, showing points at which density is calculated 
plot(dens)
abline(v=dens$x, col="#FF000060", lty="11")

enter image description here

# Plot cumulative area under curve, showing mid-point of each x-interval
plot(dens$x[-length(dens$x)] + 0.5*dx, cumsum(h*dx), type="l")
abline(v=dens$x[-length(dens$x)] + 0.5*dx, col="#FF000060", lty="11")

enter image description here

更新以包含ecdf功能

要解决您的意见,请查看下面的两个图表。第一个是我在上面使用的正态分布混合的经验累积分布函数(ECDF)。请注意,此数据的图表与下面的图表相同。第二个是普通香草正态分布的ECDF图,平均值= 0,sd = 1.

set.seed(67839)
x = c(rnorm(500,5,2),rnorm(200,20,3))
plot(ecdf(x), do.points=FALSE)

plot(ecdf(rnorm(1000)))

enter image description here