Charles, thank you for your suggestion!

Frank S.
________________________________
De: Berry, Charles <ccbe...@ucsd.edu>
Enviado: s�bado, 31 de agosto de 2019 19:21
Para: Frank S. <f_j_...@hotmail.com>
Cc: Andrews, Chris <chri...@med.umich.edu>; r-help@r-project.org 
<r-help@r-project.org>
Asunto: Re: Efficient way to update a survival model

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_...@hotmail.com> wrote:
>
[[elided Hotmail spam]]
>
> 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 <chri...@med.umich.edu>
> Enviado: viernes, 30 de agosto de 2019 15:08
> Para: Frank S. <f_j_...@hotmail.com>; Vito Michele Rosario Muggeo 
> <vito.mug...@unipa.it>
> Cc: r-help@r-project.org <r-help@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_...@hotmail.com]
> Sent: Friday, August 30, 2019 5:54 AM
> To: Vito Michele Rosario Muggeo
> Cc: r-help@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
>
> _____



        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to