如何计算R中曲线下面积的Sobol灵敏度?

时间:2019-12-09 20:45:15

标签: r ode chemistry

我已经使用dMod软件包在R中编写了一个相当复杂的常微分方程药代动力学/药效学模型。我已经将其转换为ODEsensitivity软件包可以读取的方程式,因此我可以获得速率常数的Sobol灵敏度指数。我可以将速率常数对不同隔室中药物浓度值的贡献返回。但是,我希望得到的读数是隔室中的药物暴露持续时间–这可以通过药物超过有效浓度的时间量或曲线下面积来实现。但是,我不了解如何评估比药物浓度更复杂的指标的Sobol敏感性。如何为不同的输出返回Sobol索引?

我编写了以下简单的玩具版本,以模拟两个不同大小的隔室之间的药物转移,以进行演示。下面的代码在ster_C1和ster_C2的每个时间点返回敏感度数据帧。我宁愿评估ster_C1 / ster_C2的灵敏度,也可以评估某些任意时间点之间ster_C1的曲线下面积。预先感谢!

toymod <- function(Time, State, Pars) {
  with(as.list(c(State, Pars)), {
    dchem_B <- -1*(k01*chem_B) +1*(k02*chem_C)*(1/10)
    dchem_C <- 1*(k01*chem_B)*(10/1) -1*(k02*chem_C)
    return(list( c(dchem_B, dchem_C) ))
  })
}

toyparams <- c(
  chem_B = 1e-10,
  chem_C = 0,
  k01 = 200,
  k02 = 1000
)

toyparnames <- names(toyparams)
toylower <- toyparams/10
toyupper <- toyparams*10
toyinit <- c(chem_B = 1e-10, chem_C = 0)
toytimes <- seq(5e-05, 0.005, len = 100)
set.seed(59281)

toy_sobol <- ODEsobol(mod = toymod, pars = toyparnames,
                      state_init = toyinit,
                      times = toytimes,
                      n = 500,
                      rfuncs = "runif",
                      rargs = paste0("min = ", toylower,
                                     ", max = ", toyupper),
                      sobol_method = "Martinez",
                      ode_method = "lsoda",
                      parallel_eval = TRUE,
                      parallel_eval_ncores = 2)

0 个答案:

没有答案