簡體   English   中英

R:是否可以通過索引行和列來在循環中填充矩陣?

[英]R: Can a matrix be populated in a loop by indexing both rows and columns?

我是生物學家和R新手,我正在學習如何創建簡單的人口模型。

因此,我有一個將模擬100年的30個年齡段的女性(1:4為非繁殖者,5:30為育種者)的年齡矩陣。

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手動閱讀,我仍然找不到索引行的方法,這似乎是這里所需要的。

這里歡迎您提供任何見識,包括以不同的方式對該人口進行建模。

由於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而死...我在這里使用rpois允許泊松繁殖,而不是二項式,盡管您可以使用rbinom(1,size=sum(pop[5:30,t])/2,prob=p)如果您確實要堅持認為雌性最多有1個后代(概率為p)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM