从直方图计数到cdf

时间:2014-03-24 13:33:44

标签: r

我有一个数据框,我有值,每个值我都有与该值相关的计数。因此,根据值绘制计数给出了直方图。我有三种类型,abc

              value  counts     type
                   0 139648267  a
                   1  34945930  a
                   2   5396163  a
                   3   1400683  a
                   4    485924  a
                   5    204631  a
                   6     98599  a
                   7     53056  a
                   8     30929  a
                   9     19556  a
                  10     12873  a
                  11      8780  a
                  12      6200  a
                  13      4525  a
                  14      3267  a
                  15      2489  a
                  16      1943  a
                  17      1588  a
                 ...     ...   ...

如何从此获得CDF?

到目前为止,我的方法效率极低:我首先编写一个函数,将计数总结到该值:

get_cumulative <- function(x) {
  result <- numeric(nrow(x))
   for (i in seq_along(result)) {
   result[i] = sum(x[x$num_groups <= x$num_groups[i], ]$count)
  }
  x$cumulative <- result
  x
}

然后我将它包装在按类型分割的ddply中。这显然不是最好的方式,我喜欢任何有关如何继续的建议。

3 个答案:

答案 0 :(得分:3)

您可以使用avecumsum(假设您的数据位于df并按值排序):

transform(df, cdf=ave(counts, type, FUN=function(x) cumsum(x) / sum(x)))

这是一个玩具示例:

df <- data.frame(counts=sample(1:100, 10), type=rep(letters[1:2], each=5))
transform(df, cdf=ave(counts, type, FUN=function(x) cumsum(x) / sum(x)))

产生:

   counts type       cdf
1      55    a 0.2750000
2      61    a 0.5800000
3      27    a 0.7150000
4      20    a 0.8150000
5      37    a 1.0000000
6      45    b 0.1836735
7      79    b 0.5061224
8      12    b 0.5551020
9      63    b 0.8122449
10     46    b 1.0000000

答案 1 :(得分:1)

如果您的数据位于data.frame DF中,则应执行以下操作

do.call(rbind, lapply(split(DF, DF$type), FUN=cumsum))

答案 2 :(得分:0)

CRAN上的HistogramTools软件包具有多种函数,用于在直方图和CDF之间进行转换,计算信息丢失或错误边距,以及绘制函数以帮助解决此问题。

如果你有直方图h,那么计算基础数据集的经验CDF就像这样简单:

library(HistogramTools)
h <- hist(runif(100), plot=FALSE)
plot(HistToEcdf(h))

如果您首先需要将中断和计数的输入数据转换为R直方图对象,请先查看PreBinnedHistogram函数。