微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用R中的循环将多个SEIR模型中的多个参数拟合到数据

如何解决如何使用R中的循环将多个SEIR模型中的多个参数拟合到数据

我有一个SEIR模型,在不同的情况下具有不同的参数值。我想将每种情况下的相同参数都适合每种情况下的不同数据,我有使用不同参数值运行SEIR模型的代码

为每种情况定义初始参数值

scen <- data.frame(scenario = c(1,2,3),gamma = c(9,10,9),alpha = c(3,3,mu = c(0.1,0.05,0.5),si = c(0.7,0.25,0.85),N = c(3000000,2000000,1000000)
                )


    ##Define differential equations

    seir1 <- function(t,x,parms) {
      with(as.list(c(parms,x)),{
        mu <- ifelse(t<t1,mu)
        si <- ifelse(t<t2,si)
        ef <- ifelse(t<t3,ef)

dS  <-    - I*S*(beta*(1-(mu*0.3))*(1-(si))*(1-ef))/N
dE  <-    - E/alpha   + I*(beta*(1-(mu*0.3))*S*(1-(si))*(1-ef))/N 
dI  <-      E/alpha - I/gamma
dR  <-                I/gamma 

der <- c(dS,dE,dI,dR)   
list(der)
      })
    }

行(n)代表方案编号,并创建空的数据框来保存时间序列数据 从1到500运行仿真,每个场景行进行一次仿真,数量尽可能多,并定义将更改的参数

      n <- as.numeric(nrow(scen)) 
      scen_ts <- list() 
      for(i in 1:n){
      parms <- c(beta = scen[i,c('beta')],gamma = scen[i,c('gamma')],alpha = scen[i,c('alpha')],ef = 0,mu = 0,si = 0,t1 = scen[i,c('t1')],t2 = scen[i,c('t2')],t3 = scen[i,c('t3')]
         )
      dt      <- seq(0,500,1)
      N <- scen[i,c('N')]
      inits      <- c(S = N - 1,E = 0,I = 1,R = 0)

      out <- lsoda(inits,dt,seir1,parms = parms)
      scen_ts[[i]] <- as.matrix(out)
    }

我还具有各种函数,这些函数可以让我迭代参数以找到最佳拟合参数,我试图弄清楚如何组合这两组代码,以便可以运行参数拟合函数以为所有参数拟合参数。各种数据的情景:

    dat <- data.frame(scenario = c(1,1,time = c(20,60,80,120,160,30,50,110,150,25,100,125),I = c(11,3181,51800,558881,24380,65,1407,121552,434008,19708,15,119,466,2551))

    
    for(i in 1:n){
      assign(paste("dat",i,sep =""),dat[dat$scenario == i,])
    }

下一步只是定义将模型输出与数据进行比较的成本函数,我可以使其用于单个模型,但不能与上面定义的多情景模型一起使用,

    for(i in 1:n){
     params1 <- list(
       ef = scen[i,c('ef')],mu = scen[i,c('mu')],si = scen[i,c('si')])

      RSS[[i]] <- function(params1) {
        names(params1) <- c("ef","mu","si")
        out[[i]] <- lsoda(inits,parms = parms)
        fit[i] <- out[,6]
        sum((dat[i] - fit[i])^2)
      }
    }  

不起作用,也不起作用:

     for(i in 1:n){

      cost[[i]] <- function(P){
        parameters["ef"]<-P[1]
        parameters["mu"]<-P[2]
        parameters["si"]<-P[3]

        out <- trial(parameters)
        return(modcost(out,fit[i]))
      }
    }  

显然,实际情况涉及更多场景和更多参数,这是简化版本。不完全确定该怎么做,不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。