[英]Estimating probability density in a range between two x values on simulated data
我想评估我模拟的数据的概率密度。
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
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)
library("pracma")
trapz(random_vals)
random_vals
[1] 1000009
@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。
因此,我想我缺少一些基本知识,感谢您的帮助。 总体而言,这似乎是一个非常简单的问题,但是尽管有大量的阅读和挖掘,但我找不到一个简单的解决方案。
谢谢!
我所缺少的是以下两者之间的区别:
dnorm()
有用的功能) 计算连续概率函数中单个值的概率是没有意义的,根据定义它为零,但是您可以计算相对可能性。 您对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
您可以使用函数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
您还问:
点值(x = 9.9)的概率密度如何可能为1.76,但范围为9.7
pdf(1.76)的值是曲线的高度。 您获得的范围值是曲线下的面积。 由于间隔的宽度为0.5,因此曲线下的面积小于高度就不足为奇了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.