如何在R中计算两条CDF曲线间的面积(含交叉场景)
计算交叉CDF曲线间的上下区域面积
要分别计算交叉CDF曲线间的上下区域面积,核心思路是利用ECDF的阶梯特性,将整个数据区间拆分为多个子区间,分别计算每个子区间内两条CDF差异的面积,再按正负性累加得到两个区域的总面积。
实现步骤
- 定义两条数据的ECDF函数及差异函数;
- 收集所有数据点作为阶梯分割点,将整个区间拆分为ECDF保持恒定的子区间;
- 遍历每个子区间,计算该段的差异面积,按正负分别累加到对应区域的总面积中。
代码示例
# 1. 模拟示例数据(可替换为你的实际数据) set.seed(123) x <- rnorm(100, mean = 0, sd = 1) y <- rnorm(100, mean = 0.5, sd = 1.5) # 2. 定义ECDF函数与差异函数 ecdf_x <- ecdf(x) ecdf_y <- ecdf(y) diff_fun <- function(t) ecdf_x(t) - ecdf_y(t) # 3. 获取所有阶梯分割点并排序 split_points <- sort(unique(c(x, y))) # 4. 初始化两个区域的面积 area_positive <- 0 # 红色CDF在绿色上方的区域面积 area_negative <- 0 # 红色CDF在绿色下方的区域面积 # 5. 遍历每个子区间计算面积 for (i in seq_along(split_points)[-length(split_points)]) { left <- split_points[i] right <- split_points[i + 1] # 取区间中点获取恒定的差异值 diff_val <- diff_fun((left + right) / 2) # 计算当前子区间的面积 segment_area <- diff_val * (right - left) # 按正负累加面积 if (segment_area > 0) { area_positive <- area_positive + segment_area } else { area_negative <- area_negative + abs(segment_area) } } # 输出结果 cat("红色在绿色上方的区域面积:", round(area_positive, 4), "\n") cat("红色在绿色下方的区域面积:", round(area_negative, 4), "\n")
说明
- 若两条CDF无交叉,其中一个区域面积会为0,另一个区域面积与你原代码计算的总面积一致;
- 利用ECDF的阶梯特性直接计算子区间面积,比
integrate函数更高效且结果准确,避免了寻找交点的复杂操作。
内容的提问来源于stack exchange,提问作者Nmgh
相关产品推荐
相关产品推荐

