- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个按年龄分层的 SEIR 模型;也就是说,在我的微分方程中,我有一个质量作用参数,它是 20 个年龄段的 beta*(感染比例)*(易感人数)的总和。传输系数 (beta) 是根据接触矩阵计算的。联系矩阵有 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 实现这些方程式而苦苦挣扎,如果有任何可能的建议,我将不胜感激。提前致谢。
最佳答案
错误发生在这一行:
dS=v*S -beta*S*I/N -delta*S
二元运算符的非数字参数
意味着您尝试将一个函数与一个数字相乘。您可以通过 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)
关于r - deSolve 包参数可以包含矩阵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15331394/
我正在尝试编写一个按年龄分层的 SEIR 模型;也就是说,在我的微分方程中,我有一个质量作用参数,它是 20 个年龄段的 beta*(感染比例)*(易感人数)的总和。传输系数 (beta) 是根据接触
我有一个具有指定参数和初始值的捕食者-猎物模型。我在这里以两种方式求解微分方程 1. 使用 for 循环和 2. 使用 deSolve 包。我相信 for 循环是正确的,应该会给出如下图所示的输出。
我是 R 和 deSolve 的新手。我正在尝试用给定的初始参数和状态变量值求解方程。但是,最后由于我的参数没有对象而出现错误。我该如何克服这个问题?我是否为每个参数创建一个新对象? 这是模型的语法:
我正在尝试使用 deSolve 解决 R 中的 ODE .使用以下代码,我期望参数 gamma0在时间步长 0、1、2、3、4、5、6、7、8、9 和 10 处取值 5,否则取 0。然而,print(
我正在 deSolve (R) 中编写延迟微分方程,但收到一条错误消息,我不确定如何求解。所以对于一些背景。我有一个包含 12 个微分方程的系统,其中 3 个有延迟。我在没有 deSolve 的情况下
我正在尝试求解 R 中的常微分方程。我有矩阵作为初始值和我已经定义的参数。但是当我尝试解决它时,出现以下错误,当我输入单个值而不是矩阵时,该错误不会出现。 Error in (beta) %*% S
我一直在 MCMC 算法中使用 deSolve 包来估计 ODE 中的参数,并用 C 语言编写求解器中使用的函数来加速算法。有时,但并非总是如此,在运行 ode 函数时,我会收到错误 Error in
我目前正在使用 Python 探索洛伦兹系统和 R并注意到 ode 中的细微差别包。 odeint 来自 Python和 ode 都说他们使用 lsoda来计算它们的导数。但是,使用 lsoda两者的
我正在使用 deSolve 包求解 R 中的 ODE。为了加快计算速度我想使用编译代码,使用指令here 我在下面展示了一个 ODE 系统的示例 - 我正在使用下面的 Rcpp 进行编码。 ODE 系
所以我想问一下是否有任何方法可以使用矩阵表示法在 R 中定义和求解微分方程组。 我知道你通常会做类似的事情 lotka-volterra <- function(t,a,b,c,d,x,y){
我想使用 deSolve R 包中的显式 Runge-Kutta 方法 ode45(别名 rk45dp7)来求解具有可变步长的 ODE 问题。 根据 deSolve 文档,可以为 rk 使用自适应或可
我有一个 ODE,我想使用从 R 的 deSolve 包中调用的编译 C 代码来解决它。有问题的 ODE 是指数衰减模型 (y'=-d* exp(g* time)*y):但是从 R 中运行编译后的代码
我是一名优秀的程序员,十分优秀!