使用R和直方图数据绘制ECDF

时间:2013-01-24 06:48:58

标签: r

我有

形式的直方图数据
Key  |  #occurences_of_key
--------------------------
 -10 | 1200
   0 | 1000
  10 | 700
  33 | 500
  67 | 200
  89 | 134
--------------------------

制作代码:

structure(c(-10, 0, 10, 33, 67, 89, 1200, 1000, 700, 500, 200, 134), .Dim = c(6L, 2L))

我想使用Empirical Cumulative Distribution Chart (percentile chart)使用此数据绘制R。我是R的新手,所以我很感激任何指针。我读到了ecdf中可用的R函数,但我很难遵循。

2 个答案:

答案 0 :(得分:3)

我能想到的一种方法是使用rep重建原始数据并在其上使用ecdf

mat <- structure(c(-10, 0, 10, 33, 67, 89, 1200, 1000, 700, 500, 200, 134), .Dim = c(6L, 2L))

original <- unlist(apply(mat, 1, function(x) rep(x[1], x[2])))

original_ecdf <- ecdf(original)

plot(original_ecdf)

enter image description here

答案 1 :(得分:2)

如果您的数据很大(这就是为什么在加载到R之前预先制表表格的原因),您不希望再次生成一些“虚拟”数据。您可以破解ecdf的实施以接受列表数据:

tab_ecdf <- function (xs, counts) 
{
  n <- sum(counts)
  if (n < 1) 
    stop("'x' must have 1 or more non-missing values")
  rval <- approxfun(xs, cumsum(counts) / n, 
                    method = "constant", yleft = 0, yright = 1, f = 0, ties = "ordered")
  class(rval) <- c("ecdf", "stepfun", class(rval))
  assign("nobs", n, envir = environment(rval))
  attr(rval, "call") <- sys.call()
  rval
}

然后使用它而不是原始的ecdf()函数。