R:通过索引行和列,可以在循环中填充矩阵吗?

时间:2013-02-18 16:25:47

标签: r matrix population

我是一名生物学家和一名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手动阅读,我找不到一种方法来索引行,这似乎是这里所需要的。

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

1 个答案:

答案 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)