[R] Use of expand.model.frame()

Gabor Grothendieck ggrothendieck at myway.com
Sat Jan 1 16:26:24 CET 2005


John Fox <jfox <at> mcmaster.ca> writes:

: 
: Dear list members,
: 
: I've encountered a problem using expand.model.frame() with a model specified
: without an explicit data argument. To illustrate (R 2.0.1 under Windows XP):
: 
:     > x <- rnorm(10)
:     > y <- x + rnorm(10)
:     > mod <- lm(y ~ x)
:     > z <- 1:10
:     > expand.model.frame(mod, "z")
:     Error in eval(expr, envir, enclos) : Object "y" not found
:     > environment(formula(mod))
:     <environment: R_GlobalEnv>
:     >
: 
: But when data is specified in the call to lm(), I get the expected
: behaviour:
: 
:     > DF <- data.frame(x, y, z)
:     > remove(x, y, z)
:     > mod <- lm(y ~ x, data=DF)
:     > expand.model.frame(mod, "z")
:                 y          x  z
:     1   1.0321783 -0.8145171  1
:     2  -1.7639244 -0.5965655  2
:     3  -0.8150426 -1.4833768  3
:     4   0.6047758  0.2030853  4
:     5  -1.9870830 -1.5559511  5
:     6  -0.4807146 -1.0751953  6
:     7   1.3683736  0.1610050  7
:     8   0.9323799  0.3537983  8
:     9  -1.0797075 -0.4218457  9
:     10 -3.0528776 -1.9750668 10
:     > environment(formula(mod))
:     <environment: R_GlobalEnv>
: 
: >From ?expand.model.frame:
: 
:     "Usage
:     expand.model.frame(model, extras,
:                        envir = environment(formula(model)),
:                        na.expand = FALSE)
: 
:     Arguments
:     model a fitted model
:     extras one-sided formula or vector of character strings describing new
: variables to be added
:     envir an environment to evaluate things in
:     na.expand logical; see below"
: 
: So, if "things" are evaluated by default in environment(formula(model)), why
: does the first example fail and the second one work? Obviously, I'm not
: understanding something properly here.
: 
: Any help would be appreciated -- either to get expand.model.frame() to work
: or to suggest an alternative approach.
: 
: Happy new year to all.
: 
: John

Look at the source of expand.model.frame.

The second line of expand.model.frame uses the data component of mod$call
and if its not there expand.model.frame chokes.  As a workaround check
if its missing and supply it yourself:

if (is.null(mod$call$data)) mod$call$data <- environment(formula(mod))
expand.model.frame(mod, "z")

expand.model.frame should probably be doing that itself.




More information about the R-help mailing list