我遇到了按地区分配个人的问题。为了简化这一点,我们假设我们有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
答案 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"))