如何在R中获得Inverse CDF(内核)?

时间:2013-03-11 04:39:33

标签: r

在R中是否有任何函数可以计算特定alpha(0,1)的逆内核(我正在考虑正常)CDF。 我找到了分位数,但我不确定它是如何工作的。

由于

2 个答案:

答案 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)函数。