R deSolve中不同时间间隔的不同参数值

R deSolve中不同时间间隔的不同参数值,r,R,我正在尝试使用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, del

我正在尝试使用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”循环,但没有成功,该循环考虑了以下因素:

对于0到9之间的时间段,我需要参数的值 betaV为0 对于10到50之间的时间段,我需要 参数betaV为0.002 我曾尝试使用事件,但R给了我一个错误,我想我只能对变量使用事件,而不能对参数使用事件

你知道a怎么处理这个吗

非常感谢

汤姆


PS:该模型基于Samsuzzoha等人2012年的工作。

您的基本问题似乎是如何根据时间指定两个不同的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
当我在betaV=0.002 t>10的情况下运行此程序时,输出中没有明显的差异。如果我为t>10将betaV设置为1或10,则对于较大的t,Vt被抑制,并且S、E、I和R被移到较低的时间。这听起来对吗?

亲爱的jlhoward,现在效果很好。关于10点的截止点,你也是对的。非常感谢你的宝贵帮助。向你问好,汤姆,不客气。很乐意帮忙。如果答案是有用的,请考虑接受。