Избежание циклов в итеративном решении ODE - PullRequest
2 голосов
/ 15 октября 2011

Я подгоняю параметрическую модель к некоторым данным о выживании с зависящими от времени ковариатами.Процедура подбора включает в себя итеративное решение некоторых ODE - по одному ODE на интервал времени для каждого субъекта, но так, чтобы начальное условие для ODE на рассматриваемом интервале было последним значением решения ODE за предыдущий интервал.В этом смысле ODE зависят друг от друга.

Моя проблема сводится к следующему: прямо сейчас я решаю эти ODE итеративно через цикл, так как мне нужно использовать последнее значение предыдущего решенияв качестве отправной точки для следующего.Проблема заключается в том, что этот цикл занимает много времени для больших наборов данных.Есть ли способ, с помощью которого я могу использовать, скажем, vapply или другую векторизованную функцию, чтобы сделать то же самое?

Я искал в архивах, но ничего не решает проблему векторизации операции, которая зависит от предыдущего значения.

Вот пример кода, который непроизводить что-либо статистически значимое само по себе, но иллюстрирует мою проблему:

require(odeSolve)

param <- c(a=1)

df <- function(t, state, param){
   with( as.list(c(state, param)), {dX<-a*X; list(c(dX))} ) 
}

Data.i <- data.frame( lt=seq(0, 5, length=10)[-10],rt=seq(0, 5, length=10)[2:10], X=rnorm(9) )

Result <- vector(length=10)

Result[1] <- Data.i$X[1]
init <- c(X=Data.i$X[1])

for (k in 1:9){
t.seq <- seq(Data.i$lt[k],Data.i$rt[k],length=10)
sol <- as.numeric(ode(y = init, times = t.seq, func = df, parms = param)[10,-1])

Result[k+1] <- log(sol+X[k+1])
init <- c(X=sol)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...