1

我的问题:

如果出生时的性别比(男性与女性)为 1.1,但人们采取以下策略:生孩子直到有一个儿子,然后停止,除非您有 12 个女儿(在这种情况下,您也停止)。人口的平均性别比是多少?(通过模拟计算。假设您随机选择10,000个家庭。)

我的代码

  pm=0.5238095 # Probability of Male
  pw=0.4761905 #                Female
  w=0          # initial number of Female
  n=1          # loop
  p=0          # count of number 
  for(i in 1:n){
  s=rbinom(1,1,0.4761905)
  if(s==1){
  w=w+1
  }
   p=p+1
 while(w<=12){ ####1. How to count the number of female? ###
 while(s==1){
 s=rbinom(1,1,0.4761905)
 if(s==1){
  w=w+1
 }
  p=p+1
 }
 }
  f[i]=p
 }
 w/p

我的问题

  1. 如何计算女性的数量?我正在使用循环来计算女性的数量$(if(s==1){ w=w+1 })。$它似乎效率低下。我认为计算真假可能更有效。

  2. 如何写代码更简洁?

4

3 回答 3

4

答案当然是,这个策略根本不会影响性别比例!至少按照您的设置,无论一对夫妇以前的生育史是什么,每次生育男性的概率总是相同的。

这是通过一些计算来确认这一点的一种方法。(代码没有进一步解释,至少现在是这样。):

pm <- 0.5238095
m <- cbind(boys=c(rep(1, 12), 0), girls=0:12)
p <- c(dgeom(0:11, pm), 1-pgeom(11, pm))

## Calculate expected number of boys and girls for an immortal couple pursuing
## this "strategy"
(res <- p %*% m)
#           boys     girls
# [1,] 0.9998641 0.9089674
p[1] / sum(p)
# [1] 0.5238095   ## Look familiar
于 2012-10-23T14:09:09.187 回答
3

是的,这是非常低效的。也许我可以只解决几件几乎有意义的事情,它会给你答案。在您的代码中...

 for(i in 1:n){
    s=rbinom(1,1,0.4761905)
    if(s==1){
    w=w+1
 }

可以改写为...

 s = rbinom(n,1,0.4761905)     
 w = sum(s)

这是同样的结果。请记住,rbinom 会产生 0 和 1。您只需将它们相加即可知道有多少个 1。鉴于您定义了 n,那么 0(女性)的数量是......

 n - w

但是,如果你不这样做,它也很容易找到......

length(s) - sum(s)
于 2012-10-23T13:45:12.743 回答
3

它仍然可能效率低下,但至少它对于您正在尝试做的事情是正确的:

# set.seed(1)
pw <- 0.4761905 # Initial sex ratio
w <- 0 # number of daughters
n <- 10000 # number of families
p <- 0 # number of kids 
f <- data.frame(Daughters=vector(length=n), Kids=vector(length=n))
for(i in 1:n){
    while(w < 12 & w==p){ #As long as you don't have 12 daughters or 1 son...
    s <- rbinom(1,1,pw)
    if(s==1){w <- w+1}
    p <- p+1
    }
f[i,] <- c(w,p) #Number of daughter and total kids in each families
w <- p <- 0 # Reset number of kids and daughters for the next family
}
colSums(f)[1]/colSums(f)[2] #Final sex ratio
Daughters 
0.4736842 # So as @JoshO'Brien pointed out, very close to the original sex ratio.

并且您可以验证向量f以查看永远不会超过 1 个儿子(孩子的数量减去女儿的数量):

range(f[,2]-f[,1])
[1] 1 1 # Range of the number of boys per family
range(f[,1])
[1]  0 11 # Range of the number of daughters per family
nrow(f[f[,1]==0,])
[1] 5275 # Number of families having 1 son and no daughters (to be compared with 1-pw)
于 2012-10-23T13:50:16.470 回答