为什么 ecdf 使用阶跃函数而不是线性插值?

机器算法验证 r 分布 经验累积分布
2022-03-25 02:52:17

经验 CDF 函数通常由阶跃函数估计。是否有理由以这种方式而不是通过使用线性插值来完成?阶跃函数是否有任何有趣的理论特性让我们更喜欢它?

以下是两者的示例:

ecdf2 <- function (x) {
  x <- sort(x)
  n <- length(x)
  if (n < 1) 
    stop("'x' must have 1 or more non-missing values")
  vals <- unique(x)
  rval <- approxfun(vals, cumsum(tabulate(match(x, vals)))/n, 
                    method = "linear", yleft = 0, yright = 1, f = 0, ties = "ordered")
  class(rval) <- c("ecdf", class(rval))
  assign("nobs", n, envir = environment(rval))
  attr(rval, "call") <- sys.call()
  rval
}


set.seed(2016-08-18)
a <- rnorm(10)
a2 <- ecdf(a)
a3 <- ecdf2(a)

par(mfrow = c(1,2))
curve(a2, -2,2, main = "step function ecdf")
curve(a3, -2,2, main = "linear interpolation function ecdf")

在此处输入图像描述

1个回答

这是根据定义。

一组观测值的经验分布函数(Xn)定义为

Fe(t)=#{XnXnt}n

在哪里#是集合基数。这本质上是一个阶跃函数。它几乎肯定会收敛到实际的 CDF

另请注意,对于任何具有P(X=x)0至少两个x(尤其是非退化离散分布),您的 ECDF 变体不会收敛到实际的 CDF。例如,考虑带有 CDF 的伯努利分布

FX(x)=pχx0+(1p)χx1
这是一个阶跃函数,而 ecdf2 将收敛到χx0(p+(1p)min(x,1))(一个分段线性函数连接(0,p)(1,1).