在R中是否有任何函数可以计算特定alpha(0,1)的逆内核(我正在考虑正常)CDF。 我找到了分位数,但我不确定它是如何工作的。
由于
答案 0 :(得分:7)
我们可以集成以获取cdf,我们可以使用根查找算法来反转cdf。首先,我们要插入density
的输出。
set.seed(10000)
x <- rnorm(1000, 10, 13)
pdf <- density(x)
# Interpolate the density
f <- approxfun(pdf$x, pdf$y, yleft=0, yright=0)
# Get the cdf by numeric integration
cdf <- function(x){
integrate(f, -Inf, x)$value
}
# Use a root finding function to invert the cdf
invcdf <- function(q){
uniroot(function(x){cdf(x) - q}, range(x))$root
}
给出了
med <- invcdf(.5)
cdf(med)
#[1] 0.5000007
这肯定可以改进。一个问题是我不保证cdf总是小于或等于1(如果你检查cdf的值大于max(x)你可能会得到类似1.00097的东西。但我太累了,无法解决现在。这应该是一个不错的开始。
答案 1 :(得分:2)
另一种方法是使用对数样条密度估计而不是核密度估计。看看'logspline'包。使用logspline密度估计,您将获得CDF(plogspline
)和反向CDF(qlogspline
)函数。