R:组合数,一个组合的排列数

时间:2015-08-11 22:00:36

标签: r combinations permutation combinatorics

我有三个不同的事件(1,2,3)具有不同的概率(0.15,0.76,0.09),我想用替换画5次。 我现在可以使用

确定可能的组合数
nsimplex(3,5)  ### =21
来自combinat-package的

。 我可以使用

确定每种组合的概率
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中轻松确定吗? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

项目3的a无法区分的副本的排列数,b,项目3的c,其中a + b + c = NN! / (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,正如所料。

答案 1 :(得分:1)

为了使这个可重现,我需要使用set.seed(<some_value>),但这只是尝试使用sample绘制不同的组合(不考虑排列不同。如果排列被认为是不同的,然后取出sort步骤:

table(                    # get the counts of distinct combinations
   apply(                 # this will collapse values by column
      replicate(100000,   # yields a 100,000 column matrix
             {sample(c("1","2","3"), 5 ,repl=TRUE, prob=c(.5,.25,.25) )}), 
           2, function(x) paste(sort(x), collapse=".")) )

1.1.1.1.1 1.1.1.1.2 1.1.1.1.3 1.1.1.2.2 1.1.1.2.3 1.1.1.3.3 1.1.2.2.2 
     3090      7705      8144      7851     15408      7649      3997 
1.1.2.2.3 1.1.2.3.3 1.1.3.3.3 1.2.2.2.2 1.2.2.2.3 1.2.2.3.3 1.2.3.3.3 
    11731     11554      3940       949      3844      5955      4019 
1.3.3.3.3 2.2.2.2.2 2.2.2.2.3 2.2.2.3.3 2.2.3.3.3 2.3.3.3.3 3.3.3.3.3 
      961        99       506       990       997       510       101 

A.Webb建议我们将理论dmultinom与实践进行比较:

dmultinom(c(4,1,0),prob=c(0.5,0.25,0.25))*2
[1] 0.15625

因此,对于第一个值3125的预测看起来与3090时的模拟和第二个和第三个值以及7812.5对比7705和8144相比是可以准确的。