【问题标题】:How to get Inverse CDF (kernel) in R?如何在 R 中获得逆 CDF(内核)?
【发布时间】:2014-01-01 21:20:38
【问题描述】:

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

谢谢

【问题讨论】:

  • ?qnorm你在追什么?
  • 你的意思是你想要正态分布的分位数函数qnorm? @thelatemail:快!
  • qnorm 是否适用于内核估计?我不知道我的数据的确切分布。假设我从 N(0,1) 模拟 100 rv。我需要找到 F^-1(alpha),其中 F 是内核 CDF。
  • 好像我以前见过这样的SO问题。搜索过吗?

标签: r


【解决方案1】:

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

【讨论】:

  • 你这里用的CDF,是内核CDF吗?对于像 0.0001 这样非常小的 alpha 值,它不会给出 invcdf。
  • 是的,此代码需要修改 cdf(min(x)) 和 cdf(max(x)) 之间的 alpha 值
  • 我是 R 新手,它非常复杂。感谢您的帮助。
  • 你能告诉我为什么我们需要插入密度吗?
  • integrate 需要一个函数作为输入。 density 的输出不是一个函数,所以我们需要使用 approxfun 来制作一个函数。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2012-09-02
    • 2017-08-24
    相关资源
    最近更新 更多