我无法在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中的微分方程求解器,我需要帮助。
答案 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)
容易!