我正在开发一种基于代理的模型,以模拟由栖息地多边形(或连接细胞团块)组成的异质景观中的传染病传播。为了简化模型,我考虑一个包含每个单元格的多边形ID的栖息地网格(或栅格)。另外,我有与每个多边形ID相关的流行病学参数。在每个时间步,参数值在多边形中改变。因此,在每个时间步骤更新数据帧</form>
<!-- Define "Download .csv link here" -->
<a href="javascript:void(0)" onclick="download_csv_function();" >Get data as csv file</a>
</form>
(见下文)。以下是t = 0的示例:
landscape
为了研究疾病动态,我还在开发基于常微分方程(ODE)系统的隔室模型。以下是表示ODE系统的示例:
landscape <- data.frame(polygon_ID = seq(1, 10, by = 1),
beta = sample(c(100, 200, 400, 600), 10, replace = TRUE),
gamma = sample(c(25, 26, 27, 28), 10, replace = TRUE))
在每个时间步,是否可以将ODE系统应用于数据框solve_sir_model <- function (times, parameters) {
sir_model <- function (times, states, parameters) {
with(as.list(c(states, parameters)), {
dSdt <- -beta*S*I
dIdt <- beta*S*I-gamma*I
dRdt <- gamma*I
dNdt <- dSdt + dIdt + dRdt
return(list(c(dSdt, dIdt, dRdt, dNdt)))
})
}
states <- c(S = 99, I = 1, R = 0, N = 100)
return(ode(y = states, times = times, func = sir_model, parms = parameters))
}
require(deSolve)
output <- as.data.frame(solve_sir_model(times = seq(0, 5, by = 1), parameters = c(beta = 400, gamma = 28)))
中的每个栖息地多边形(因此每一行)?我使用lsoda作为ODE求解器。我是否需要在每个时间步使用其他求解器来应用ODE?
修改
似乎函数landscape
中的方法iteration
在我的案例中非常有用:
方法“迭代”的特殊之处在于函数func应该 返回状态变量的新值而不是速率 更改。这可以用于基于个体的模型,以用于差异 方程式,或者在其中执行积分的情况 FUNC)。
我已经测试了该方法,但我不明白为什么它不适用于单个时间步骤:
ode
答案 0 :(得分:1)
像这样。
# Library *not* require
library(deSolve)
# Parameters: number of polygons, beta, & gamma
n.polys <- 10
beta <- sample(c(100, 200, 400, 600), n.polys, replace = TRUE)
gamma <- sample(c(25, 26, 27, 28), n.polys, replace = TRUE)
# Model defintion
sir_model <- function (t, Y, pars) {
# Break up state variable into parts
S <- Y[1:n.polys]
I <- Y[(n.polys+1):(2 * n.polys)]
R <- Y[(2 * n.polys+1):(3 * n.polys)]
# Calculate rate of change
dSdt <- -beta * S * I
dIdt <- beta * S * I - gamma * I
dRdt <- gamma * I
# Return rates of change after concatenating them
return(list(c(dSdt, dIdt, dRdt)))
}
# Initial conditions
Y.ini <- c(S = rep(99, n.polys), I = rep(1, n.polys), R = rep(0, n.polys))
# Solve the model
ode(y = Y.ini, times = 0:5, func = sir_model, parms = NULL)