我是一名生物学家和一名R新手,我正在学习如何创建一个简单的人口模型。
所以,我有一个30个年龄段的女性(1:4是非育种者,5:30是育种者)的人口矩阵(“流行”),将模拟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手动阅读,我找不到一种方法来索引行,这似乎是这里所需要的。
欢迎任何见解,包括对这一人群建模的不同方式。
答案 0 :(得分: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
来允许泊松复制而不是二项式,但如果你真的想要坚持女性最多只有1个后代(概率为p),你可以使用rbinom(1,size=sum(pop[5:30,t])/2,prob=p)