【问题标题】:Estimating probability density in a range between two x values on simulated data估计模拟数据上两个 x 值之间范围内的概率密度
【发布时间】:2019-12-12 04:46:18
【问题描述】:

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

  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. 创建后,对于两个 x 值之间的范围,我如何估计:(1) 曲线下的概率,和 (2) 曲线上的概率密度?例如,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&lt;x&lt;10.2 它更小 (0.77)?两种分布(用dnorm 定义的一种和用rnorm 模拟的一种)具有相同的均值和标准差。

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

谢谢!

编辑

我缺少的是:

  • 一系列x值的概率:pdf曲线下的面积
  • 特定 x 值的概率密度:给定 x 值的函数值(这就是 dnorm() 的用处)
  • 范围的概率密度 沿着 pdf 曲线,在两个 x 值之间(选择的答案 + cmets 地址)

【问题讨论】:

    标签: r normal-distribution probability-density


    【解决方案1】:

    在连续概率函数中计算单个值的概率是没有意义的,根据定义它为零,但您可以计算相对可能性。你对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
    

    【讨论】:

    • 在你的第一句话中不应该读“连续概率函数”而不是“离散”吗?
    • @jludewig:啊,是的
    • @AkselA,谢谢。没错,我完全忽略了单个值上的 p > 1。但是,dnorm 怎么给我的值 > 1,而不是 ≈ 0?
    • 好的,我想我明白了。 dnorm 只是给出给定 x 的函数值,而不是该 x 曲线下的面积(对于单个值来说基本上没有)。
    【解决方案2】:

    您可以使用函数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
    

    你还问:

    点值上的概率密度怎么可能 (x=9.9) 为 1.76,但范围为 9.7

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

    【讨论】:

    • 感谢您,我了解 density(val x 的曲线高度)和 probability(范围的曲线下面积)之间的微妙之处.但是,它可能超出了本页的范围——我们是否也可以计算一个范围的密度,而不是一个范围的概率(这是你的答案)?即,我们可以测量两个 x 值之间的曲线以获得范围密度吗?这有意义吗?
    • 您可以通过计算AreaUndercurve(range) / width(range) 获得一个范围内的平均密度
    猜你喜欢
    • 2017-02-03
    • 2020-03-13
    • 2018-12-11
    • 2014-12-12
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2016-05-25
    • 2020-03-24
    相关资源
    最近更新 更多