我的问题:
如果出生性别比(男性对女性)为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
我的问题
如何计算女性人数?我正在使用循环来计算女性的数量$(if(s == 1){ W = W + 1 })。 $似乎效率低下。我认为可能计算真或假更有效。
如何更简洁地编写代码?
答案 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)