From therne@u @ending from m@yo@edu  Tue May  1 19:55:27 2018
From: therne@u @ending from m@yo@edu (Therneau, Terry M., Ph.D.)
Date: Tue, 01 May 2018 12:55:27 -0500
Subject: [Rd] [EXTERNAL] Re: issue with model.frame()
In-Reply-To: <EF41437C-933A-44C7-86C0-992953B39E9E@ucsd.edu>
References: <bb6fa2$9b935h@ironport10.mayo.edu>
 <EF41437C-933A-44C7-86C0-992953B39E9E@ucsd.edu>
Message-ID: <bb6fa2$9bcetc@ironport10.mayo.edu>

Great catch.  I'm very reluctant to use my own model.frame, since that locks me into 
tracking all the base R changes, potentially breaking survival in a bad way if I miss one.

But, this shows me clearly what the issue is and will allow me to think about it.

Another solution for the user is to use multiple ridge() calls to break it up; since 
he/she was using a fixed tuning parameter the result is the same.

Terry T.


On 05/01/2018 11:43 AM, Berry, Charles wrote:
> 
> 
>> On May 1, 2018, at 6:11 AM, Therneau, Terry M., Ph.D. via R-devel <r-devel at r-project.org> wrote:
>>
>> A user sent me an example where coxph fails, and the root of the failure is a case where names(mf) is not equal to the term.labels attribute of the formula -- the latter has an extraneous newline. Here is an example that does not use the survival library.
>>
>> # first create a data set with many long names
>> n <- 30  # number of rows for the dummy data set
>> vname <- vector("character", 26)
>> for (i in 1:26) vname[i] <- paste(rep(letters[1:i],2), collapse='')  # long variable names
>>
>> tdata <- data.frame(y=1:n, matrix(runif(n*26), nrow=n))
>> names(tdata) <- c('y', vname)
>>
>> # Use it in a formula
>> myform <- paste("y ~ cbind(", paste(vname, collapse=", "), ")")
>> mf <- model.frame(formula(myform), data=tdata)
>>
>> match(attr(terms(mf), "term.labels"), names(mf))   # gives NA
>>
>> ----
>>
>> In the user's case the function is ridge(x1, x2, ....) rather than cbind, but the effect is the same.
>> Any ideas for a work around?
> 
> Maybe add a `yourclass' class to mf and dispatch to a model.frame.yourclass method where the width cutoff arg here (around lines 57-58 of model.frame.default) is made larger:
> 
> varnames <- sapply(vars, function(x) paste(deparse(x, width.cutoff = 500),
>          collapse = " "))[-1L]
> 
> ??
> 
>>
>> Aside: the ridge() function is very simple, it was added as an example to show how a user can add their own penalization to coxph.  I never expected serious use of it.  For this particular user the best answer is to use glmnet instead.   He/she is trying to apply an L2 penalty to a large number of SNP * covariate interactions.
>>
>> Terry T.
>>
> 
> 
> HTH,
> 
> Chuck
>




[Rd] [EXTERNAL] Re: issue with model.frame()
Therneau, Terry M., Ph.D.