gpt4 book ai didi

r - 当函数随每次迭代增加时如何编写循环?

转载 作者:行者123 更新时间:2023-12-01 08:59:39 25 4
gpt4 key购买 nike

我试图估计当动物被移除并且检测在时间和空间上发生变化时,在多个观察期内从 n.sites 检测到动物的概率。如果我在 5 个观察期内做这样的事情,它会起作用:

for(i in 1:nsites){
mu[i,1] <- p[i,1]
mu[i,2] <- p[i,2]*(1-p[i,1])
mu[i,3] <- p[i,3]*(1-p[i,1])*(1-p[i,2])
mu[i,4] <- p[i,4]*(1-p[i,1])*(1-p[i,2])*(1-p[i,3])
mu[i,5] <- p[i,5]*(1-p[i,1])*(1-p[i,2])*(1-p[i,3])*(1-p[i,4])
}

时间 2 的概率取决于时间 1 的概率,时间 3 的概率取决于时间 1 和时间 2 的概率。如果我只在 5 个时间段内执行此操作,它不会很大把这个写出来。但是当我得到 10、15、20 多个时间段时,写出来是相当困惑的。我觉得应该有一种方法可以编写此循环而无需输入每个步骤,但我就是想不出该怎么做。也许附加索引或其他控制语句或电源功能。如果 p[i] 在每个 jth 观察中都相同(即 p[i,1] = p[i,2] = p[i,3] 等),它将是:

p[i]*(1-p[i])^5

任何建议将不胜感激。

这是 BUGS 语言代码。我在 R 中工作并通过 rjags 包将代码发送到 JAGS。 BUGS、R 或伪代码都适合我的目的。

这是模拟问题的 R 代码:

set.seed(123)
testp <- matrix(runif(108, 0.1, 0.5), 108, 5)
testmu <- matrix(NA, 108, 5)

for(i in 1:nsites){
testmu[i,1] <- testp[i,1]
testmu[i,2] <- testp[i,2]*(1-testp[i,1])
testmu[i,3] <- testp[i,3]*(1-testp[i,1])*(1-testp[i,2])
testmu[i,4] <- testp[i,4]*(1-testp[i,1])*(1-testp[i,2])*(1-testp[i,3])
testmu[i,5] <- testp[i,5]*(1-testp[i,1])*(1-testp[i,2])*(1-testp[i,3])*(1-testp[i,4])
}

感谢您的帮助。丹

最佳答案

这看起来确实很适合 R 的 Reduce:

testmu3 <- matrix(NA, 108, 5)
nsites = 108
np = 5

for (i in 1:nsites) {
testmu3[ i, ] <- Reduce( function(x,y) x*(1-y), testp[i, ],
accumulate=TRUE)
}
max(abs(testmu3-testmu))
[1] 0

accumulate 参数创建一个不断增长的中间结果向量。

> testp[1, ]
[1] 0.215031 0.215031 0.215031 0.215031 0.215031

> Reduce( function(x,y) x*(1-y), testp[1, ], accumulate=TRUE)
[1] 0.21503101 0.16879267 0.13249701 0.10400605 0.08164152

关于r - 当函数随每次迭代增加时如何编写循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20134031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com