首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行deSolve多次更改时变参数。

运行deSolve多次更改时变参数。
EN

Stack Overflow用户
提问于 2017-02-16 06:29:12
回答 1查看 211关注 0票数 0

我想让这段代码重复运行,为每次运行创建一个具有不同列变量的单个输出数据集。现在,代码工作并允许我在不同的时间插入不同的事件。但是,我希望能够改变这一事件的规模,

代码语言:javascript
复制
IPT  <- ifelse (t<210, IPT, 0.35*exp(-(t-209)/21))

变化0.35到0.4,0.5,0.6,等等。我试过循环,但根本无法工作。我的代码如下:

代码语言:javascript
复制
library(deSolve)
##Simple parameter list
params <- c(b = 0.477, bs = .4, bsv = 0.1, nets = 0.4767, betah = 0.2, 
        rhos = 179, Bthetas = 0.2, psi = 14,phis = 0.5, gamma =14, 
        thetas = 0.79,piv = 1/19, betav = 0.09122, nu = 0.2085, sigma = 12, 
        muv = 1/19, IPT = 0, IPT2 = 0, IPT3 = 0)
dt      <- seq(0, 5000, 7)
inits      <- c(Ss = 30000, Is = 0, As = 0, Rs = 0,
            Sv = 29999, Ev = 0, Iv = 1)
Nh <- 30000
Nv <- 30000


## Create an SIR function
sir1 <- function(t, x, params) {

with(as.list(c(params, x)), {

IPT  <- ifelse (t<210, IPT, 0.35*exp(-(t-209)/21))

dSs <- -((b*bs*(1-nets))+(b*bs*nets*0.78))*betah*Iv*Ss         /Nh                                 + As*(1/rhos)*(1-Bthetas)                                                                         + Rs*(1/psi)
dIs <-  ((b*bs*(1-nets))+(b*bs*nets*0.78))*betah*Iv*Ss*(1-phis)/Nh - 1/gamma   * Is                                                            - Is*(IPT + IPT2  + IPT3)
dAs <-  ((b*bs*(1-nets))+(b*bs*nets*0.78))*betah*Iv*Ss*(  phis)/Nh + 1/gamma  * Is*(1-thetas) - As*(1/rhos)*(1-Bthetas) - As*(2/rhos)*Bthetas                          - As*(IPT + IPT2 + IPT3)
dRs <-                                                               1/gamma * Is*(  thetas)                           + As*(2/rhos)*Bthetas + Is*(IPT2 +    IPT3+ IPT) + As*(IPT + IPT2 + IPT3) - Rs*(1/psi)  

dSv <- piv*Nv - Sv*betav*b*(nu*(
    ((bsv*(1-nets))+(bsv*nets*0.78))*As)+
   ((bsv*(1-nets))+(bsv*nets*0.78))*Is/Nh) - Sv*muv 
dEv <-          Sv*betav*b*(nu*(
  ((bsv*(1-nets))+(bsv*nets*0.78))*As)+
    ((bsv*(1-nets))+(bsv*nets*0.78))*Is/Nh)  - Ev*(1/sigma + muv)
dIv <-      Ev*(1/sigma)- Iv*muv


der <- c(dSs, dIs, dAs, dRs,
         dSv, dEv, dIv)
list(der)
 })
 }

out <- as.data.frame(lsoda(inits, dt, sir1, parms = params))

out$prev <- with(out, Is+As/Nh)

我希望最终的数据集有多个prev列,每个prev列具有不同的事件值。

任何帮助都将不胜感激,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-16 07:12:31

一个潜在的解决方案是将这个量值变成一个参数,而不是一个常量(这里我称之为mag)。

代码语言:javascript
复制
library(deSolve)
##Simple parameter list
params <- c(b = 0.477, bs = .4, bsv = 0.1, nets = 0.4767, betah = 0.2, 
        rhos = 179, Bthetas = 0.2, psi = 14,phis = 0.5, gamma =14, 
        thetas = 0.79,piv = 1/19, betav = 0.09122, nu = 0.2085, sigma = 12, 
        muv = 1/19, IPT = 0, IPT2 = 0, IPT3 = 0, mag=0.35)
dt      <- seq(0, 5000, 7)
inits      <- c(Ss = 30000, Is = 0, As = 0, Rs = 0,
            Sv = 29999, Ev = 0, Iv = 1)
Nh <- 30000
Nv <- 30000

然后我们可以调整sir1函数来接受mag参数.

代码语言:javascript
复制
## Create an SIR function
sir1 <- function(t, x, params) {

with(as.list(c(params, x)), {

IPT  <- ifelse (t<210, IPT, mag*exp(-(t-209)/21))

dSs <- -((b*bs*(1-nets))+(b*bs*nets*0.78))*betah*Iv*Ss         /Nh                                 + As*(1/rhos)*(1-Bthetas)                                                                         + Rs*(1/psi)
dIs <-  ((b*bs*(1-nets))+(b*bs*nets*0.78))*betah*Iv*Ss*(1-phis)/Nh - 1/gamma   * Is                                                            - Is*(IPT + IPT2  + IPT3)
dAs <-  ((b*bs*(1-nets))+(b*bs*nets*0.78))*betah*Iv*Ss*(  phis)/Nh + 1/gamma  * Is*(1-thetas) - As*(1/rhos)*(1-Bthetas) - As*(2/rhos)*Bthetas                          - As*(IPT + IPT2 + IPT3)
dRs <-                                                               1/gamma * Is*(  thetas)                           + As*(2/rhos)*Bthetas + Is*(IPT2 +    IPT3+ IPT) + As*(IPT + IPT2 + IPT3) - Rs*(1/psi)  

dSv <- piv*Nv - Sv*betav*b*(nu*(
    ((bsv*(1-nets))+(bsv*nets*0.78))*As)+
   ((bsv*(1-nets))+(bsv*nets*0.78))*Is/Nh) - Sv*muv 
dEv <-          Sv*betav*b*(nu*(
  ((bsv*(1-nets))+(bsv*nets*0.78))*As)+
    ((bsv*(1-nets))+(bsv*nets*0.78))*Is/Nh)  - Ev*(1/sigma + muv)
dIv <-      Ev*(1/sigma)- Iv*muv


der <- c(dSs, dIs, dAs, dRs,
         dSv, dEv, dIv)
list(der)
 })
 }

..。我们可以在循环中修改params向量,该循环也运行模型,获取输出,计算prev,并将其存储在out data.frame中。

代码语言:javascript
复制
out <- as.data.frame(lsoda(inits, dt, sir1, parms = params))
magz <- seq(0.2, 0.5, length.out=10)

for(i in 1:length(magz)){
  params['mag'] <- magz[i]
  tmp <- as.data.frame(lsoda(inits, dt, sir1, parms = params))
  nm <- paste('prev', round(params['mag'],2), sep='')
  out[,nm] <- with(tmp, Is+As/Nh)
}

可能有更好的方法来做你想做的事情,但这是一个潜在的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42266507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档