运行模拟在deSolve中改变参数值

时间:2017-02-02 08:07:17

标签: r

我正在尝试弄清楚如何在使用deSolve时运行模拟变化参数值。我是R的新手,很难排除我遇到的错误。我创建了一组非常简单的微分方程,并尝试从均匀分布的参数中运行for循环采样。

我的模特:

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)

尝试for循环:

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)

我收到以下错误:

  

eval(expr,envir,enclos)中的错误:找不到对象'beta1'

我非常感谢您提供的任何帮助,

1 个答案:

答案 0 :(得分: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并继续。