在R ODE模型中传递阈值后的延迟变化参数值

时间:2018-02-21 13:27:01

标签: r ode eventtrigger timedelay

我在R中解决了一组ODE,并且遇到了两件事:

  1. 在变量( D )之后经过一段设定的时间(延迟)后更改参数( m )超过阈值( D_T )。

  2. 返回一个参数值数组,以便我可以仔细检查它是否在正确的时间更改。

  3. 我目前正在使用deSolve,但我想知道是否需要编写自己的ode解算器。我查看Different parameters’ values for different time intervals in deSolve,但它(1)在预定时间更改参数值,而不是在ODE模型中求解的值超过阈值并且(2)没有时间延迟时零件。

    到目前为止,这是我的代码没有时间延迟:

    # define parameters 
    P <- c(m_0 = 10,
           R_1 = 0.5, 
           R_2 = 0.1,  
           D_0 = 50,         
           D_T = 5,
           delay = 3
    ) 
    # set initial values 
    y_0 <- c(D = 0, m=10)
    
    # set timesteps
    times <- seq(0, 100, length = 101) 
    
    # define function   
    bit <- function(t,y,parms){
      with(as.list(c(parms,y)),{
    
        m <- ifelse(D >= D_T, m_0 *.68, m_0)  
    
        dD <- D_0 * (R_1 / (R_1 - R_2)) * (-R_2 * exp(-R_2 * t) + R_1 * exp(-R_1 * t)) 
    
        res <- c(dD, m)
        list(res)
      })
    }
    
    
    # Solve model
    library(deSolve)
    out <- ode(y = y_0, times = times, func = bit, parms = P)
    out.df <- as.data.frame(out)
    

    一个问题是 m 随着每个时间单位而增加。它应该只有10(低于阈值时)或6.8(高于阈值时)。它是否被视为ODE,因为我将它包含在初始条件向量中并返回衍生向量?在使用deSolve时,如何检查函数中的变量?

    关于时间延迟,我考虑过类似下面的内容,但它也没有用。 m 不断增加,似乎没有任何时间延迟:

    if (D >= D_T){
          T_start = t + delay
          while (t > T_start){
            m <- 0.68 * m_0
          }
        }
    

    提前致谢。我很感激您的任何建议。

    更新

    我认为我正在寻找的是具有时间延迟的事件处理,而不仅仅是时间延迟。

    为了澄清,D是药物浓度。如果D上升到阈值(D_T)以上,m将被设置为新值,但是在短时间延迟之后。类似地,当D低于D_T时,m将在相同的延迟周期后重置为其原始值。到目前为止,最接近的例子是p上的球弹跳问题。 25:&lt; https://cran.r-project.org/web/packages/deSolve/vignettes/deSolve.pdf&gt; 。它没有时间组件。也许我需要多个事件(一个集中触发定时器启动,另一个定时器触发m的变化)?例如:

    event1 <- function(t,y,parms){
      difference <- D - D_T
      difference <- 0  # when D = D_T, trigger event 1
      Timer <- delay   # countdown for delay
    }
    event2 <- function (t,y,parms) {
        Timer <- 0     # when delay is over, trigger event 2
        m <- m*0.68    # new m value 
    }
    
    # solve ode by calling function and relevant events
    out <- ode(func = bit, y = y_0, times = times, parms = P, + event1 + event2)
    

    有更紧凑的方法吗?目前,我必须写另外2个事件来捕捉D再次低于D_T时的变化。谢谢!

1 个答案:

答案 0 :(得分:0)

你非常亲密!如您所料,您将m视为ODE中的变量。所以,把它从你的初始条件中拿出来。您仍然可以将其作为列表元素从函数中返回,如下所示。关于延迟,请使用dede代替ode。您还需要lagvalue函数来访问状态变量的先前值。坚持这一切,你得到这个。

# define parameters 
P <- c(m_0 = 10,
       R_1 = 0.5, 
       R_2 = 0.1,  
       D_0 = 50,         
       D_T = 5,
       delay = 3
) 
# set initial values 
y_0 <- c(D = 0)

# set timesteps
times <- seq(0, 100, length = 101) 

# define function   
bit <- function(t,y,parms){
  with(as.list(c(parms,y)),{

    if(t>delay){
      m <- ifelse(lagvalue(t-delay) >= D_T, m_0 *.68, m_0)  
    }else{
      m <- m_0
    }

    dD <- D_0 * (R_1 / (R_1 - R_2)) * (-R_2 * exp(-R_2 * t) + R_1 * exp(-R_1 * t)) 

    list(dD, m = m)
  })
}


# Solve model
library(deSolve)
out <- dede(y = y_0, times = times, func = bit, parms = P)
out.df <- as.data.frame(out)

产生

    time            D    m
1      0  0.000000000 10.0
2      1 18.644171500 10.0
3      2 28.178200649 10.0
4      3 32.355497453 10.0
5      4 33.436541140  6.8
6      5 32.777847256  6.8
7      6 31.189028116  6.8
8      7 29.149237619  6.8
9      8 26.938325140  6.8
10     9 24.716283542  6.8
11    10 22.571335485  6.8
12    11 20.549011615  6.8
13    12 18.669708334  6.8
14    13 16.939264216  6.8
15    14 15.355309725  6.8
16    15 13.911059339  6.8
17    16 12.597558070  6.8
18    17 11.404995591  6.8
19    18 10.323459512  6.8
20    19  9.343352574  6.8
21    20  8.455609818  6.8
22    21  7.651797850  6.8
23    22  6.924145655  6.8
24    23  6.265536717  6.8
25    24  5.669480182  6.8
26    25  5.130071613  6.8
27    26  4.641949483  6.8
28    27  4.200250976  6.8
29    28  3.800569059  6.8
30    29  3.438911847 10.0
31    30  3.111664769 10.0
32    31  2.815555669 10.0
33    32  2.547622830 10.0
34    33  2.305185812 10.0
35    34  2.085818900 10.0
36    35  1.887327010 10.0
37    36  1.707723816 10.0
38    37  1.545211942 10.0
39    38  1.398165006 10.0
40    39  1.265111368 10.0
41    40  1.144719417 10.0
42    41  1.035784250 10.0
43    42  0.937215619 10.0
44    43  0.848027025 10.0
45    44  0.767325842 10.0
46    45  0.694304388 10.0
47    46  0.628231843 10.0
48    47  0.568446930 10.0
49    48  0.514351303 10.0
50    49  0.465403556 10.0
51    50  0.421113802 10.0
52    51  0.381038775 10.0
53    52  0.344777391 10.0
54    53  0.311966734 10.0
55    54  0.282278424 10.0
56    55  0.255415330 10.0
57    56  0.231108597 10.0
58    57  0.209114956 10.0
59    58  0.189214287 10.0
60    59  0.171207416 10.0
61    60  0.154914126 10.0
62    61  0.140171348 10.0
63    62  0.126831530 10.0
64    63  0.114761164 10.0
65    64  0.103839445 10.0
66    65  0.093957065 10.0
67    66  0.085015117 10.0
68    67  0.076924109 10.0
69    68  0.069603062 10.0
70    69  0.062978704 10.0
71    70  0.056984738 10.0
72    71  0.051561173 10.0
73    72  0.046653728 10.0
74    73  0.042213289 10.0
75    74  0.038195413 10.0
76    75  0.034559888 10.0
77    76  0.031270330 10.0
78    77  0.028293814 10.0
79    78  0.025600551 10.0
80    79  0.023163586 10.0
81    80  0.020958529 10.0
82    81  0.018963311 10.0
83    82  0.017157963 10.0
84    83  0.015524416 10.0
85    84  0.014046322 10.0
86    85  0.012708888 10.0
87    86  0.011498727 10.0
88    87  0.010403728 10.0
89    88  0.009412932 10.0
90    89  0.008516422 10.0
91    90  0.007705227 10.0
92    91  0.006971228 10.0
93    92  0.006307077 10.0
94    93  0.005706129 10.0
95    94  0.005162369 10.0
96    95  0.004670354 10.0
97    96  0.004225161 10.0
98    97  0.003822333 10.0
99    98  0.003457839 10.0
100   99  0.003128032 10.0
101  100  0.002829610 10.0

注意根据需要在{29}之间切换m的延迟。