You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中计算两条CDF曲线间的面积(含交叉场景)

计算交叉CDF曲线间的上下区域面积

要分别计算交叉CDF曲线间的上下区域面积,核心思路是利用ECDF的阶梯特性,将整个数据区间拆分为多个子区间,分别计算每个子区间内两条CDF差异的面积,再按正负性累加得到两个区域的总面积。

实现步骤

  1. 定义两条数据的ECDF函数及差异函数;
  2. 收集所有数据点作为阶梯分割点,将整个区间拆分为ECDF保持恒定的子区间;
  3. 遍历每个子区间,计算该段的差异面积,按正负分别累加到对应区域的总面积中。

代码示例

# 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:57:22