我有两个ecdf图使用下面的代码:
ecdf1 <- ecdf(data1) ecdf2 <- ecdf(data2)
这些地块相互交叉,我需要取交叉点(交点)坐标,在R中该怎么做呢?
bsxbgnwa1#
让我们创建一个可重现的示例来演示:
set.seed(1) data1 <- rnorm(50) + 1.2 data2 <- rexp(50)
现在我们使用您的代码创建两个ecdf函数:
如果我们绘制它们,我们将看到这些曲线相交于两点:一次在0和1之间,并且再一次刚好大于2。
plot(ecdf1, col = "red") plot(ecdf2, col = "blue", add = TRUE)
为了找到这些精确的点,我们创建一个x的函数,它是x处两个ecdf函数之间的差。然后我们使用函数uniroot来确定这个差函数在哪里等于0:
uniroot
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
1条答案
按热度按时间bsxbgnwa1#
让我们创建一个可重现的示例来演示:
现在我们使用您的代码创建两个ecdf函数:
如果我们绘制它们,我们将看到这些曲线相交于两点:一次在0和1之间,并且再一次刚好大于2。
为了找到这些精确的点,我们创建一个x的函数,它是x处两个ecdf函数之间的差。然后我们使用函数
uniroot
来确定这个差函数在哪里等于0:我们可以检查结果是否合理:
甚至证明交点的地块也是正确的:
创建于2023年2月26日,使用reprex v2.0.2