首页 > 解决方案 > 有没有办法计算ecdf的面积?

问题描述

我有这种数据集

    B_dong  A_dong count      mean count2
14 1118053 1118053    15  129.7333     15
16 1118053 1118055    18  171.8333     33
19 1118053 1118060     4  270.7500     37
13 1118053 1118052    13  374.8462     50
17 1118053 1118057    21  389.9524     71
20 1118053 1118061     9  418.0000     80
15 1118053 1118054    10  435.1000     90
1  1118053 1102054     2 3066.0000    237
44 1118053 1122060     2 3080.0000    239
2  1118053 1102059     1 4867.0000    240




 test2 <- structure(list(B_dong = c(1118053L, 1118053L, 1118053L, 1118053L,1118053L, 1118053L, 1118053L, 1118053L, 1118053L, 1118053L),A_dong = c(1118053L, 1118055L, 1118060L, 1118052L, 1118057L,1118061L, 1118054L, 1102054L, 1122060L, 1102059L), count = c(15L,18L, 4L, 13L, 21L, 9L, 10L, 2L, 2L, 1L), mean = c(129.733333333333,171.833333333333, 270.75, 374.846153846154, 389.952380952381,418, 435.1, 3066, 3080, 4867), count2 = c(15L, 33L, 37L,50L, 71L, 80L, 90L, 237L, 239L, 240L)), row.names = c(14L,16L, 19L, 13L, 17L, 20L, 15L, 1L, 44L, 2L), class = "data.frame") 

我用这个数据集绘制了一个 ecdf

plot(ecdf(test2$mean), ylab="Fn(x)", verticals = FALSE,
     col.01line = "gray70", pch = 19) 

有没有办法可以计算 R 中 ecdf 图的面积(积分)?

标签: r

解决方案


当然。如果您查看该图,它实际上是一系列矩形(添加了红线):

segments(sort(unique(test2$mean)), 0,
         sort(unique(test2$mean)), ecdf(test2$mean)(sort(unique(test2$mean))),
         col = "red")

带有垂直线的 ecdf 图

每个“台阶”下的区域仅仅是每个矩形的宽度和高度。

宽度只是每个唯一值之间的差异(已排序):

diff(sort(unique(test2$mean)))
# [1]   42.10000   98.91667  104.09615   15.10623   28.04762   17.10000 2630.90000   14.00000 1787.00000

高度是ecdf根据这些值的调用返回值函数凭经验找到的:

ecdf(test2$mean)(sort(unique(test2$mean)))
#  [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

由于宽度了一个(最右边的总是一个点……我们都知道一个点下的面积为零),我们可以丢弃最后一个高度。

所以我们只是将高度乘以宽度并将它们相加:

sum(
  head(ecdf(test2$mean)(sort(unique(test2$mean))), n = -1) *
    diff(sort(unique(test2$mean)))
)
# [1] 3546.678

推荐阅读