R 三个或三个以上集合并的概率

R 三个或三个以上集合并的概率,r,probability,set-intersection,set-union,R,Probability,Set Intersection,Set Union,考虑以下几组概率(这三个事件并不相互排斥): 0.05625成功,0.94375失败 0.05625成功,0.94375失败 0.05625成功,0.94375失败 我如何计算至少一个事件发生的概率(即联合) 如果可能的话,我更喜欢一个通用的、自包含的解决方案,它还可以处理4个或更多的事件。在这种情况下,我要寻找的答案是: 0.05625 + 0.05625 + 0.05625 - 0.05625*0.05625 - 0.05625*0.05625 - 0.05625*0.05625 + 0

考虑以下几组概率(这三个事件并不相互排斥):

  • 0.05625成功,0.94375失败
  • 0.05625成功,0.94375失败
  • 0.05625成功,0.94375失败
我如何计算至少一个事件发生的概率(即联合)

如果可能的话,我更喜欢一个通用的、自包含的解决方案,它还可以处理4个或更多的事件。在这种情况下,我要寻找的答案是:

0.05625 + 0.05625 + 0.05625 -
0.05625*0.05625 - 0.05625*0.05625 - 0.05625*0.05625 +
0.05625*0.05625*0.05625
##[1] 0.1594358
我的问题最终比标题要宽泛一点,因为我在寻找可以计算并集、相交概率的函数(
0.05625*0.05625*0.05625=0.0001779785
),没有事件发生(
1-0.1594358=0.8405642
),或者只有一个事件发生(
0.150300
)。换句话说,这是一个在线解决方案。我已经研究了
prob
包,但是它的界面对于这样一个简单的用例来说太复杂了

等概率 使用二项式密度函数[code>dbinom可以精确获得其中0、1、2或3的概率,该函数返回给定独立尝试总数(第二个参数)和每次尝试成功概率的精确指定成功次数(第一个参数)的概率(第三个论点):

如果你想知道至少发生一次的概率,那就是:

sum(dbinom(1:3, 3, 0.05625))
# [1] 0.1594358

dbinom
函数还可以解决您的其他问题。例如,所有发生的概率为:

dbinom(3, 3, 0.05625)
# [1] 0.0001779785
恰好一个的概率为:

dbinom(1, 3, 0.05625)
# [1] 0.1502996
无的概率为:

dbinom(0, 3, 0.05625)
# [1] 0.8405642
不等概率——一些简单的例子 如果向量
p
中存储的概率不相等,并且每个项都是独立选择的,则需要做更多的工作,因为
dbinom
函数不适用。不过,有些计算非常简单

未选择任何项目的概率仅为1减去概率的乘积(至少选择一个项目的概率仅为1减去该概率):

最后,恰好一个被选择的概率是其概率的所有元素的总和乘以所有其他元素未被选择的概率:

sum(p * (prod(1-p) / (1-p)))
# [1] 0.398
类似地,选择
n-1
的概率(其中
n
是概率数)为:

不等概率——完全情形 如果您想要获得每一次成功计数的概率,一个选项可以是计算所有
2^n
事件组合(这是A.Webb在其答案中所做的)。相反,以下是一个O(n^2)方案:

在函数
cp.quadratic
中,我们循环增加
i
,填写
p
矩阵(即
n
x
n
),因此总运算计数为O(n^2)

例如,这使您能够在一秒钟内计算大量选项的分布:

system.time(cp.quadratic(sample(c(.1, .2, .3), 100, replace=T)))
#    user  system elapsed 
#   0.005   0.000   0.006 
system.time(cp.quadratic(sample(c(.1, .2, .3), 1000, replace=T)))
#    user  system elapsed 
#   0.165   0.043   0.208 
system.time(cp.quadratic(sample(c(.1, .2, .3), 10000, replace=T)))
#    user  system elapsed 
#  12.721   3.161  16.567 

我们可以在几分之一秒内从1000个元素计算分布,在不到一分钟的时间内从10000个元素计算分布;计算2^1000或2^10000个可能的结果将花费非常长的时间(子集的数量分别为301位和3010位).

这里有一个函数,它创建所有事件组合,计算它们的概率,并按发生次数进行聚合

cp <- function(p) 
{
  ev <- do.call(expand.grid,replicate(length(p),0:1,simplify=FALSE))
  pe <- apply(ev,1,function(x) prod(p*(x==1)+(1-p)*(x==0)))
  tapply(pe,rowSums(ev),sum)
}
0 1 2 3 0.504 0.398 0.092 0.006
例如,恰好两个独立事件发生的概率为0.092。

所有事件的概率都相同吗?@Heroka在这个特定的例子中,是的。但它们不一定是相同的。我正在寻找一个通用的解决方案,当所有事件的概率都可能不同时。所以使用
cp()
至少一个事件发生的概率是:
sum(cp(c(0.1,0.2,0.3))[-1])=0.496
。谢谢!
cp.quadratic()
对我来说非常有效。与
cp()
一样,计算至少一个事件发生的概率是:
sum(cp.quadratic(c(c(0.1,0.2,0.3))[-1])=0.496
prod(p)
# [1] 0.006
sum(p * (prod(1-p) / (1-p)))
# [1] 0.398
sum((1-p) * (prod(p) / p))
# [1] 0.092
cp.quadratic <- function(p) {
  P <- matrix(0, nrow=length(p), ncol=length(p))
  P[1,] <- rev(cumsum(rev(p * prod(1-p) / (1-p))))
  for (i in seq(2, length(p))) {
    P[i,] <- c(rev(cumsum(rev(head(p, -1) / (1-head(p, -1)) * tail(P[i-1,], -1)))), 0)
  }
  c(prod(1-p), P[,1])
}
cp.quadratic(c(0.1, 0.2, 0.3))
# [1] 0.504 0.398 0.092 0.006
P_ij = P_i(j+1) + p_j / (1-p_j) * P_(i-1)(j+1)
system.time(cp.quadratic(sample(c(.1, .2, .3), 100, replace=T)))
#    user  system elapsed 
#   0.005   0.000   0.006 
system.time(cp.quadratic(sample(c(.1, .2, .3), 1000, replace=T)))
#    user  system elapsed 
#   0.165   0.043   0.208 
system.time(cp.quadratic(sample(c(.1, .2, .3), 10000, replace=T)))
#    user  system elapsed 
#  12.721   3.161  16.567 
cp <- function(p) 
{
  ev <- do.call(expand.grid,replicate(length(p),0:1,simplify=FALSE))
  pe <- apply(ev,1,function(x) prod(p*(x==1)+(1-p)*(x==0)))
  tapply(pe,rowSums(ev),sum)
}
cp(c(0.1,0.2,0.3))
0 1 2 3 0.504 0.398 0.092 0.006