Return CDF(作为函数)给定一个值向量及其对应的概率

Return CDF (as a function) given a vector of values and their corresponding probabilities

考虑以下简化示例:

x <- c(1, 2, 3)
p <- rep(1, times = 3)/3

这表明我有一个离散概率分布,概率 1/3 分配给 123 中的每一个。您可以假设 xp 已按上述方式适当排序(即 x 的每个分量在 p 中都有对应的概率),而 x 在升序如上。你应该 而不是 假设 x 只接受整数值,你应该 而不是 假设 p 在每个组件。在我的实际问题中,xp可以是长度约为100.

的向量

我想输出一个函数(不是图表,就像我从其他示例中看到的那样)输出等于概率质量函数的累积分布函数的值上面在 R 中给出,仅使用 xp.


对于概率背景:如果你对概率不熟悉,累积分布函数就是你得到的值小于或等于某个值的概率。我们称其为“特定值”t.

如果我给你任何值t < 1,那么根据上面的例子,累积分布函数应该输出0,因为没有概率被分配给小于1的值.

假设我给你一个值t满足t >= 1t < 2。那么在这个区间内,分配给1的概率是1/3,因此对于t >= 1t < 2,累积分布函数应该输出1/3

如果t >= 2t < 3,到此为止,根据前面的讨论,我们从前面的步骤中得到1/3的概率,以及1/3t = 2。因此,如果 t >= 2t < 3,累积分布函数应该输出 2/3.

如果t >= 3,累积分布函数应该输出1


我们理论上可以按如下方式编写此函数,并让 t 成为唯一的参数:

x_cdf <- function(t) {
  if (t < 1) {
    return(0)
  }
  if (t >= 1 & t < 2) {
    return(1/3)
  }
  if (t >= 2 & t < 3) {
    return(2/3)
  }
  if (t >= 3) {
    return(1)
  }
}

然而,从我的角度来看,这里的困难在于生成基于向量 xpif 语句。

再次强调:CDF 应该只依赖于 t 作为参数,并且应该很容易从 xp 生成。有必要允许 t 是向量 x.

中的 NOT 的值

我认为我正在寻找的伪代码:

generate_cdf <- function(x, p) {
  cdf <- function(t) {
    # some stuff here that depends on x and p that I'm not sure how to code
  }
  return(cdf)
}

你基本上就在那里。

将其放入您正在创建的函数体中:

sum( p[ x <= t ] )

generate_cdf <- function(x, p) {
    cdf <- function(t) {
        sum( p[ x <= t ] )
    }
    return(cdf)
}

f <- generate_cdf(x, p)

cbind( 0:4, sapply( 0:4, f ) )

输出:


> cbind( 0:4, sapply( 0:4, f ) )
     [,1]      [,2]
[1,]    0 0.0000000
[2,]    1 0.3333333
[3,]    2 0.6666667
[4,]    3 1.0000000
[5,]    4 1.0000000

向量化

为了增加技巧,您也可以 Vectorize 它,让它一次处理多个值:


generate_cdf <- function(x, p) {
    cdf <- function(t) {
        sum( p[ x <= t ] )
    }
    return(Vectorize(cdf))
}

f <- generate_cdf(x, p)

f( c(1,2) ) # outputs [1] 0.3333333 0.6666667