1

私の問題:

出生時の性比 (男性対女性) が 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 })。$It は効率が悪いようです。MAYBE で true または false をカウントする方が効率的だと思います。

  2. コードをより簡潔に書くには?

4

3 に答える 3

4

もちろん、答えは、この戦略は性比にまったく影響を与えないということです! 少なくともこれを設定した場合、カップルの以前の出生歴に関係なく、各出産から男性が生まれる確率は常に同じです。

いくつかの計算でそれを確認する 1 つの方法を次に示します。(コードは、少なくとも今のところ、それ以上の説明なしで提供されています。):

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 に答える