[英]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.