[R] problem with expand.model.frame

John Fox jfox at mcmaster.ca
Sat Nov 2 22:27:38 CET 2002


Dear R list members,

To answer the question that I previously posted, the following slightly 
altered definition of expand.model.frame seems to do the trick:

     expand.model.frame <- function (model, extras, envir = 
environment(formula(model)),
         na.expand = FALSE){  # modified version of R base function
         f <- formula(model)
         data <- eval(model$call$data, envir)
         ff <- foo ~ bar + baz
         if (is.call(extras))
             gg <- extras
         else gg <- parse(text = paste("~", paste(extras, collapse = 
"+")))[[1]]
         ff[[2]] <- f[[2]]
         ff[[3]][[2]] <- f[[3]]
         ff[[3]][[3]] <- gg[[2]]
         if (!na.expand) {
             naa <- model$call$na.action
             subset <- model$call$subset
             rval <- if (is.null(data)) eval(call("model.frame", ff, # modified
                 subset = subset, na.action = naa), envir)           #  lines
             else eval(call("model.frame", ff, data = data,          #
                 subset = subset, na.action = naa), envir)           #
             }
         else {
             subset <- model$call$subset
             rval <- eval(call("model.frame", ff, data = data, subset = 
subset,
                 na.action = I), envir)
             oldmf <- model.frame(model)
             keep <- match(rownames(oldmf), rownames(rval))
             rval <- rval[keep, ]
             class(rval) <- "data.frame"
             }
         return(rval)
         }

I'm hesitant to screw with the definition of expand.model.frame (maybe the 
new name space mechanism helps here), so I've made the redefinition local 
to my application, and now everything seems to work.

I'm still interested in people's reactions to the problem.

Thanks,
  John

At 12:11 PM 11/2/2002 -0500, I wrote:
>Dear R list members,
>
>I'm encountering a problem with expand.model.frame(): Suppose that I 
>define the following simple function (meant
>just to illustrate the problem):
>
>     > fun <- function(model){
>     +     expand.model.frame(model, all.vars(formula(model)))
>     +     }
>     >
>
>and I have the following model, created with an explicit data argument:
>
>     > mod
>
>     Call:
>     lm(formula = prestige ~ income + I(education^2), data = Prestige)
>
>     Coefficients:
>     (Intercept)          income  I(education^2)
>         15.129723        0.001262        0.188479
>
>Here fun() works fine, adding education from the data frame Prestige to 
>the model frame:
>
>     > fun(mod)
>                             prestige income I(education^2) education
>     GOV.ADMINISTRATORS            68.8  12351       171.8721     13.11
>     GENERAL.MANAGERS              69.1  25879       150.3076     12.26
>     ACCOUNTANTS                   63.4   9271       163.0729     12.77
>     . . .
>     BOOKBINDERS                   35.2   3617        73.1025      8.55
>
>Now suppose that I have the following model, fit with the data frame 
>Prestige attached to the search path, but no
>explicit data argument:
>
>     > mod.2
>
>     Call: lm(formula = prestige ~ income + I(education^2))
>
>     Coefficients:
>     (Intercept)          income  I(education^2)
>         15.129723        0.001262        0.188479
>
>Calling fun() with this model as an argument produces an error:
>
>     > fun(mod.2)
>     Error in eval(expr, envir, enclos) : Object "prestige" not found
>
>     > traceback()
>     8: eval(expr, envir, enclos)
>     7: eval(predvars, data, env)
>     6: model.frame.default(prestige ~ income + I(education^2) + (prestige +
>         income + education), data = NULL, subset = NULL, na.action = NULL)
>     5: model.frame(prestige ~ income + I(education^2) + (prestige +
>         income + education), data = NULL, subset = NULL, na.action = NULL)
>     4: eval(expr, envir, enclos)
>     3: eval(call("model.frame", ff, data = data, subset = subset, 
> na.action = naa),
>         envir)
>     2: expand.model.frame(model, all.vars(formula(model)))
>     1: fun(mod.2)
>
>
>Yet the environment of the model formula for mod.2 (which is the default 
>environment for expand.model.formula) is
>the global environment, and the variable prestige is accessible (via the 
>attached data frame Prestige) from the
>global environment):
>
>     > environment(formula(mod.2))
>     <environment: R_GlobalEnv>
>
>     > get("prestige", env=.GlobalEnv)
>     [1] 68.8 69.1 63.4 56.8 73.5 77.6 72.6 78.1 73.1 68.8 62.0 60.0 53.8 
> 62.2 74.9
>     [16] 55.1 82.3 58.1 58.3 72.8 84.6 59.6 66.1 87.2 66.7 68.4 64.7 34.9 
> 72.1 69.3
>     [31] 67.5 57.2 57.6 54.1 46.0 41.9 49.4 42.3 47.7 30.9 32.7 38.7 36.1 
> 37.2 38.1
>     [46] 29.4 51.1 35.7 35.6 41.5 40.2 26.5 14.8 23.3 47.3 47.1 51.1 43.5 
> 51.6 29.7
>     [61] 20.2 54.9 25.9 20.8 17.3 20.1 44.1 21.5 35.3 38.9 25.2 34.8 23.2 
> 33.3 28.8
>     [76] 42.5 44.2 35.9 41.8 35.9 43.7 50.8 37.2 28.2 38.1 50.3 27.3 40.9 
> 50.2 51.1
>     [91] 38.9 36.2 29.9 42.9 26.5 66.1 48.9 35.9 25.1 26.1 42.2 35.2
>
>     > search()
>     [1] ".GlobalEnv"     "Prestige"       "package:modreg" "package:car"
>     [5] "package:ctest"  "Autoloads"      "package:base"
>     >
>
>Obviously, I'm not thinking about this properly. My aim is to have fun() 
>work whether or not the model was created
>with an explicit data argument.
>
>I'm using R 1.6.0 under WIndows 2000.
>
>Any help would be appreciated.
>
>Thanks,
>  John

-----------------------------------------------------
John Fox
Department of Sociology
McMaster University
Hamilton, Ontario, Canada L8S 4M4
email: jfox at mcmaster.ca
phone: 905-525-9140x23604
web: www.socsci.mcmaster.ca/jfox
-----------------------------------------------------

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list