简体   繁体   English

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

[英]Simulating data using deSolve package- ddply function

I have trouble applying the differential equation solver for each subject ID in the deSolve package to calculate drug amount in a 2-compartment intravenous infusion model. 我无法在deSolve包中为每个受试者ID应用微分方程求解器来计算2室静脉输注模型中的药物量。 I was able to set the code (below) so it solves for one subject. 我能够设置代码(下面),因此它解决了一个主题。 I need help in how to apply it for every subject in the data frame using the ddply package. 我需要有关如何使用ddply包将其应用于数据框中的每个主题的ddply

Below is a data frame called simeventdfi that has the dose events needed for calculations. 下面是一个名为simeventdfi的数据框,它具有计算所需的剂量事件。

library(deSolve)

Step1: provide the event df for each subject 步骤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

Step 2: Specify the times for the simulated values 第2步:指定模拟值的时间

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

Step 3: Function containing differential equations for amounts in compartments (A) 步骤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
     }

Step 4: Since I was able to set the functioncode to solve for one subject ID only, then I have to subset one subject ID from the simeventdfi given above. 第4步:因为我能够设置功能代码只解决一个主题ID,所以我必须从simeventdfi给出的simeventdfi分配一个主题ID However, I want help in how to apply the differential equation solver for every subject ID using ddply . 但是,我需要有关如何使用ddply将微分方程求解器应用于每个主题ID的ddply For now, I will subset the simeventdfi above for one subject to demonstrate how the function works. 现在,我将为一个主题对上面的simeventdfi进行子集simeventdfi ,以演示该功能的工作原理。

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

Set 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]) 
   print(A_0i)

Step 5: Run differential equation solver and get results in a dataframe 步骤5:运行微分方程求解器,并在数据框中获取结果

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

It runs fine with one subject only. 它只运行一个主题。 I need help in how to apply the differential equation solver in Step 5 for each subject in simeventdfi . 对于如何在simeventdfi为每个主题应用步骤5中的微分方程求解器,我需要帮助。

You can use dplyr . 您可以使用dplyr Just use group_by(ID) to apply the differential equation for each subject. 只需使用group_by(ID)为每个主题应用微分方程。 Apparently ode does not like the dplyr data format, so you need to use data.frame(.) instead of just . 显然ode不喜欢dplyr数据格式,所以你需要使用data.frame(.)而不是. in the do call. 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

To apply the differential equation solver to every subject: 要将微分方程求解器应用于每个主题:

First: write step 4 as a function: 第一步:将第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), ]
 }

Second: apply the function on every ID in the simeventdfi using ddply 第二:使用ddply将功能应用于simeventdfi中的每个ID

 library(plyr)
 simdata_DES <- ddply(simeventdfi, .(ID), simulate.conc)

Easy ! 简单 !

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM