我正在尝试对年龄分层的SEIR模型进行编码;也就是说,在我的微分方程中,我有一个质量作用的参数,它是20个年龄段的β*(受感染的比例)*(易受影响的数量)的总和。根据接触矩阵计算透射系数(β)。联系矩阵有20列和行,代表年龄类(行=人i,列=人j),并包含任何年龄组中两个人之间的联系概率。我设计了它并将其读入R.我的问题是我不知道如何(或者如果)我可以使用deSolve在我的参数中使用矩阵。我写下面的代码不起作用,我相信因为矩阵/我得到这个错误:
Error in beta * S : non-numeric argument to binary operator
在我愚弄它之前,我想知道是否可以使用这样的矩阵作为此模型的参数。
mat <-as.matrix(read.csv("H:/IBS 796R/contactmatrix.csv", header=F))
times <- seq(0,20,by=1/52)
parameters <- c(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15)
xstart <- c(S=0.06,E=0,I=0.001,R=0)
SEIR0 <- function(t,x,parameters){
S=x[1]
E=x[2]
I=x[3]
R=x[4]
with(as.list(parameters), {
dS=v*S -beta*S*I/N -delta*S
dE=beta*S*1/N -E*(sigma+delta)
dI=sigma*E -I*(gamma+delta)
dR=gamma*I-delta*R
res=c(dS,dE,dI,dR)
list(res)
})
}
out <- as.data.frame(lsoda(xstart,times,SEIR0,parameters))
另外,如果我打印参数,这就是beta的样子:
$beta.V1
[1] 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04
[12] 4e-04 4e-04 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03
$beta.V2
[1] 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04
[12] 4e-04 4e-04 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03
....通过$ beta.V20。所以我认为它创建了20个向量,每个向量有20个参数......我认为每个向量都是原始矩阵“mat”的一行乘以常量0.04?但是,当我将mat * 0.04乘以“参数”之外时,我得到了预期的矩阵。我正在努力解决如何使用deSolve实现这些方程式的问题,并且会对是否有可能提出任何建议。提前谢谢。
答案 0 :(得分:1)
此行发生错误:
dS=v*S -beta*S*I/N -delta*S
non-numeric argument to binary operator
表示您尝试将函数乘以例如数字。您可以通过I*1
Error in I * 1 : non-numeric argument to binary operator`
在这里,R可以'找到beta,而beta被解释为数学的特殊功能,所以错误。 您需要将参数定义为
# a list
list(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15)
和
## you get a vector mu,N,p,delta,beta1,bet2,...
c(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15)
我认为你甚至可以将你的功能重写为:
SEIR0 <- function(t,x,parameters){
with(as.list(c(parameters, x)), {
dS = v*S -beta*S*I/N -delta*S ## matrix
dE = beta*S*1/N -E*(sigma+delta) ## matrix
dI = sigma*E -I*(gamma+delta)
dR = gamma*I-delta*R
res = c(dS,dE,dI,dR)
list(res) ## different of the structure of xstart
})
}
这将解决上述问题,但ODE将无法工作,因为SEIR0返回的导数必须等于初始条件xstart
向量的长度(此处为4)。
我建议例如:
res <- c(dS=mean(dS),dE=mean(dE),dI=dI,dR=dR)
list(res)