多次循环模型

问题描述 投票:0回答:1

我正在尝试使用“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

我的问题是:

  1. 我创建了一个用于网格搜索的数据框
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'))
  1. 对于线路
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种情况。在网格搜索中执行此操作的正确方法是什么?

我希望我已经清楚地描述了我的问题。请给我一些建议。

r loops nested-loops
1个回答
0
投票

我希望我正确理解你的问题。 如果是这样,我的建议是 将

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()
创建一个新列该指标的值。

© www.soinside.com 2019 - 2024. All rights reserved.