如何解决返回 CDF作为函数给定值向量及其对应的概率 矢量化
考虑以下简化示例:
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}} 在 1/3
。因此,如果 t = 2
和 t >= 2
,累积分布函数应该输出 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)
}
}
和 if
生成 x
语句。
再次强调:CDF 应该只依赖于 p
作为参数,并且应该很容易从 t
和 x
生成。必须允许 p
是向量 t
中NOT 的值。
我认为我正在寻找的伪代码:
x
解决方法
你基本上就在那里。
把它放在你正在创建的函数体中:
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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。