2017-02-02 2 views
0

Я пытаюсь выяснить, как запускать симуляции, изменяя значения параметров при использовании deSolve. Я очень новичок в R и с трудом устраняю ошибки, которые я получаю. Я создал очень простой набор дифференциальных уравнений и пытаюсь запустить выборку для цикла из равномерного распределения моих параметров.Выполнение симуляции с различными значениями параметров в deSolve

My Model:

sir <- function(time, state, parameters) { 

with(as.list(c(state, parameters)), { 

dS <- -beta1 * (S * I)/N 
dI <- beta1 * (S * I)/N - gamma1 * I 
dR <-     gamma1 * I 

return(list(c(dS, dI, dR))) 
}) 
} 
init  <- c(S = 99999, I = 1, R = 0) 

Покушение на цикл:

outlist <- list() 
plist <- cbind(beta1 = runif(30, min = .1, max = .9), 
      gamma1 = runif(30, min = .1, max = .9)) 
for(i in 1:nrow(plist)) 
outlist[[i]] <- ode(y = init, times = times, func = sir, parms = plist[i]) 
plot(out, outlist) 

Я получаю следующее сообщение об ошибке:

Error in eval(expr, envir, enclos) : object 'beta1' not found

Я очень признателен за любую помощь вы можете предоставить,

+1

Вы не показываете весь свой код. Вы не присвоили значение параметру 'beta1' в своей функции, как следует из сообщения об ошибке. Вы должны вставить строку как 'beta1 <- parameter [1]' в функцию перед 'with'. Аналогично для 'gamma1' и' N'. А где объекты 'times' и' N'? И вам нужно '{' и '}' вокруг тела цикла 'for'. Также отсутствует 'out'. И теперь я сдаюсь. – Bhas

ответ

0

В вашем коде есть всевозможные ошибки. Тем более, что я отметил в своих комментариях. Очень типичная ошибка в коде R: вы используете plist[i] для использования строки i из plist. Вы должны использовать plist[i,].

Имея идти на ваши вещи:

library(deSolve) 

sir <- function(time, state, parameters) { 

    beta1 <- parameters[1] 
    gamma1 <- parameters[2] 
    with(as.list(c(state, parameters)), { 

    dS <- -beta1 * (S * I)/N 
    dI <- beta1 * (S * I)/N - gamma1 * I 
    dR <-     gamma1 * I 
    return(list(c(dS, dI, dR))) 
    }) 
} 

init <- c(S = 99999, I = 1, R = 0) 
times <- seq(1,5,.5) # trial 
N <- 10000000 # having a guess 
outlist <- list() 
plist <- cbind(beta1 = runif(30, min = .1, max = .9), 
      gamma1 = runif(30, min = .1, max = .9)) 

plist[c(1,2)] 
for(i in 1:nrow(plist)) { 
    outlist[[i]] <- ode(y = init, times = times, func = sir, parms = plist[i,]) 
} 

# just display the first item 
outlist[[1]] 

Это до вас, чтобы присвоить переменной out и продолжать.

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