我有一个算法,它使用排序的y数据的x,y图来产生一个ogive。
然后我得出曲线下的面积来推导出%s。
我想使用内核密度估计做类似的事情。我喜欢如何使用内核密度平滑上/下边界(即最小值和最大值将略微超出我的硬编码输入)。
无论哪种方式......我想知道是否有办法将一个ogive视为一种累积分布函数和/或使用内核密度估计来得出y数据给出的累积分布函数?
如果这是一个令人困惑的问题,我道歉。我知道有一种方法可以得出累积频率图(即ogive)。但是,在给定此累积频率图的情况下,我无法确定如何导出%。
我不想要的是ecdf。我知道如何做到这一点,我并不是想捕获一个ecdf。但是,给两个间隔给出一个ogive的整合。
答案 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")
# 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")
更新以包含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)))