无法使用deSolve在SIR模型中合并出生脉冲

时间:2014-12-22 10:32:16

标签: r

我正在使用deSolve套餐制作出生脉冲SIR model。使用以下代码,我预计在第0,12和24时间出生脉冲,但输出显示没有出生脉冲 - 实际上根本没有出生!

library(deSolve); library(ggplot2)   
SIR <- function (times,x,parameters) {
          SL = x[1]
          IL = x[2]
          RL = x[3]
          NL = x[4]
          if (IL<0) IL=0
          with(as.list(c(x,parameters)), {
            npopL <- SL + IL + RL
            dSL <- -(betaL*SL*IL/npopL) - ((b + (.5*(a-b)*npopL/kl))*SL) + ((((.918*round(cos(2%%((times%%12)+2)))))*(SL+RL)))
            dIL <- +(betaL*SL*IL/npopL) - gamma*IL - (b+0.015)*IL
            dRL <- +gamma*IL - b*RL
            dNL <- +dSL + dIL + dRL
            out <- c(dSL,dIL,dRL,dNL)
            list(out)
          })
        }
times <- seq(1,24, by = 1)
parameters <- c(betaL = 0.9, gamma = 0.3, a= 0.0765, b = 0.06,kl = 50)
init <- c(SL=50,IL=0,RL=0,NL=50)
out <- as.data.frame(ode(y = init, times = times, func = SIR, parms = parameters))
mydata1 <- data.frame(Period=rep((1:length(out$SL)),4),Population = c(out$SL,out$IL,out$RL,out$NL),Indicator=rep(c("SusceptibleL","InfectedL","RecoveredL","TotalL"),each=length(out$SL)))
p1 = ggplot(mydata1,aes(x=Period,y=Population, group=Indicator))
f1 = p1+geom_line(aes(colour = Indicator))
f1

我做错了什么?在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

library(deSolve); library(ggplot2)

我正在修改您的模型,因为我认为它可以简化。 没有必要使用npopL,因为您需要变量NL

SIR <- function (times,x,parms) {
  SL = x[1]
  IL = x[2]
  RL = x[3]
  NL = x[4]
  if (IL<0) IL=0
  # with(as.list(c(x,parameters)), {
  with(as.list(c(x,parms)), {
    dSL <- -(betaL*SL*IL/NL) - ((b + (.5*(a-b)*NL/kl))*SL) 
    dIL <- +(betaL*SL*IL/NL) - gamma*IL - (b+0.015)*IL
    dRL <- +gamma*IL - b*RL
    dNL <- +dSL + dIL + dRL
    out <- c(dSL,dIL,dRL,dNL)
    list(out)
  })
}

正如我在评论中所说,请查看包events的文档中的deSolve。 因此,为您的出生脉冲创建一个事件函数(这来自哪里?)我将出生脉搏改为总人口的一小部分(NL)。

eventfun <- function(t, y, parms){
  with (as.list(c(y,parms)),{
    SL <- SL + .1*round(cos(2%%((t%%12)+2)))*NL
    return(c(SL,IL,RL,NL))
  })
}

这会在离散时间更改SL,即事件:出生脉冲。

您的其他代码并不需要修改,但我假设ode从字面上parms传递parameters,因此我将您的函数中的parms更改为{ {1}}。

times <- seq(1,24, by = 1)
parameters <- c(betaL = 0.9, gamma = 0.3, a= 0.0765, b = 0.06,kl = 50)
init <- c(SL=50,IL=0,RL=0,NL=50)
out <- as.data.frame(ode(y = init, times = times, func = SIR, parms = parameters,    events=list(func=eventfun,time=times))
                )
mydata1 <- data.frame(Period=rep((1:length(out$SL)),4),Population =  c(out$SL,out$IL,out$RL,out$NL),
                   Indicator=rep(c("SusceptibleL","InfectedL","RecoveredL","TotalL"),each=length(out$SL)))
p1 = ggplot(mydata1,aes(x=Period,y=Population, group=Indicator))
f1 = p1+geom_line(aes(colour = Indicator))
f1

我觉得结果很奇怪。 您可以找到一组合理的参数并纠正任何进一步的错误。