如何基于多个组在 R 中构造 ODE

How to structure ODEs in R based on multiple groups

我正在尝试在 R 中模拟细胞摄取,从 Berkeley Madonna 移植了一个模型。该模型由几个常量和微分方程组成,用于计算数量和浓度。列出部分代码:

library(deSolve)

fb = 0.0510
Km = 23.5
Pdif = 0.429
Vmax = 270
Vol_cell = 9.33
Vol_media = 150
S = 10 #concentration of dosing media

yini = c(Amt_media=(S*Vol_media)-(S*fb*Vol_cell), 
         Amt_cell=S*fb*Vol_cell, 
         Amt_total=S*Vol_media, 
         Con_media=S-(S*fb), 
         Con_cell=S*fb)

Uptake = function(t, y, p){
   dy1 = (- (Pdif * y[1]) + (Pdif * y[2]) - ((Vmax * y[4])/(Km + y[4]))) 
   dy2 = (+ (Pdif * y[1]) - (Pdif * y[2]) + ((Vmax * y[4])/(Km + y[4])))
   dy3 = dy1 + dy2
   dy4 = dy1 / Vol_media
   dy5 = dy2 / Vol_cell
   list(c(dy1, dy2, dy3, dy4, dy5))}

times1 = seq(from=0, to=15, by=0.01)
out1 = ode(y=yini, times=times1, func=Uptake, parms=NULL, method="rk4")

其余代码用于输出到数据帧和绘图。那么我的问题是如何构建代码以使用 "S" 作为几个浓度的列表,以便每个浓度都可以应用于微分方程(基本上给我一个 S1 的 out1,S2 的 out2,等等,那然后可以传递到数据框上)?在 Berkeley Madonna,这是通过编写超过 35 个微分方程来实现的,但如果可能的话,我想在 R 中使用简化的方法。

唯一使用 S 的部分是 yini 值的初始化。基本上我们只需要将该部分和使用这些值运行 ode 的部分移动到一个新函数中。然后您可以调用该函数以获得您想要的任何值。例如

#set up
library(deSolve)

fb <- 0.0510
Km <- 23.5
Pdif <- 0.429
Vmax <- 270
Vol_cell <- 9.33
Vol_media <- 150

Uptake <- function(t, y, p){
   dy1 = (- (Pdif * y[1]) + (Pdif * y[2]) - ((Vmax * y[4])/(Km + y[4]))) 
   dy2 = (+ (Pdif * y[1]) - (Pdif * y[2]) + ((Vmax * y[4])/(Km + y[4])))
   dy3 = dy1 + dy2
   dy4 = dy1 / Vol_media
   dy5 = dy2 / Vol_cell
   list(c(dy1, dy2, dy3, dy4, dy5))}

times1 <- seq(from=0, to=15, by=0.01)

# function with S as a parameter
runConc <- function(S) {
  yini <- c(Amt_media=(S*Vol_media)-(S*fb*Vol_cell), 
    Amt_cell=S*fb*Vol_cell, 
    Amt_total=S*Vol_media, 
    Con_media=S-(S*fb), 
    Con_cell=S*fb)

    ode(y=yini, times=times1, func=Uptake, parms=NULL, method="rk4")
}

#run for concentrations 10,20,30
out <- lapply(c(10,20,30), runConc)

这将生成一个列表对象,其中包含每个浓度的结果。所以 out[[1]] 是 S=10 的结果,out[[2]]S=20,等等。我们可以看到每个结果的前几行带有

lapply(out, head, 3)

# [[1]]
#      time Amt_media Amt_cell Amt_total Con_media Con_cell
# [1,] 0.00  1495.242  4.75830      1500  9.490000 0.510000
# [2,] 0.01  1488.103 11.89710      1500  9.442408 1.275145
# [3,] 0.02  1481.028 18.97216      1500  9.395241 2.033457
# 
# [[2]]
#      time Amt_media Amt_cell Amt_total Con_media Con_cell
# [1,] 0.00  2990.483  9.51660      3000  18.98000 1.020000
# [2,] 0.01  2976.550 23.44980      3000  18.88711 2.513377
# [3,] 0.02  2962.739 37.26072      3000  18.79504 3.993646
# 
# [[3]]
#      time Amt_media Amt_cell Amt_total Con_media Con_cell
# [1,] 0.00  4485.725 14.27490      4500  28.47000  1.53000
# [2,] 0.01  4465.153 34.84653      4500  28.33286  3.73489
# [3,] 0.02  4444.761 55.23920      4500  28.19690  5.92060