From m@echler @ending from @t@t@m@th@ethz@ch  Tue May  1 22:15:36 2018
From: m@echler @ending from @t@t@m@th@ethz@ch (Martin Maechler)
Date: Tue, 1 May 2018 22:15:36 +0200
Subject: [Rd] 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: <23272.51944.116829.707510@stat.math.ethz.ch>

>>>>> Berry, Charles <ccberry at ucsd.edu>
>>>>>     on Tue, 1 May 2018 16:43:18 +0000 writes:

    >> 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]

What version of R is that ?  In current versions it is

    varnames <- vapply(vars, deparse2, " ")[-1L]

and deparse2() is a slightly enhanced version of the above
function, again with  'width.cutoff = 500'

*BUT* if you read  help(deparse)  you will learn that 500 is the
upper bound allowed currently.  (and yes, one could consider
increasing that as it has been unchanged in R since the very
beginning (I have checked R version 0.49 from 1997).

On the other hand, deparse2 (and your older code above) do paste
all the parts together  via  collapse = " "  so I don't see
quite yet ...

Martin


    >> 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
    > ______________________________________________
    > R-devel at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel




[Rd] issue with model.frame()
Martin Maechler