估计模拟数据上两个 x 值之间范围内的概率密度

Estimating probability density in a range between two x values on simulated data

我想评估我模拟过的数据的概率密度。

  1. 我知道,如果我只想找到正态分布上单个 x 值的概率密度,我可以按以下方式使用 dnorm()
dist_mean <- 10
dist_sd <- 0.2
prob_density_on_x_val <- dnorm(x = 9.9,
                               mean = dist_mean,
                               sd = dist_sd)

prob_density_on_x_val

[1] 1.760327
  1. 但是如果我想评估 模拟 数据中两个 x 值之间范围的概率密度怎么办?
dist_mean <- 10
dist_sd <- 0.2

## simulate 100,000 values from the normal distribution, 
## given specific mean and standard deviation.
set.seed(123)
random_vals <- rnorm(n = 100000,
                     mean = dist_mean,
                     sd = dist_sd)


hist(random_vals)

  1. 我生成的 100,000 个值是原始值,它们确实采用正常形状。但是,这不是概率密度函数,因为曲线下的面积不等于 1。
library("pracma")
trapz(random_vals)

random_vals
[1] 1000009

我的问题:

  1. 给定我的模拟数据,如何为其创建概率密度函数?
  2. 一旦创建,我如何估计:(1) 曲线下的概率,以及 (2) 曲线上的概率密度,对于两个 x 值之间的范围?比如x=9.7到10.2之间的概率和概率密度。或任何其他范围。

我试图解决这个问题:

this comment中,@Glen_b说使用ecdf()是计算两个x值"a"和"b"之间的概率的方法: ecdf(b)-ecdf(a)。但是,有些事情没有意义,因为:

cdf <- ecdf(random_vals)
range_density <- cdf(10.2)-cdf(9.7)

range_density
[1] 0.77358

一个点值 (x=9.9) 的概率密度是 1.76,但对于范围 9.7<x<10.2 它更小 (0.77),这怎么可能?两种分布(用 dnorm 定义的分布和用 rnorm 模拟的分布)具有相同的均值和标准差。

所以我认为我缺少一些基本的东西,如果有任何帮助,我将不胜感激。总的来说,这似乎是一个非常简单的问题,但尽管进行了大量阅读和挖掘,我还是找不到直接的解决方案。

谢谢!

编辑

我缺少的是以下两者之间的区别:

计算连续概率函数中单个值的概率没有意义,根据定义它为零,但您可以计算相对可能性。你对 random_vals 的反应不是总和为一,但不是说 prob_density_on_x_val 大于一?

Glen 当然是正确的,因为 ecdf() 是进行非参数估计的方法,但如果您期望正态分布,您也可以进行参数估计。

dist_mean <- 10
dist_sd <- 0.2
a <- 9.7
b <- 10.2

set.seed(123)
r <- rnorm(1e4, dist_mean, dist_sd)

# population
pnorm(b, dist_mean, dist_sd) - pnorm(a, dist_mean, dist_sd)
# [1] 0.7745375

# parametric estimate
pnorm(b, mean(r), sd(r)) - pnorm(a, mean(r), sd(r))
# [1] 0.7753985

# nonparametric estimate
ecdfun <- ecdf(r)
ecdfun(b) - ecdfun(a)
# [1] 0.7754

您可以使用函数densityapproxfun获得概率密度函数。

DensityFunction = approxfun(density(random_vals), rule=2)
DensityFunction(9.7)
[1] 0.6410087
plot(DensityFunction, xlim=c(9,11))

你可以使用integrate

得到曲线下的面积
AreaUnderCurve = function(lower, upper) {
    integrate(DensityFunction, lower=lower, upper=upper) }

AreaUnderCurve(10,11)
0.5006116 with absolute error < 6.4e-05
AreaUnderCurve(9.5,10.5)
0.9882601 with absolute error < 0.00011

您还问:

How is it possible that that the probability density on point value (x=9.9) was 1.76, but for a range 9.7

pdf (1.76) 的值为曲线的高度。您获得的范围值是曲线下的面积。由于区间宽度为0.5,曲线下面积小于高度也就不足为奇了