估计模拟数据上两个 x 值之间范围内的概率密度
Estimating probability density in a range between two x values on simulated data
我想评估我模拟过的数据的概率密度。
- 我知道,如果我只想找到正态分布上单个 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
- 但是如果我想评估 模拟 数据中两个 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)
- 我生成的 100,000 个值是原始值,它们确实采用正常形状。但是,这不是概率密度函数,因为曲线下的面积不等于 1。
library("pracma")
trapz(random_vals)
random_vals
[1] 1000009
我的问题:
- 给定我的模拟数据,如何为其创建概率密度函数?
- 一旦创建,我如何估计:(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
模拟的分布)具有相同的均值和标准差。
所以我认为我缺少一些基本的东西,如果有任何帮助,我将不胜感激。总的来说,这似乎是一个非常简单的问题,但尽管进行了大量阅读和挖掘,我还是找不到直接的解决方案。
谢谢!
编辑
我缺少的是以下两者之间的区别:
- x 值范围的概率:pdf
曲线下的面积
- 特定x值的概率密度:给定x值的函数值(这就是
dnorm()
的用处)
- 概率密度范围沿着pdf曲线,在两个x值之间(选择的答案+评论地址)
计算连续概率函数中单个值的概率没有意义,根据定义它为零,但您可以计算相对可能性。你对 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
您可以使用函数density
和approxfun
获得概率密度函数。
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,曲线下面积小于高度也就不足为奇了
我想评估我模拟过的数据的概率密度。
- 我知道,如果我只想找到正态分布上单个 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
- 但是如果我想评估 模拟 数据中两个 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)
- 我生成的 100,000 个值是原始值,它们确实采用正常形状。但是,这不是概率密度函数,因为曲线下的面积不等于 1。
library("pracma")
trapz(random_vals)
random_vals
[1] 1000009
我的问题:
- 给定我的模拟数据,如何为其创建概率密度函数?
- 一旦创建,我如何估计:(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
模拟的分布)具有相同的均值和标准差。
所以我认为我缺少一些基本的东西,如果有任何帮助,我将不胜感激。总的来说,这似乎是一个非常简单的问题,但尽管进行了大量阅读和挖掘,我还是找不到直接的解决方案。
谢谢!
编辑
我缺少的是以下两者之间的区别:
- x 值范围的概率:pdf 曲线下的面积
- 特定x值的概率密度:给定x值的函数值(这就是
dnorm()
的用处) - 概率密度范围沿着pdf曲线,在两个x值之间(选择的答案+评论地址)
计算连续概率函数中单个值的概率没有意义,根据定义它为零,但您可以计算相对可能性。你对 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
您可以使用函数density
和approxfun
获得概率密度函数。
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,曲线下面积小于高度也就不足为奇了