[Rd] issue with model.frame()
Martin Maechler
m@echler @ending from @t@t@m@th@ethz@ch
Tue May 1 22:15:36 CEST 2018
>>>>> 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
More information about the R-devel
mailing list