我有三个不同的事件 (1,2,3),具有不同的概率 (0.15, 0.76, 0.09),我想通过替换抽取 5 次。 我现在可以使用确定可能的组合数量
nsimplex(3,5) ### =21
来自组合包。 我可以使用
确定每个组合的概率mySimplex <- xsimplex(3,5)
myProbs<-c(0.15, 0.76, 0.09)
results<- apply(mySimplex,2,dmultinom,prob=myProbs)
此外,我当然可以通过计算 3^5= 243 来确定排列数。
但是,如果不手动计算同一组合的每个排列,我如何知道绘制它们的频率呢?也就是说,我的每个组合中有多少种排列?
如果我理解正确的话,有 243 种排列可以构建 21 种不同的组合。现在我的问题是,每个组合有多少种排列。例如。组合 {1,1,1,1,1} 将仅构建一次,而其他组合则通过多次排列创建。
我想你可以通过使用每个组合的概率来实现这一点,但我不知道该怎么做?或者有没有其他方法可以在 R 中轻松确定这一点? 预先感谢您。
最佳答案
项目 1 的 a
个不可区分副本、项目 2 的 b
和项目 3 的 c
的排列数量,其中 a + b + c = N
,是N!/(a!b!c!)
。
例如,如果您有 (a,b,c) = (3,1,1)
则有 5!/(3!1!1!) = 20
安排。
c b a a a b a c a a a b a a c a a c a b
c a b a a b a a c a a c b a a a a b c a
c a a b a b a a a c a c a b a a a b a c
c a a a b a b c a a a c a a b a a a b c
b c a a a a b a c a a a c b a a a a c b
一般来说,我们可以这样计算:
nperm<-function(...) {
args<-as.numeric(list(...));
num<-lfactorial(sum(args));
den<-sum(lfactorial(args));
return(round(exp(num-den)));
}
所以,例如,
x<-expand.grid(0:5,0:5,0:5)
x<-x[rowSums(x)==5,]
x[,"nperm"]<-apply(x,1,function(x) do.call(nperm,as.list(x)))
Var1 Var2 Var3 nperm
5 0 0 1
4 1 0 5
3 2 0 10
2 3 0 10
1 4 0 5
0 5 0 1
4 0 1 5
3 1 1 20
2 2 1 30
1 3 1 20
0 4 1 5
3 0 2 10
2 1 2 30
1 2 2 30
0 3 2 10
2 0 3 10
1 1 3 20
0 2 3 10
1 0 4 5
0 1 4 5
0 0 5 1
和 sum(x[,"nperm"]) == 243
,如预期。
关于R:组合学,一种组合的排列数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952715/