如何从 R 中的密度函数中找到/估计概率密度函数

机器算法验证 r 密度函数 累积分布函数
2022-01-22 11:25:41

假设我有一个X未知分布的变量。在 Mathematica 中,通过使用SmoothKernelDensity函数,我们可以得到一个估计的密度函数。这个估计的密度函数可以与PDF函数一起使用来计算一个值的概率密度函数,例如X假设PDF[density,X]“密度”是 的结果SmoothKernelDensity如果 R 中有这样的功能会很好。这就是它在 Mathematica 中的工作方式

http://reference.wolfram.com/mathematica/ref/SmoothKernelDistribution.html

例如(基于 Mathematica 函数):

data = RandomVariate[NormalDistribution[], 100]; #generates 100 values from N(0,1)

density= SmoothKernelDistribution[data]; #estimated density

PDF[density, 2.345] returns 0.0588784 

在这里您可以找到有关 PDF 的更多信息:

http://reference.wolfram.com/mathematica/ref/PDF.html

我知道我可以density(X)在 R 中使用它绘制它的密度函数,并且通过使用ecdf(X)我可以获得它的经验累积分布函数。是否可以根据我对 Mathematica 的描述在 R 中做同样的事情?

任何帮助和想法表示赞赏。

2个回答

?density指出它approx已经用于进行线性插值;?approx指出approxfun生成合适的函数:

x <- log(rgamma(150,5))
df <- approxfun(density(x))
plot(density(x))
xnew <- c(0.45,1.84,2.3)
points(xnew,df(xnew),col=2)

在此处输入图像描述

通过使用integrate从样本中最小值以下的适当距离开始(可能是 4 或 5 倍的带宽,df通常用于适当的距离),可以获得对应于的 cdf 的良好近似值df.

spatstat.core::CDF()可用于从 的给定输出创建累积密度函数density()

set.seed(123)
x <- rnorm(10000000)

x_density <- density(x, n = 10000)

x_cdf <- spatstat.core::CDF(x_density)

sds <- c(-2, -1, 0, 1, 2)
names(sds) <- sds

# check cdf at different values
setNames(
  x_cdf(sds), 
  sds)
#>         -2         -1          0          1          2 
#> 0.02285086 0.15889356 0.50009332 0.84134448 0.97717762

# compare against theoretical
pnorm(sds)
#>         -2         -1          0          1          2 
#> 0.02275013 0.15865525 0.50000000 0.84134475 0.97724987

reprex 包于 2021-11-22 创建 (v2.0.0 )

更新

此答案的先前版本将已弃用的代码spatstat:::CDF()(在 2020 年?)复制到其他几个包中。如果有人知道当前存在此 CDF 功能的更轻量的包,很乐意在评论中听到它!