[英]Difficulty running an ODE model in R including a parameter that varies by time (forcing function)
我正在嘗試使用 deSolve 擬合一個相當基本的 ODE 模型,包括在模型中隨時間變化的參數(感染力;FOI)。 雖然在沒有此參數的情況下運行模型工作正常,但包含時間相關參數會產生錯誤(見下文)。
我對 R 和數學建模比較陌生,並且已經嘗試解決這個問題一段時間了。
我已將 FOI 參數創建為值矩陣,然后使用 approxfun 函數進行插值(正如我所見,這適用於強制函數,例如https://rdrr.io/rforge/deSolve/man/forcings.html )。
沒有此時間相關參數的模型運行時沒有任何錯誤,但嘗試包含它會出現錯誤:
Error in checkFunc(Func2, times, y, rho) :
The number of derivatives returned by func() (200) must equal the
length of the initial conditions vector (2)
我不知道如何解決這個錯誤,因為我只有 2 個初始條件,而且似乎包含這個與時間相關的 FOI 參數會生成更多的導數。
我知道其他人也問過類似的問題,但我沒有發現這個關於強制功能的問題。
非常感謝您提供任何建議。
# Forcing function data
foi <- matrix(ncol=2,byrow=TRUE,data=c(
0, 0.003, 2, 0.03, 3, 0.08, 4,0.1, 5, 0.12, 6, 0.15,
8, 0.16, 10, 0.14,12, 0.12,14,0.08,15, 0.06,16, 0.03,
17, 0.01,18,0.003,19,0.003,20,0.003,30,0.003,40,0.003,
50,0.003,60,0.003,65,0.01, 70,0.08, 72,0.095,74,0.10,
76,0.1, 78,0.08, 80,0.06))
age <- seq(0, 80, by = 1)
input <- approxfun(x = foi[,1], y = foi[,2], method = "constant", rule = 2)
# Function
ab <- function(time, state, pars) {
with(as.list(c(state, pars)), {
import<-c(input(t))
diggP<- (import *iggN) - iggR*iggP
diggN<- (-import*iggN) + iggR*iggP
return(list(c(diggP, diggN)))
})
}
# Initial values
yini <- c(iggP=0, iggN=1)
# Parameters
pars <- c(iggR = 0, import)
# ODE solver
results<- ode(y=yini, times=age, func=foi_model, pars)
我希望制作一個模型,其中在每個時間點(或在這種情況下為年齡),FOI 根據我在 FOI 矩陣中輸入的值而變化。 因此,我想看看隨年齡變化的 FOI 如何影響微分方程的輸出。
您的主要問題是您將參數t
傳遞給input
,但該變量在您的代碼中不存在。 時間作為名為time
的參數傳遞給您的模型。 (此外,您的模型被稱為ab
而不是foi_model
,正如對ode
的調用中所述,加上pars
不需要import
,應該傳遞給ode
。)
# Load library
library(deSolve)
# Create FOI matrix
foi <- matrix(ncol=2,byrow=TRUE,data=c(
0, 0.003, 2, 0.03, 3, 0.08, 4,0.1, 5, 0.12, 6, 0.15,
8, 0.16, 10, 0.14,12, 0.12,14,0.08,15, 0.06,16, 0.03,
17, 0.01,18,0.003,19,0.003,20,0.003,30,0.003,40,0.003,
50,0.003,60,0.003,65,0.01, 70,0.08, 72,0.095,74,0.10,
76,0.1, 78,0.08, 80,0.06))
# Times for model solution
age <- seq(0, 80, by = 1)
# Linear interpolation function from FOI data
input <- approxfun(x = foi[,1], y = foi[,2], method = "constant", rule = 2)
# Model to be integrated
ab <- function(time, state, parms) {
with(as.list(c(state, parms)), {
##### IMPORTANT #####
import<-input(time) #<- 'time' was previously 't'
#####################
# Derivatives
diggP<- (import *iggN) - iggR*iggP
diggN<- (-import*iggN) + iggR*iggP
# Return results
return(list(c(diggP, diggN)))
})
}
# Initial values
yini <- c(iggP=0, iggN=1)
# Parameters
pars <- c(iggR = 0)
# Solve model
results<- ode(y=yini, times=age, func=ab, parms = pars)
# Plot results
plot(results)
由reprex 包(v0.2.1) 於 2019 年 3 月 27 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.