Я пытаюсь запустить следующий код несколько раз с разными значениями для объекта «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'))
}
Затем вызовите эту функцию для каждой строки в сетке, либо используя apply()
, либо, если вы хотите пойти по пути dplyr
, используя rowwise()
и перечислив столбцы:
model_out <- apply(d, 1, test_aux)
# Or
library(dplyr)
d %>%
rowwise() %>%
mutate(model_out = list(test_aux(c_across(aH, aRel, aRes, aS))))
Чтобы выбрать «наилучшую комбинацию», вам следует создать функцию, которая выводит желаемую метрику, и перебрать model_out
, снова используя lapply()
или sapply()
, или используя mutate()
, чтобы создать новый столбец со значениями этой метрики.
Каковы критерии «лучшего сочетания»?