计算密度估计曲线下的面积,即概率
Compute area under density estimation curve, i.e., probability
我有一个密度估计(使用 density
函数)我的数据 learningTime
(见下图),我需要找到概率 Pr(learningTime > c)
,即面积从给定数字 c
(红色垂直线)到曲线末端的密度曲线下方。有什么想法吗?
计算密度估计曲线下的面积并不难。这是一个可重现的例子。
假设我们有一些观察到的数据 x
,为简单起见,这些数据服从正态分布:
set.seed(0)
x <- rnorm(1000)
我们执行密度估计(有一些自定义,请参阅 ?density
):
d <- density.default(x, n = 512, cut = 3)
str(d)
# List of 7
# $ x : num [1:512] -3.91 -3.9 -3.88 -3.87 -3.85 ...
# $ y : num [1:512] 2.23e-05 2.74e-05 3.35e-05 4.07e-05 4.93e-05 ...
# ... truncated ...
我们要计算 x = 1
右侧曲线下的面积:
plot(d); abline(v = 1, col = 2)
从数学上讲,这是 [1, Inf]
上的估计密度曲线的数值积分。
估计的密度曲线以离散格式存储在d$x
和d$y
中:
xx <- d$x ## 512 evenly spaced points on [min(x) - 3 * d$bw, max(x) + 3 * d$bw]
dx <- xx[2L] - xx[1L] ## spacing / bin size
yy <- d$y ## 512 density values for `xx`
数值积分有两种方法。
方法一:Riemann Sum
估计密度曲线下的面积为:
C <- sum(yy) * dx ## sum(yy * dx)
# [1] 1.000976
由于黎曼和只是一个近似值,所以这与1(全概率)有一点偏差。我们将此 C
值称为 "normalizing constant".
[1, Inf]
上的数值积分可以近似为
p.unscaled <- sum(yy[xx >= 1]) * dx
# [1] 0.1691366
应该按 C
进一步缩放以进行适当的概率估计:
p.scaled <- p.unscaled / C
# [1] 0.1689718
由于我们模拟的 x
的真实密度是已知的,我们可以将此估计值与真实值进行比较:
pnorm(x0, lower.tail = FALSE)
# [1] 0.1586553
相当接近。
方法二:trapezoidal rule
我们对 (xx, yy)
进行线性插值,并对该线性插值应用数值积分。
f <- approxfun(xx, yy)
C <- integrate(f, min(xx), max(xx))$value
p.unscaled <- integrate(f, 1, max(xx))$value
p.scaled <- p.unscaled / C
#[1] 0.1687369
关于
答案是合法的,但可能是作弊。 OP 的问题从密度估计开始,但答案完全绕过了它。如果允许这样做,为什么不简单地执行以下操作?
set.seed(0)
x <- rnorm(1000)
mean(x > 1)
#[1] 0.163
基数 R 中的经验累积分布函数 ecdf()
使其变得非常容易。以李哲源为例...
#Reproducible sample data
set.seed(0)
x <- rnorm(1000)
#Create empirical cumulative distribution function from sample data
d_fun <- ecdf (x)
#Assume a value for the "red vertical line"
x0 <- 1
#Area under curve less than, equal to x0
d_fun(x0)
# [1] 0.837
#Area under curve greater than x0
1 - d_fun(x0)
# [1] 0.163
关于李哲源对我回答的回应。他们的回答假设你只有密度估计曲线。我的回答假设你有原始数据,这适用于 OP 的问题,因为他们使用 density()
来获得密度估计曲线。
我有一个密度估计(使用 density
函数)我的数据 learningTime
(见下图),我需要找到概率 Pr(learningTime > c)
,即面积从给定数字 c
(红色垂直线)到曲线末端的密度曲线下方。有什么想法吗?
计算密度估计曲线下的面积并不难。这是一个可重现的例子。
假设我们有一些观察到的数据 x
,为简单起见,这些数据服从正态分布:
set.seed(0)
x <- rnorm(1000)
我们执行密度估计(有一些自定义,请参阅 ?density
):
d <- density.default(x, n = 512, cut = 3)
str(d)
# List of 7
# $ x : num [1:512] -3.91 -3.9 -3.88 -3.87 -3.85 ...
# $ y : num [1:512] 2.23e-05 2.74e-05 3.35e-05 4.07e-05 4.93e-05 ...
# ... truncated ...
我们要计算 x = 1
右侧曲线下的面积:
plot(d); abline(v = 1, col = 2)
从数学上讲,这是 [1, Inf]
上的估计密度曲线的数值积分。
估计的密度曲线以离散格式存储在d$x
和d$y
中:
xx <- d$x ## 512 evenly spaced points on [min(x) - 3 * d$bw, max(x) + 3 * d$bw]
dx <- xx[2L] - xx[1L] ## spacing / bin size
yy <- d$y ## 512 density values for `xx`
数值积分有两种方法。
方法一:Riemann Sum
估计密度曲线下的面积为:
C <- sum(yy) * dx ## sum(yy * dx)
# [1] 1.000976
由于黎曼和只是一个近似值,所以这与1(全概率)有一点偏差。我们将此 C
值称为 "normalizing constant".
[1, Inf]
上的数值积分可以近似为
p.unscaled <- sum(yy[xx >= 1]) * dx
# [1] 0.1691366
应该按 C
进一步缩放以进行适当的概率估计:
p.scaled <- p.unscaled / C
# [1] 0.1689718
由于我们模拟的 x
的真实密度是已知的,我们可以将此估计值与真实值进行比较:
pnorm(x0, lower.tail = FALSE)
# [1] 0.1586553
相当接近。
方法二:trapezoidal rule
我们对 (xx, yy)
进行线性插值,并对该线性插值应用数值积分。
f <- approxfun(xx, yy)
C <- integrate(f, min(xx), max(xx))$value
p.unscaled <- integrate(f, 1, max(xx))$value
p.scaled <- p.unscaled / C
#[1] 0.1687369
关于
答案是合法的,但可能是作弊。 OP 的问题从密度估计开始,但答案完全绕过了它。如果允许这样做,为什么不简单地执行以下操作?
set.seed(0)
x <- rnorm(1000)
mean(x > 1)
#[1] 0.163
基数 R 中的经验累积分布函数 ecdf()
使其变得非常容易。以李哲源为例...
#Reproducible sample data
set.seed(0)
x <- rnorm(1000)
#Create empirical cumulative distribution function from sample data
d_fun <- ecdf (x)
#Assume a value for the "red vertical line"
x0 <- 1
#Area under curve less than, equal to x0
d_fun(x0)
# [1] 0.837
#Area under curve greater than x0
1 - d_fun(x0)
# [1] 0.163
关于李哲源对我回答的回应。他们的回答假设你只有密度估计曲线。我的回答假设你有原始数据,这适用于 OP 的问题,因为他们使用 density()
来获得密度估计曲线。