有什么方法可以计算ecdf的面积吗?

时间:2019-12-24 02:23:20

标签: r

我有这种数据集

    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图的面积(积分)?

1 个答案:

答案 0 :(得分:3)

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

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

ecdf plot with vertical lines

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

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

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