Bug 15377 - lm() signals error with formulas containing cbind(lots, of, stuff)
Summary: lm() signals error with formulas containing cbind(lots, of, stuff)
Alias: None
Product: R
Classification: Unclassified
Component: Models (show other bugs)
Version: R 3.0.0
Hardware: All All
: P5 minor
Assignee: R-core
Depends on:
Reported: 2013-07-03 18:40 UTC by ln-sdevnull
Modified: 2013-07-15 11:41 UTC (History)
0 users

See Also:

The patch given in the description. (323 bytes, patch)
2013-07-03 20:02 UTC, ln-sdevnull
Details | Diff
The test case given in the description. (1.17 KB, text/plain)
2013-07-03 20:32 UTC, ln-sdevnull

Note You need to log in before you can comment on or make changes to this bug.
Description ln-sdevnull 2013-07-03 18:40:17 UTC
lm(f) signals an error whenever sapply(attr(terms(f), "variables"), deparse, width.cutoff = 500) creates a line break.

The problem is actually in model.matrix.default(), which looks like this:
function (object, data = environment(object), contrasts.arg = NULL, 
    xlev = NULL, ...) 
    t <- if (missing(data)) 
    else terms(object, data = data)
    if (is.null(attr(data, "terms"))) 
        data <- model.frame(object, data, xlev = xlev)
    else {
        reorder <- match(sapply(attr(t, "variables"), deparse, #problem
            width.cutoff = 500)[-1L], names(data))
        if (any(is.na(reorder))) 
            stop("model frame and formula mismatch in model.matrix()")
        if (!identical(reorder, seq_len(ncol(data)))) 
            data <- data[, reorder, drop = FALSE]
It seems that deparse() and names() handle line breaks differently, with the output differing by a paste(, collapse = " ").

This is relevant because aov.car builds a linear model with a left hand side containing cbind(lots, of, stuff), and a sufficiently large such model will fail regardless of whether there is enough data to back it up.

Steps to reproduce:
The bug can be triggered by renaming variables to have longer names:

> x <- 1:10
> y <- x + rnorm(10)
> z <- y + rnorm(10)
> lm(cbind(y, z) ~ x) #works fine

lm(formula = cbind(y, z) ~ x)

             y       z     
(Intercept)  0.6445  1.2890
x            0.9870  0.8151

> yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy <- y #493 'y's is minimal for this particular example
> lm(cbind(yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy, z) ~ x)
Error in model.matrix.default(mt, mf, contrasts) : 
  model frame and formula mismatch in model.matrix()

Possible fix:
        reorder <- match(sapply(attr(t, "variables"), deparse, 
            width.cutoff = 500)[-1L], names(data))
        reorder <- match(sapply(attr(t, "variables"), 
            function(s) paste(deparse(s, width.cutoff = 500), 
            collapse = " "))[-1L], names(data))
in model.matrix.default() should fix this particular issue, but without looking at the internals of names() I don't know whether there are other, similar issues that this won't fix, or whether this fix will break something that currently works.
Comment 1 ln-sdevnull 2013-07-03 20:02:24 UTC
Created attachment 1461 [details]
The patch given in the description.
Comment 2 ln-sdevnull 2013-07-03 20:32:56 UTC
Created attachment 1462 [details]
The test case given in the description.