繁体   English   中英

在模拟数据上估计两个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. 创建后,如何估算两个x值之间的范围的曲线(1)在曲线下的概率和(2)曲线上的概率密度? 例如,概率和概率密度在x = 9.7和10.2之间。 或任何其他范围。

我试图弄清楚这一点:

@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定义的dnorm和用rnorm模拟的分布)均具有相同的均值和sd。

因此,我想我缺少一些基本知识,感谢您的帮助。 总体而言,这似乎是一个非常简单的问题,但是尽管有大量的阅读和挖掘,但我找不到一个简单的解决方案。

谢谢!

编辑

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

  • x值范围的概率 :pdf曲线下的面积
  • 特定x值的概率密度 :给定x值的函数值(这是dnorm()有用的功能)
  • 沿pdf曲线的范围的概率密度 ,介于两个x值之间(选择的答案+注释可解决该问题)

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

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

您还问:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM