2015-02-12 2 views
0

У меня есть проблема применения решателя дифференциальных уравнений для каждого объекта ID в пакете deSolve для расчета количества лекарственного средства в модели внутривенного вливания в 2 отсека. Мне удалось установить код (ниже), чтобы он разрешал для одного предмета. Мне нужна помощь в том, как применять его для каждого объекта в кадре данных, используя пакет ddply.Имитация данных с использованием функции deSolve package-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: Функциональные содержащие дифференциальные уравнения для сумм в отсеков (А)

#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 из приведенного выше simeventdfi. Однако мне нужна помощь в том, как применять решатель дифференциальных уравнений для каждого идентификатора объекта, используя ddply. На данный момент я подмножу 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: Выполнить дифференциальное уравнение решатель и получить результаты в dataframe

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

Она работает нормально с одного предмета только. Мне нужна помощь в том, как применять решатель дифференциального уравнения на шаге 5 для каждого объекта в simeventdfi.

ответ

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), ] 
} 

Во-вторых: применить функцию на каждом ID в simeventdfi с использованием ddply

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

Легко!

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 
+0

Ошибка в checkFunc (Func2, times, y, rho): Число производных, возвращаемых функцией func() (7), должно равняться длине вектора начальных условий (11) 'Существует проблема при установке начальных значений.Я думаю, что начальные значения (часть шага 4) должны быть закодированы для установки отдельно для каждого объекта. Я хотел «ddply», потому что я хочу сравнить скорость runnung deSolve с другой работой, которую я использовал, используя 'ddply' @shadow – Amer

Смежные вопросы