R的出生性别比模拟

时间:2012-10-23 13:23:18

标签: r

我的问题:

如果出生性别比(男性对女性)为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. 如何更简洁地编写代码?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

答案 2 :(得分: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)