2015-11-06 2 views
1

Я новичок в 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 имеют одинаковую длину, содержат одинаковые параметры и т. Д. Любая помощь будет высоко оценена.

ответ

1

Процедуры оптимизации не создают и не передают именованные векторы в целевую функцию, поэтому ваш оператор with не работает.

R> with(list(ro=1, b=3), ro + b) 
[1] 4 
R> with(list(1, 3), ro + b) 
Error in eval(expr, envir, enclos) : object 'ro' not found 

простой, но менее эффективным решением является использование setNames для добавления имен вектора параметров:

R> with(setNames(list(1, 3), c("ro", "b")), ro + b) 
[1] 4 

Более эффективным решением было бы ссылаться на элементы вектора параметров непосредственно (например, замените все экземпляры ro на params[1] в вашем функциональном теле.

+1

Знаете, я только что познакомился с этим сайтом, а затем кто-то вроде вас приходит, очень быстро отвечает на мой супер конкретный вопрос, облегчает мою жизнь, и теперь я вижу, как DEOPTIM минимизирует мою функцию при поиске правильных параметров. Огромное спасибо. Возможно, вы хотели бы помочь мне еще раз. У меня своя функция минимизирована, но «bestval», как сообщается DEoptim, никогда не связано со значением, которое я получаю при ручной установке параметров в моей целевой функции. 'Gen.out $ Optim $ bestval [1] 0.2887569' ' цель (Gen.out $ Optim $ bestmem) [1] 278.3751' – Ron

Смежные вопросы