等概率
您可以使用二项式密度函数获得其中恰好 0、1、2 或 3 次发生dbinom
的概率,该函数返回在给定独立尝试总数(第二个参数)的情况下准确获得指定成功次数(第一个参数)的概率) 和每次尝试的成功概率(第三个参数):
dbinom(0:3, 3, 0.05625)
# [1] 0.8405642090 0.1502995605 0.0089582520 0.0001779785
因此,如果您想要至少发生一种情况的概率,那就是:
sum(dbinom(1:3, 3, 0.05625))
# [1] 0.1594358
或者
1 - dbinom(0, 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 减去这个):
p <- c(0.1, 0.2, 0.3)
prod(1-p)
# [1] 0.504
所有的概率是概率的乘积:
prod(p)
# [1] 0.006
最后,恰好一个被选中的概率是其概率的所有元素的总和乘以所有其他元素未被选中的概率:
sum(p * (prod(1-p) / (1-p)))
# [1] 0.398
类似地,准确n-1
被选中的概率(其中n
是概率的数量)为:
sum((1-p) * (prod(p) / p))
# [1] 0.092
不等概率——完整案例
如果您想要每个可能的成功计数的概率,一个选项可能是计算所有2^n
事件组合(这是 A. Webb 在他们的答案中所做的)。相反,以下是 O(n^2) 方案:
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 定义为我们完全i
成功的概率,所有这些都在适当的位置j
或更大。和 的基本情况计算i=0
起来i=1
相对简单,然后我们有以下递归:
P_ij = P_i(j+1) + p_j / (1-p_j) * P_(i-1)(j+1)
在函数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
我们可以在几分之一秒内从 1,000 个元素计算分布,在一分钟内从 10,000 个元素计算分布;计算 2^1000 或 2^10000 个可能的结果将花费非常长的时间(子集的数量分别是 301 位和 3010 位的数字)。