Я новичок в R и полностью импровизировать здесь (лучший способ узнать)«Объект не найден» Ошибка при оптимизации с DEoptim И GenSA в R
У меня есть система спаренных ОДУ, 18 параметров, и реальный мир данные за 13 лет.
ОДУ, у вектора начальных условий, т шагов времени, Parms являются параметрами:
Pdot <- function(t, y, parms){
with(as.list(c(parms, y)), {
dS <- ro*N + z1*phi1*I1 + z4*phi4*I4 - q*t1*lambda*S*I1/N - q*t4*lambda*S*I4/N - mu0*S + (1-l)*alpha*N
dE1 <- (1-p)*q*t1*lambda*S*I1/N - vL*E1 + (1-y1)*(1-z1)*phi1*I1 - mu0*E1 + (1-r4)*l*alpha*N
dI1 <- p*q*t1*lambda*S*I1/N + vL*E1 - phi1*I1 - mu*I1 - mu0*I1
dE4 <- (1-p)*q*t4*lambda*S*I4/N - vL*E4 + (1-z4)*phi4*I4 - mu0*E4 + r4*l*alpha*N + y1*(1-z1)*phi1*I1
dI4 <- p*q*t4*lambda*S*I4/N + vL*E4 - phi4*I4 - mu*I4 - mu0*I4
dN <- ro*N + alpha*N - mu*(I1 + I4) - mu0*N
dD <- mu*(I1 + I4)
return (list(c(dD, dN, dE1, dE4, dI1, dI4, dS)))
})}
Я решение этой ОДЫ с
lsoda(initial.cond, t, Pdot, parms)
Я сделал целевую функцию который сравнивает результаты lsoda с данными реального мира и возвращает разницу; Изменяя параметры, я надеюсь свести к минимуму эту разницу.
objective <- function(parms){
s <- lsoda(initial.cond, 1:13, Pdot, parms)
for (i in 2:13){
diffs <- diffs + abs(s[i,2] - TBDeaths[i]) + abs(s[i,3] - USPopulation[i]) + abs(s[i,6] + s[i,7] - TBCases[i]) + abs(+ s[i,6] - MDRCases[i])}
return(diffs)}
«s» имеет 13 строк и 7 столбцов (для каждого D, N, E1, E4 и т.д.), и я начать в строке 2, сравнивают его с реальным миром данных, чтобы найти ошибку, и петля за каждый год дает мне окончательную скалярную разницу. У меня есть только 4 переменные данных, поэтому я должен вызвать правильные столбцы в s, соответствующие этим данным.
На данный момент работает объектная задача с любым набором параметров.
Gen.out <- DEoptim(fn = objective, lower = bound1, upper = bound2)
Gen.out <- GenSA(parms, fn = objective, lower = bound1, upper = bound2)
Попытка оба этих метода дает мне ту же ошибку:
Error in eval(expr, envir, enclos) : object 'ro' not found
ро является первым параметром, используемым в PDOT. По какой-то причине я могу передать любой набор параметров в цель, получить прекрасные результаты, но оба этих пакета не могут передать свои наборы параметров в объективные.
bound1, bound2 и parms имеют одинаковую длину, содержат одинаковые параметры и т. Д. Любая помощь будет высоко оценена.
Знаете, я только что познакомился с этим сайтом, а затем кто-то вроде вас приходит, очень быстро отвечает на мой супер конкретный вопрос, облегчает мою жизнь, и теперь я вижу, как DEOPTIM минимизирует мою функцию при поиске правильных параметров. Огромное спасибо. Возможно, вы хотели бы помочь мне еще раз. У меня своя функция минимизирована, но «bestval», как сообщается DEoptim, никогда не связано со значением, которое я получаю при ручной установке параметров в моей целевой функции. 'Gen.out $ Optim $ bestval [1] 0.2887569' ' цель (Gen.out $ Optim $ bestmem) [1] 278.3751' – Ron