R-找到给定宇宙中每个子集的概率

R-找到给定宇宙中每个子集的概率,r,combinations,combinatorics,probability-theory,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/10)*(1-2/10))=0.28 3) 一个人拥有2种产品==>(1/10)*(2/10)=0.02 但是,我希望有一个通用算法,如果有n个产品,它可以对所有这些选项进行排序 输入如下所示 U我认为一个封闭形式的解决方案会涉及太多的术语

让我从我的问题的一个简单例子开始

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

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

但是,我希望有一个通用算法,如果有n个产品,它可以对所有这些选项进行排序

输入如下所示

U我认为一个封闭形式的解决方案会涉及太多的术语,变得过于复杂。所以这个问题看起来是蒙特卡罗方法的完美候选

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
set.seed(1984年)

我建议你拿起一本统计学导论书,让自己了解如何做到这一点。一旦你弄清楚了它在理论上是如何工作的,你就可以开始把它翻译成R。在你达到这个阶段之前,StackOverflow不是问这个问题的地方,因为它围绕着编程问题。您可以尝试将问题简化为统计理论,并将其转移到SE统计网站CrossValidated。产品如何在不同人群中分布?@Paul,谢谢您的评论。也许我没有给人留下正确的印象。在我的研究和埃因霍温技术大学期间,我得到了微积分和统计数据。所以我确实理解问题背后的数学原理,但是我在为计算机编写这些算法方面的经验较少。@e4f4;对于n个产品,我指的是额外的产品,所以在我的例子中,产品C,D,…,等等。@Sloot,我明白了,但是我们假设3个人拥有C等等吗?这确实是我想要的!非常感谢你!现在输出是这样的:)我认为代码需要更多的注释/解释。我很高兴你发现它很有用。是的,如果你能解释一下循环是如何工作的,我将不胜感激。我了解取样部分,但不了解如何存储结果并最终使用这些结果。如果你熟悉蒙特卡罗方法,实验将反复进行,并取平均值。这就是外循环。现在,实验——在第一个内循环中,生成拥有某些产品的人员列表,并附加所有产品。这可能有重复的值,这意味着一个人拥有多个产品。