[R] Efficient way to update a survival model

Berry, Charles ccberry @end|ng |rom uc@d@edu
Sat Aug 31 19:21:26 CEST 2019


The i^th model is included in the Cox[[ i ]] object.

You can extract the formula objects with:

frms <- lapply(Cox, formula)

then if you want the existing and incremental terms:

indeps <- lapply(frms, function(x) as.list( x[[ 3 ]] ))

oldTerms <- lapply(indeps, "[[", 2)

newTerms <- lapply(indeps, "[[", 3)

> oldTerms[3:4]
[[1]]
v + cos(1 * v) + cos(2 * v)

[[2]]
v + cos(1 * v) + cos(2 * v) + cos(3 * v)

> newTerms[ 3:4 ]
[[1]]
cos(3 * v)

[[2]]
cos(4 * v)

> 

HTH,

Chuck

> On Aug 30, 2019, at 3:36 PM, Frank S. <f_j_rod using hotmail.com> wrote:
> 
> Chris, thank you for your elegant solution!
> 
> Just one minor question:
> I wonder how to include within the loop of your solution the 10 models, that is, writing
> for (k in 1:10) so that you can get {Cox[[1]], ..., Cox[[10]]}. However, I'm aware that some
> change has to be done due to the fact that, when computing Cox[[1]], the term Cox[[k -1]]
> does not exist. Is it possible to perform some "trick" (e.g. re-indexing) in order to achieve this?
> 
> Best,
> 
> Frank
> ________________________________
> De: Andrews, Chris <chrisaa using med.umich.edu>
> Enviado: viernes, 30 de agosto de 2019 15:08
> Para: Frank S. <f_j_rod using hotmail.com>; Vito Michele Rosario Muggeo <vito.muggeo using unipa.it>
> Cc: r-help using r-project.org <r-help using r-project.org>
> Asunto: RE: [R] Efficient way to update a survival model
> 
> The updated formula needs to have a different term rather than cos(k * v) every time.  Here is one way to explicitly change the formula.
> 
> library("survival")
> set.seed(1)
> v <- runif(nrow(pbc), min = 0, max = 2)
> Cox0 <- coxph(Surv(pbc$time,pbc$status == 2) ~ v, data =  pbc)
> 
> Cox <- vector("list", 10)
> Cox[[1]] <- update(Cox0, . ~ . + cos(1 * v))
> for (k in 2:10) {
>        form <- as.formula(sprintf(". ~ . + cos(%d * v)", k))
>        Cox[[k]] <- update(Cox[[k-1]], form)
> }
> 
> Cox
> 
> -----Original Message-----
> From: Frank S. [mailto:f_j_rod using hotmail.com]
> Sent: Friday, August 30, 2019 5:54 AM
> To: Vito Michele Rosario Muggeo
> Cc: r-help using r-project.org
> Subject: Re: [R] Efficient way to update a survival model
> 
> Hi everyone,
> 
> Vito, perhaps my previous mail was not clear.  It is true that I used a loop, but the key point is that such a loop
> cannot compute the desired result. For example, for k = 3 the following loop
> 
> Cox <- list()
> Cox[[1]] <- coxph(Surv(time,status == 2) ~ v + cos(v), data =  pbc)
> for (k in 2:10) {
>  Cox[[k]] <- update(Cox[[k-1]], . ~ . + cos(k * v), data =  pbc)
> }
> 
> leads to a model Cox[[3]] which accounts for terms {v, cos(v), cos(3*v)}, but does not include the term cos(2*v).
> I think that this could be one way to solve my question:
> 
> library("survival")
> set.seed(1)
> v <- runif(nrow(pbc), min = 0, max = 2)
> Cox0 <- coxph(Surv(pbc$time,pbc$status == 2) ~ v, data =  pbc)
> k.max <- 9
> Z <- outer(v, 1:k.max, function (x, y) {sin(x * y)})  # Matrix with the outer product of the two arrays
> 
> Cox <- list()
> for (k in 1:k.max){
> Cox[[k]] <-
>   update(Cox0, substitute(. ~ . + Z[, 1:k]), data =  pbc)
>   attr(Cox[[k]]$coefficients, "names")[2:(k+1)] <- paste0("sin(", 1:k, "* v)")
> }
> Cox
> 
> Best,
> 
> Frank
> 
> _____



More information about the R-help mailing list