使用deSolve package-ddply函数模拟数据

时间:2015-02-12 12:58:01

标签: r plyr differential-equations

我无法在deSolve包中为每个受试者ID应用微分方程求解器来计算2室静脉输液模型中的药物量。我能够设置代码(下面),因此它解决了一个主题。我需要帮助,了解如何使用ddply包将其应用于数据框中的每个主题。

下面是一个名为simeventdfi的数据框,其中包含计算所需的剂量事件。

library(deSolve)

步骤1:为每个主题提供事件df

 simeventdfi <- 
 ID  var time value method
 1    3   0.0   6   rep
 1    3  16.7   0   rep
 1    4  0.0    2.4 rep
 1    4  16.7   2.4 rep
 1    5  0.0    10  rep
 1    5  16.7   10  rep
 1    6  0.0    1   rep
 1    6  16.7   1   rep
 1    7  0.0    25  rep
 1    7  16.7   25  rep
 2    3  0.0    6   rep
 2    3  16.7   0   rep
 2    4  0.0    2.4 rep
 2    4  16.7   2.4 rep
 2    5  0.0    10  rep
 2    5  16.7   10  rep
 2    6  0.0    1   rep
 2    6  16.7   1   rep
 2    7  0.0    25  rep
 2    7  16.7   25  rep

步骤2:指定模拟值的时间

   simtimes <- sort(unique(c(simeventdfi$time, seq(0,10,1))))

步骤3:包含隔室中金额的微分方程的函数(A)

  #THETAin is empty for this model   
   simthetai <- NULL

 DES <- function(T, A, THETAin)
  {

    RATE  <- A[3]    #Dose rate (time dependent)
    CL <- A[4]         #Time dependent                           
    V1 <- A[5]         #Time dependent
    Q  <- A[6]         #Time dependent
    V2 <- A[7]         #Time dependent

    dA1 <- RATE -Q/V1*A[1] +Q/V2*A[2] -CL/V1*A[1]  #Central compartment 
    dA2 <- Q/V1*A[1] - Q/V2*A[2]     #Peripheral compartment 

    RATE <- 0  #Set rate to zero so doesn't change unless event
    dCL <- 0 
    dV1 <- 0
    dQ <- 0
    dV2 <- 0   
   list(c(dA1,dA2,RATE,dCL,dV1,dQ,dV2))   #List of derivatives
     }

步骤4:由于我能够将功能码设置为仅解决一个主题ID,因此我必须从上面给出的ID中对一个主题simeventdfi进行子集。但是,我想知道如何使用ddply为每个主题ID应用微分方程求解器。现在,我将上面的simeventdfi为一个主题的子集,以演示该函数的工作原理。

simeventdfi <- subset(simeventdfi,ID==1)

设置初始值 - 隔间和时间相关参数

    A_0i <- c("A1"=0,"A2"=0,
      "Rate"=simeventdfi$value[1],
      "CL"=simeventdfi$value[simeventdfi$var==4 & simeventdfi$time==0],
      "V1"=simeventdfi$value[simeventdfi$var==5 & simeventdfi$time==0],
      "Q"= simeventdfi$value[simeventdfi$var==6 & simeventdfi$time==0],
      "V2"=simeventdfi$value[simeventdfi$var==7 & simeventdfi$time==0]) 
   print(A_0i)

步骤5:运行微分方程求解器并在数据帧中获得结果

    simdatadfi <- as.data.frame(ode(A_0i, simtimes, DES, simthetai, events=list(data=simeventdfi), method="lsoda"))

它仅适用于一个主题。对于如何在simeventdfi中为每个主题应用步骤5中的微分方程求解器,我需要帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用dplyr。只需使用group_by(ID)为每个主题应用微分方程。显然ode不喜欢dplyr数据格式,因此您需要在data.frame(.)调用中使用.而不是do

require(dplyr)
simeventdfi %>% 
  group_by(ID) %>% 
  do(
    ode(A_0i, 
        simtimes, 
        DES, 
        simthetai, 
        events=list(data=data.frame(.)), 
        method="lsoda") %>%
      data.frame
  ) %>% 
  data.frame

答案 1 :(得分:0)

将微分方程求解器应用于每个主题:

首先:将第4步写为函数:

  simulate.conc <- function(simeventdfi) { 

      #Initial values - compartments and time-dependent parameters
      A_0i <- c("A1"=0,"A2"=0,
        "Rate"=simeventdfi$value[1],
        "CL"=simeventdfi$value[simeventdfi$var==4 & simeventdfi$time==0],
        "V1"=simeventdfi$value[simeventdfi$var==5 & simeventdfi$time==0],
        "Q"= simeventdfi$value[simeventdfi$var==6 & simeventdfi$time==0],
        "V2"=simeventdfi$value[simeventdfi$var==7 & simeventdfi$time==0]) 

   #Run differential equation solver 
     simdata <- ode(A_0i, simtimes, DES, simthetai, events=list(data=simeventdfi), method="lsoda")

 #Process the simulated output 
  simdata <- as.data.frame(simdata)

  #Concentration in the central compartment
  simdata$conc <- simdata$A1/simdata$V1    #Amount to concentration

  #remove any duplicated datapoints
  simdata <- simdata[!duplicated(simdata), ]
 }

第二:使用ddply

在simeventdfi中的每个ID上应用该函数
 library(plyr)
 simdata_DES <- ddply(simeventdfi, .(ID), simulate.conc)

容易!