【发布时间】:2026-02-01 07:50:01
【问题描述】:
我需要帮助加快一个简单的函数,该函数使用 which() 和 rbinom() 根据每日生存概率和筑巢期计算巢的存活时间。我在一个闪亮的应用程序的 data.table 模拟中使用它,这条线真的,真的减慢了速度。
有问题的函数如下 - 它计算给定每日存活概率和潜伏期的巢将存活多长时间。该函数每天生成 1 和 0,其中 1 表示继续生存,0 表示失败。如果嵌套没有失败,该函数会返回完整的潜伏期,但如果确实失败,则返回嵌套失败的日期,并告诉我第一个 0 的位置。
# specify parameters for function
period<-28
prob.surv<-0.98
# survival function that returns how long a nest survives for in days
survival<-function(period,prob.surv){
which(rbinom(period,1,prob.surv)==0)[1] %>% replace(is.na(.), period)}
然后我使用 data.table 在更长的函数中使用它——这里有一个简化的例子:
library(data.table)
# make a dt
dat <- data.table(nests = 1:4000)
# date incubation starts
dat[,inc.start:= round(rnorm(n=nrow(dat), 80, sd = 2))]
# date incubation ends
dat[,inc.end:= inc.start + (replicate(n=nrow(dat), survival(28, 0.98)))]
不确定使用这样的 replicate() 是否很好,但无法找到更好的解决方案。
因为这个函数在模拟中总共使用了 3/4 次,所以在代码中是一个非常大的瓶颈。
任何关于如何加快survival() 函数或在data.table 中更有效地使用它的建议将不胜感激!
【问题讨论】:
-
第一次二项式成功的时间有gemoetric distribution。生成单个几何变量而不是
period二项式然后查询它们应该可以提高性能。
标签: r performance data.table