模拟不同的参数值

时间:2020-06-22 16:25:36

标签: r function loops dataframe

我正在使用desolve库运行以下代码。现在,我想针对不同的koff_WT值运行相同的代码。请提出任何简单的方法。

 kon_WT = 1         
    koff_WT = 10
    R_WT =   20

Complex <- function (t,y,parms){
  with(as.list(y), {
    
    dC_WT <-  koff_WT*RL_WT -kon_WT*R_WT*C_WT 
    dRL_WT <- kon_WT*R_WT*C_WT - koff_WT*RL_WT   #uM
    dR_WT <-  koff_WT*RL_WT -kon_WT*R_WT*C_WT 
      
    
    return(list(c(dC_WT, dRL_WT, dR_WT)))
  })
}
times <- seq(0,1,0.01)
Out <- ode(y = c(C_WT = 10, RL_WT = 0, R_WT= R_WT), 
        times = times, func=Complex, parms=NULL)
Output <- data.frame(Out)

2 个答案:

答案 0 :(得分:1)

最好使用parms参数将常量列表传递给complex函数。目前,它什么也没做。

如果采用这种方式安排,则可以创建第二个函数,该函数将针对您喜欢的koff_WT的任何值运行模拟:

library(deSolve)

Complex <- function (t ,y, parms){
  y <- as.list(y)    
  list(c(dC_WT  = parms$koff_WT * y$RL_WT - parms$kon_WT * y$R_WT * y$C_W,
         dRL_WT = parms$kon_WT * y$R_WT * y$C_WT - parms$koff_WT * y$RL_WT,
         dR_WT  = parms$koff_WT * y$RL_WT - parms$kon_WT * y$R_WT * y$C_WT ))
}

ode_frame <- function(koff_var){
  times <- seq(0, 1, 0.01)
  data.frame(ode(y = c(C_WT = 10, RL_WT = 0, R_WT = 20), 
                 times = times, func = Complex, 
                 parms = list(kon_WT = 1, koff_WT = koff_var)))
}

因此,您可以使用koff_WTlapply的三个不同值创建三个数据帧的列表:

new_koffs <- c(0.5, 1, 1.5)

Output <- lapply(new_koffs, ode_frame)

结果太大,无法在此处打印,但这是其结构:

str(Output)
#> List of 3
#>  $ :'data.frame':    101 obs. of  4 variables:
#>   ..$ time : num [1:101] 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 ...
#>   ..$ C_WT : num [1:101] 10 8.27 6.95 5.91 5.08 ...
#>   ..$ RL_WT: num [1:101] 0 1.73 3.05 4.09 4.92 ...
#>   ..$ R_WT : num [1:101] 20 18.3 16.9 15.9 15.1 ...
#>  $ :'data.frame':    101 obs. of  4 variables:
#>   ..$ time : num [1:101] 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 ...
#>   ..$ C_WT : num [1:101] 10 8.27 6.96 5.94 5.13 ...
#>   ..$ RL_WT: num [1:101] 0 1.73 3.04 4.06 4.87 ...
#>   ..$ R_WT : num [1:101] 20 18.3 17 15.9 15.1 ...
#>  $ :'data.frame':    101 obs. of  4 variables:
#>   ..$ time : num [1:101] 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 ...
#>   ..$ C_WT : num [1:101] 10 8.27 6.97 5.96 5.17 ...
#>   ..$ RL_WT: num [1:101] 0 1.73 3.03 4.04 4.83 ...
#>   ..$ R_WT : num [1:101] 20 18.3 17 16 15.2 ...

答案 1 :(得分:1)

您可以使用函数来定义函数Complex()

library("deSolve")
kon_WT = 1         
## koff_WT = 10
R_WT =   20

defComplex <- function(koff) {
  return( function (t, y, parms) {
    with(as.list(y), {
      dC_WT <-  koff*RL_WT - kon_WT*R_WT*C_WT 
      dRL_WT <- kon_WT*R_WT*C_WT - koff*RL_WT   #uM
      dR_WT <-  koff*RL_WT - kon_WT*R_WT*C_WT 
      return(list(c(dC_WT, dRL_WT, dR_WT)))
    })
  })
}

resC_WT <- function(iC_WT) {
  imes <- seq(0,1,0.01)
  Out <- ode(y = c(C_WT = iC_WT, RL_WT = 0, R_WT= R_WT), times = times, func=Complex, parms=NULL)
  Output <- data.frame(Out)
  return(Output[nrow(Output), ])
}

vectorC_WT <- 1:11

Complex <- defComplex(koff=10)
sapply(vectorC_WT, FUN=resC_WT)

Complex <- defComplex(koff=15)
sapply(vectorC_WT, FUN=resC_WT)

这不是很优雅,但是可以。
另外,您可以将两个工作行放在一个函数中,以使用另一个lapply()调用。