如何在R中获取反向CDF(核函数)?

6
有没有在R中可以计算特定alpha(0,1)下的逆核函数(我考虑正态分布)CDF的函数?我找到了quantile,但是不确定它如何工作。
谢谢。

4
你是否在追寻 ?qnorm - thelatemail
1
你的意思是要正态分布的分位数函数 qnorm 吗?@thelatemail:咔嚓! - Ben Bolker
qnorm函数适用于核密度估计吗?我不知道我的数据的确切分布。假设我从N(0,1)模拟100个随机变量。我需要找到F ^ -1(alpha),其中F是核CDF。 - user2150536
看起来我好像以前见过一个和这个问题很相似的SO问答。你有进行过搜索吗? - IRTFM
2个回答

9

我们可以整合以获取累积分布函数(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

这可以进一步改进。一个问题是我不能保证累积分布函数总是小于或等于1(如果你检查大于max(x)的值的累积分布函数,你可能会得到像1.00097这样的结果)。但我现在太累了,无法修复它。这应该会提供一个不错的开端。


你在这里使用的CDF是核函数CDF吗?对于像0.0001这样非常小的alpha值,它不会给出invcdf。 - user2150536
是的,这段代码需要修改,以适应 alpha 值在 cdf(min(x)) 和 cdf(max(x)) 之间的情况。 - Dason
我是R语言的新手,它非常复杂。感谢您的帮助。 - user2150536
请问为什么我们需要插值密度? - user2150536
x 可以取任何从负无穷到正无穷的值,N(0,1) 的 cdf 应该在 0 到 1 之间,alpha 也是如此。我猜 alpha 在你的函数中是 q。我不知道如何修改它。:( - user2150536
显示剩余2条评论

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接