首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >deSolve包参数可以包含矩阵吗?

deSolve包参数可以包含矩阵吗?
EN

Stack Overflow用户
提问于 2013-03-11 12:50:19
回答 1查看 787关注 0票数 3

我正在尝试编写一个按年龄分层的SEIR模型;也就是说,在我的微分方程中,我有一个关于质量作用的参数,它是20个年龄段的beta*(感染比例)*(易感人数)的总和。根据接触矩阵计算传输系数(β)。联系矩阵有20列和行,它们表示年龄类(rows=person i,columns=person j),并包含任何年龄类中两个人之间接触的概率。我设计了它,并将其读入R。我的问题是,我不知道如何(或是否)可以在deSolve的参数中使用矩阵。

代码语言:javascript
复制
Error in beta * S : non-numeric argument to binary operator

在我玩弄它之前,我想知道是否可以使用这样的矩阵作为这个模型的参数。

代码语言:javascript
复制
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版的样子:

代码语言:javascript
复制
$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

....through $beta.V20.所以我认为它创建了20个向量,每个向量都有20个参数…我认为每个向量都是原始矩阵的一行乘以常数0.04?然而,当我在“参数”之外乘以mat*0.04时,我得到了预期的矩阵。我正在为如何使用deSolve实现这些方程式而苦苦挣扎,如果有任何关于这是否可能的建议,我将不胜感激。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-11 14:01:18

错误出现在下面这一行:

代码语言:javascript
复制
dS=v*S -beta*S*I/N -delta*S

non-numeric argument to binary operator意味着你尝试将一个函数乘以一个数字。你可以通过I*1重现它

代码语言:javascript
复制
Error in I * 1 : non-numeric argument to binary operator`

这里,R找不到beta,beta被解释为数学的特殊函数,所以误差。您需要将参数定义为

代码语言:javascript
复制
# 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)

代码语言:javascript
复制
 ## 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)

我认为您甚至可以将您的函数重写为:

代码语言:javascript
复制
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)。

我建议举个例子:

代码语言:javascript
复制
  res <- c(dS=mean(dS),dE=mean(dE),dI=dI,dR=dR)
  list(res)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15331394

复制
相关文章

相似问题

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