【问题标题】:Different parameters’ values for different time intervals in deSolvedeSolve 中不同时间间隔的不同参数值
【发布时间】:2013-12-19 23:17:10
【问题描述】:

我正在尝试使用 deSolve 求解 SVEIR(易感、接种疫苗、暴露、感染和移除)模型。暴发于第 8 天开始(通过在易感人群中输入一个指示病例)。为了捕获这一点,我使用了一个事件(通过在时间 t=8 将值一 (1) 添加到状态变量 (I)。

# Model's parameters

parms <- c(beta=1.29, 
       betaE=0.25, 
       betaI=1, 
       betaV=0.0, 
       sigma=0.5, 
       gama=0.2, 
       delta=1/365, 
       m=0.000046, 
       r=0.000052, 
       kapa=1.857/10000,            
       alpha=0.00643, 
       thita=1/365, 
       f=0.002)    
dt    <- seq(0,50,0.25)      

inits <- c(S=14900, V=0, E=0, I=0, R=0)    
N <- sum(inits)

eventdat <- data.frame(var = c("I"),time = c(8), 
                    value = c(1), method = c("add"))
eventdat

#The SVEIR model

SVEIR <- function(t, x, parms){

with(as.list(c(parms,x)),{
dS <- - beta*betaE*E*(S/N) - beta*betaI*I*(S/N) -  f*S - m*S +delta*R + thita*V + r*N
dV <- - beta*betaE*betaV*E*(V/N) - beta*betaI*betaV*I*(V/N) - m*V - thita*V + f*S
dE <- + beta*betaE*E*(S/N) + beta*betaI*I*(S/N) + beta*betaE*betaV*E*(V/N) + beta*betaI*betaV*I*(V/N) - (m + kapa + sigma)*E
dI <- + sigma*E - (m + alpha + gama)*I
dR <- kapa*E + gama*I - m*R - delta*R       
der <- c(dS, dV, dE, dI, dR)
list(der)      
})

} 

library(deSolve)

out <- as.data.frame(lsoda(inits, dt, SVEIR, parms=parms, events = list(data = eventdat))) 

# Plotting the output

attach(out)

matplot(x = out[,1], y = out[,-1], type = "l", lwd = 2,
    lty = "solid", col = c("red", "blue", "black", "green", "darkgreen"),
    xlab = "time", ylab = "y", main = "SVEIR model")

legend("bottomright", col = c("red", "blue", "black", "green", "darkgreen"),
   legend = c("S", "V", "E", "I", "R"), lwd = 2)

除此之外,我还希望我的模型捕捉某些参数的变化。所以,我一直在尝试(到目前为止没有成功)在我的函数中集成一个“while”或“for”循环,它考虑了以下几点:

  1. 对于 0 – 9 之间的时间段,我需要参数的值 betaV 为 0
  2. 对于 10 – 50 之间的时间段,我需要 参数 betaV 为 0.002

我尝试使用事件,但 R 给了我一个错误(我想我只能将事件用于变量而不是参数)。

知道如何处理这个吗??

非常感谢,

汤姆

PS:该模型基于 (Samsuzzoha et. al., 2012) 的工作。

【问题讨论】:

    标签: r


    【解决方案1】:

    您的基本问题似乎是如何根据时间指定betaV 的两个不同值。你不能在函数中这样做吗,如:

    #The SVEIR model
    SVEIR <- function(t, x, parms){ 
      with(as.list(c(parms,x)),{
        betaV <- ifelse(t<10,betaV,0.002)  # adjust betaV based on value of t
        dS <- - beta*betaE*E*(S/N) - beta*betaI*I*(S/N) -  f*S - m*S +delta*R + thita*V + r*N
        dV <- - beta*betaE*betaV*E*(V/N) - beta*betaI*betaV*I*(V/N) - m*V - thita*V + f*S
        dE <- + beta*betaE*E*(S/N) + beta*betaI*I*(S/N) + beta*betaE*betaV*E*(V/N) + beta*betaI*betaV*I*(V/N) - (m + kapa + sigma)*E
        dI <- + sigma*E - (m + alpha + gama)*I
        dR <- kapa*E + gama*I - m*R - delta*R       
        der <- c(dS, dV, dE, dI, dR)
        list(der)      
      })
    

    请注意,您的问题实际上并未在 9 &lt; t &lt; 10 上指定 betaV 的值,因此我假设截止值为 10。

    当我使用betaV = 0.002 (t&gt;10) 运行它时,输出没有明显的差异。如果我为t &gt; 10betaV 设置为1 或10,则V(t) 被抑制为大tS, E, I and R 被转移到较低的时间。这听起来对吗?

    【讨论】:

    • 亲爱的 jlhoward,现在效果很好。你也是对的(关于 10 的截止点)。非常感谢您的宝贵帮助。最好的问候,汤姆
    • 不客气。乐意效劳。如果答案有帮助,请考虑“接受”它 (SO guidelines here)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多