4

Is there any function in R which will calculate the inverse kernel(i am considering normal) CDF for a particular alpha(0,1). I have found quantile but I am not sure how it works.

Thanks

4

2 回答 2

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 的值。但我太累了无法修复那现在。这应该是一个不错的开始。

于 2013-03-11T06:29:48.687 回答
2

另一种方法是使用对数样条密度估计而不是核密度估计。查看“logspline”包。通过对数样条密度估计,您可以获得 CDF ( plogspline) 和逆 CDF ( qlogspline) 函数。

于 2013-03-12T01:33:08.617 回答