R - Используя пакет deSolve, как мне преодолеть эту ошибку объекта?

Я новичок как в R, так и в deSolve. Я пытаюсь решить уравнение с заданными значениями начального параметра и переменной состояния. Однако в конце возникает ошибка из-за того, что в моих параметрах нет объектов. Как мне преодолеть это? Создаю ли я новый объект для каждого параметра?

Вот синтаксис модели:

myfn <- function(times, y, parms) {

dy <- numeric(6)
dy[1] <- a - b*y[4] - c*y[1]
dy[2] <- y[5]*dy[1]*(1+y[6]) - e*y[2] - (f*y[3]*y[4]*y[1] - g)
dy[3] <- h - i*y[2]
dy[4] <- y[6]*dy[1] - j*y[4] + k*(f*y[3]*y[4]*y[1] - g) + d
dy[5] <- 1.0 - y[5]*(y[1] + y[4] + 1)
dy[6] <- 1.0 - y[6]*(y[1] + 1)

return(list(dy))

}

parms <-c(a= 2.0, b = 0.1, c = 0.1, d = 1.0, e = 1.0, f = 1.0, g = 0.15, h = 1.0, i = 1.0, j = 1.0, k = 0.5)
yini <-c(Y1 = 1, Y2 = 1, Y3 = 1, Y4 = 1, Y5 = 1, Y6 = 1)
times <-seq(1, 60, 1)

out <- ode(y = yini, times = times, func = myfn, parms = parms)
plot(out)

Вот ошибка, которую я получаю:

> out <- ode(y = yini, times = times, func = myfn, parms = parms)
Error in func(time, state, parms, ...) : object 'a' not found
> plot(out)
Error in plot(out) : object 'out' not found

r ode
person Michael    schedule 23.03.2015    source источник


Ответы (1)


Одним из решений является использование with(), что-то вроде:

myfn <- function(times, y, parms) {

   dy <- with(as.list(parms),
       c(a - b*y[4] - c*y[1],
         y[5]*dy[1]*(1+y[6]) - e*y[2] - (f*y[3]*y[4]*y[1] - g),
         h - i*y[2],
         y[6]*dy[1] - j*y[4] + k*(f*y[3]*y[4]*y[1] - g) + d,
         1.0 - y[5]*(y[1] + y[4] + 1),
         1.0 - y[6]*(y[1] + 1)))

   return(list(dy))  
}

(Еще не проверял - возможно, скобки не в том месте.)

Если вы также назовете свой вектор состояния, вы можете улучшить читаемость, используя with(as.list(c(parms,y)),... и используя имена состояний, а не y[]-индексацию.

person Ben Bolker    schedule 23.03.2015