通过概率分布对个体进行分配

时间:2014-09-11 09:45:42

标签: r distribution sample

我遇到了按地区分配个人的问题。为了简化这一点,我们假设我们有5套,每套都有一个给定(和不断减少)的人口。

S1=1000
S2=100
S3=50
S4=25
S5=5

我想将这些人群分配到区域(例如,10个区域Z1-Z10)。每个区域具有从集合中托管个体的给定概率。

以矩阵形式:

N<-matrix(prob,nrow=5,ncol=10)

每组的N个概率类似于:

0.15  0.05  0.1  0.05 0.05  0.2  0.01 0.09  0.15  0.15
...........
0.15  0.05  0.1  0.05 0.05  0.2  0.01 0.09  0.15  0.15

我想知道每个区域的每一组的结果总数。在第一行没有问题,因为人口很多。只需将1000乘以概率:

S1分配正常:

150  50  100  50 50 200 10  90  150  150  (individuals)

但是,当你设置S3时,popul。 50,舍入并不容易,因为有些区域会少于1个人:

S3分配:

7.5   2.5  5  2.5  2.5  10  0.5 4.5 7.5  7.5 (individuals)

您甚至可以只将1个人分配到10个区域中的一个区域。

如何使用R中的样本函数(样本(数据,大小,概率))或类似函数生成分配矩阵,以计算每个区域的整数个体?

NB:明显在真正的问题上没有。区域的数量要高得多,每个区域的概率也不同。

提前致谢,dev

1 个答案:

答案 0 :(得分:1)

您可以使用rmultinom进行抽样。例如rmultinom(1, S1, prob)。要获得所需的矩阵,只需在sapply中使用它。

t(sapply(c(S1, S2, S3, S4, S5), 
         rmultinom, 
         n=1, 
         prob=prob))
编辑:目前还不完全清楚你的舍入标准是什么。这有两种可能性:

fct <- function(s, prob, method=c("multinom", "maxima")){
  method <- match.arg(method)
  sp <- s*prob
  res <- floor(sp)
  if (sum(res) < s) {
    size <- s-sum(res)
    prob <- sp-res
    if (method=="multinom")
      # rmultinom version
      res <- res + rmultinom(n=1, size=size, prob=prob) 
    if (method=="maxima"){
      # maximum version
      rnk <- rank(prob, ties="random")
      res[rnk <= size] <- res[rnk <= size] + 1
    }
  }
  return(res)
}
t(sapply(c(S1, S2, S3, S4, S5), fct, prob=prob, method="mult"))
t(sapply(c(S1, S2, S3, S4, S5), fct, prob=prob, method="max"))