我正在尝试使用“aux”对象的不同值多次运行以下代码。
time <- seq(0, 30, 1)
stock <- c(sK=0, sF=1)
aux <- c(aH=0.4, aRel=0.5, aRes=0.5, aS=0.8)
model <- function(time, stock, aux) {
with(as.list(c(stock, aux)), {
aA <- 1-sK/1
fH <- 1*aH*aA
sF <- fH*aRel*0.2*0.8
fS <- sF*aRes
sK <- fS*aS
net_f <- fH - fS
net_k <- fS
return(list(c(net_f, net_k),
fH=fH, fS=fS, aA=aA, net_f=net_f, net_k=net_k))
})
}
library(deSolve)
out <- data.frame(ode(times=time, y=stock, parms=aux, func=model, method='euler'))
out
我的问题是:
d <- crossing(aH=seq(0, 1, 0.1), aRel=seq(0, 1, 0.1), aRes=seq(0, 1, 0.1),
aS=seq(0, 1, 0.1))
如何将此网格搜索与上述模型连接起来并获得“aux”的最佳组合?我意识到网上有关于这个问题的示例,但是我的问题是,“aux”是进一步建模代码的值
out <- data.frame(ode(times=time, y=stock, parms=aux, func=model, method='euler'))
sF <- fH*aRel*0.2*0.8
我需要将值0.2和0.8更改为其他值,例如0.2也可以更改为0.5或0.8,0.8也可以更改为0.5和0.2。所以对于这部分来说,有3*3=9种情况。在网格搜索中执行此操作的正确方法是什么?
我希望我已经清楚地描述了我的问题。请给我一些建议。
我希望我正确理解你的问题。 如果是这样,我的建议是 将
ode
行放入以 aux
作为参数的函数中。 类似的东西
test_aux <- function(aux) {
data.frame(ode(times=time, y=stock, parms=aux, func=model, method='euler'))
}
然后,通过使用
lapply()
为网格中的每一行调用此函数,或者,如果您想采用 dplyr
方式,请使用 rowwise()
并列出列:
model_out <- lapply(d, test_aux)
# Or
library(dplyr)
d %>%
rowwise() %>%
mutate(model_out = list(test_aux(c_across(aH, aRel, aRes, aS))))
要选择“最佳组合”,您应该创建一个输出所需指标的函数,并再次使用
model_out
或 lapply()
迭代 sapply()
,或者使用 mutate()
创建一个新列该指标的值。