R - 查找给定Universe中每个子集的机会

时间:2013-05-07 07:28:36

标签: r combinations combinatorics probability-theory

让我先从一个简单的问题示例开始。

假设一个10人的世界,其中1人拥有产品A,2人拥有产品B
U = 10,A = 1,B = 2

现在我想找到机会:
1)一个人没有产品==> (1 - 1/10)*(1 - 2/10)= 0.72
2)一个人拥有至少1个产品==> 1 - ((1 - 1/10)*(1 - 2/10))= 0.28
3)一个人拥有2个产品==> (1/10)*(2/10)= 0.02

但是,如果有 n 产品,我希望有一个通用算法来排除所有这些选项。

输入如下: U <- 10
products <- c('A','B')
owned_by <- c(1, 2)
df <- data.frame(products, owned_by)

1 个答案:

答案 0 :(得分:0)

我认为封闭式解决方案涉及的条款太多而且过于复杂。所以这个问题看起来像是蒙特卡罗方法的完美候选者。

set.seed(1984)

U <- 10
products <- c('A','B')
owned_by <- c(1,2) 
df <- data.frame(products, owned_by)
p = rep(0, nrow(df)+1)
num.runs = 1000

for(n in 1:num.runs)
{
  x=c()  ## list of people who own a product
  for (i in 1:nrow(df))
    x = c(x, sample(1:U, df$owned_by[i]))

  ## get the number of people who own 0, 1, 2...products
  p[1] = p[1] + (sum(hist(x,breaks=0:U,plot=F)$counts == 0) / U)
  for(i in 1:nrow(df))
    p[i+1] = p[i+1] + (sum(hist(x,breaks=0:U,plot=F)$counts >= i) / U)
}

p = p / num.runs ## average over all runs
p

## 0.7197 0.2803 0.0197