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
分配给 1
、2
和 3
中的每一个。您可以假设 x
和 p
已按上述方式适当排序(即 x
的每个分量在 p
中都有对应的概率),而 x
在升序如上。你应该 而不是 假设 x
只接受整数值,你应该 而不是 假设 p
在每个组件。在我的实际问题中,x
和p
可以是长度约为100
.
的向量
我想输出一个函数(不是图表,就像我从其他示例中看到的那样)输出等于概率质量函数的累积分布函数的值上面在 R 中给出,仅使用 x
和 p
.
对于概率背景:如果你对概率不熟悉,累积分布函数就是你得到的值小于或等于某个值的概率。我们称其为“特定值”t
.
如果我给你任何值t < 1
,那么根据上面的例子,累积分布函数应该输出0
,因为没有概率被分配给小于1
的值.
假设我给你一个值t
满足t >= 1
和t < 2
。那么在这个区间内,分配给1
的概率是1/3
,因此对于t >= 1
和t < 2
,累积分布函数应该输出1/3
。
如果t >= 2
和t < 3
,到此为止,根据前面的讨论,我们从前面的步骤中得到1/3
的概率,以及1/3
在 t = 2
。因此,如果 t >= 2
和 t < 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)
}
}
然而,从我的角度来看,这里的困难在于生成基于向量 x
和 p
的 if
语句。
再次强调:CDF 应该只依赖于 t
作为参数,并且应该很容易从 x
和 p
生成。有必要允许 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
考虑以下简化示例:
x <- c(1, 2, 3)
p <- rep(1, times = 3)/3
这表明我有一个离散概率分布,概率 1/3
分配给 1
、2
和 3
中的每一个。您可以假设 x
和 p
已按上述方式适当排序(即 x
的每个分量在 p
中都有对应的概率),而 x
在升序如上。你应该 而不是 假设 x
只接受整数值,你应该 而不是 假设 p
在每个组件。在我的实际问题中,x
和p
可以是长度约为100
.
我想输出一个函数(不是图表,就像我从其他示例中看到的那样)输出等于概率质量函数的累积分布函数的值上面在 R 中给出,仅使用 x
和 p
.
对于概率背景:如果你对概率不熟悉,累积分布函数就是你得到的值小于或等于某个值的概率。我们称其为“特定值”t
.
如果我给你任何值t < 1
,那么根据上面的例子,累积分布函数应该输出0
,因为没有概率被分配给小于1
的值.
假设我给你一个值t
满足t >= 1
和t < 2
。那么在这个区间内,分配给1
的概率是1/3
,因此对于t >= 1
和t < 2
,累积分布函数应该输出1/3
。
如果t >= 2
和t < 3
,到此为止,根据前面的讨论,我们从前面的步骤中得到1/3
的概率,以及1/3
在 t = 2
。因此,如果 t >= 2
和 t < 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)
}
}
然而,从我的角度来看,这里的困难在于生成基于向量 x
和 p
的 if
语句。
再次强调:CDF 应该只依赖于 t
作为参数,并且应该很容易从 x
和 p
生成。有必要允许 t
是向量 x
.
我认为我正在寻找的伪代码:
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