如何得到R中两个交叉ecdf的交点?

bjp0bcyl  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(115)

我有两个ecdf图使用下面的代码:

ecdf1 <- ecdf(data1)
ecdf2 <- ecdf(data2)

这些地块相互交叉,我需要取交叉点(交点)坐标,在R中该怎么做呢?

bsxbgnwa

bsxbgnwa1#

让我们创建一个可重现的示例来演示:

set.seed(1)

data1 <- rnorm(50) + 1.2
data2 <- rexp(50)

现在我们使用您的代码创建两个ecdf函数:

ecdf1 <- ecdf(data1)
ecdf2 <- ecdf(data2)

如果我们绘制它们,我们将看到这些曲线相交于两点:一次在0和1之间,并且再一次刚好大于2。

plot(ecdf1, col = "red")
plot(ecdf2, col = "blue", add = TRUE)

为了找到这些精确的点,我们创建一个x的函数,它是x处两个ecdf函数之间的差。然后我们使用函数uniroot来确定这个差函数在哪里等于0:

diff_func <- function(x) ecdf1(x) - ecdf2(x)

root1 <- uniroot(diff_func, c(0, 1))$root # Finds the lower intersection
root2 <- uniroot(diff_func, c(2, 3))$root # Finds the upper intersection

我们可以检查结果是否合理:

root1
#> [1] 0.1568627
root2
#> [1] 2.055556

甚至证明交点的地块也是正确的:

segments(root1, y0 = 0, y1 = ecdf1(root1), lty = 2)
segments(root2, y0 = 0, y1 = ecdf1(root2), lty = 2)

创建于2023年2月26日,使用reprex v2.0.2

相关问题