1

我是一名生物学家和 R 新手,我正在学习如何创建一个简单的人口模型。

所以,我有一个包含 30 个年龄段的女性(1:4 是非育种者,5:30 是育种者)的人口矩阵(“pop”),它将被建模 100 年。

pop <- matrix(0,30,100)

然后我用 3 位年轻的成年女性填充这个矩阵。

pop[5, 1] <- 3

然后我想随机运行 100 年,看看这个群体随着时间的推移会如何变化。(我没有填写这些但你不需要它们,它们对于性成熟的成年人都有不同的生存概率。)

for (t in 1:100)  {  # Edited y to t, typing error!
    pop[1,t+1] <- rbinom(1,colSums(pop[5:30, t]), b/2) 
    pop[5, t+1] <- rbinom(1, pop[4, t], s2)
    pop[6, t+1] <- rbinom(1, pop[5, t], s2)
    .....
    pop[30, t+1] <- rbinom(1, pop[29, t], s2)
}

所以我的问题是:有没有什么方法可以填充这个矩阵而不必显式编写 30 行代码?因为第 5 - 30 行都将是相同的,但即使经过 5 小时(字面意思)的网络搜索和 R 手动阅读,我也找不到索引行的方法,这似乎是这里需要的。

欢迎提供任何见解,包括对这一人群进行建模的不同方式。

4

1 回答 1

5

因为rbinom是矢量化的,你应该可以替换

pop[1,t+1] <- rbinom(1,colSums(pop[5:30, t]), b/2) 
pop[5, t+1] <- rbinom(1, pop[4, t], s2)
pop[6, t+1] <- rbinom(1, pop[5, t], s2)
.....
pop[30, t+1] <- rbinom(1, pop[29, t], s2)

pop[,t+1] <- rbinom(27,size=c(colSums(pop[5:30,t]),pop[4:29,t]),
                       prob=c(b/2,rep(s2,26)))

或类似的东西(26和27可能是错的,我可能算错了)

但是,我真正认为你应该做的是这样的事情:

pop[1,t+1]  <- rpois(1,b/2*sum(pop[5:30,t]))
pop[-1,t+1] <- rbinom(29,size=pop[1:29,t]),
                       prob=c(rep(s1,4),rep(s2,26)))

这假设最后一个年龄段的个体从世界的边缘掉下来并死去......我在rpois这里使用的是允许泊松繁殖而不是二项式,尽管rbinom(1,size=sum(pop[5:30,t])/2,prob=p)如果你真的想坚持女性最多有 1 个,你可以使用后代(概率为 p)

于 2013-02-18T16:31:56.043 回答