[Rd] [R] difference in using with() and the "data" argument in glm (PR#9338)
murdoch at stats.uwo.ca
murdoch at stats.uwo.ca
Fri Nov 3 15:12:29 CET 2006
I've redirected this reply from r-help to the bugs list.
On 11/3/2006 8:25 AM, vito muggeo wrote:
> Dear all,
> I am dealing with the following (apparently simple problem):
> For some reasons I am interested in passing variables from a dataframe
> to a specific environment, and in fitting a standard glm:
>
> dati<-data.frame(y=rnorm(10),x1=runif(10),x2=runif(10))
> KK<-new.env()
> for(i in 1:ncol(dati)) assign(names(dati[i]),dati[[i]],envir=KK)
> #Now the following two lines work correctly:
> coef(glm(y~x1+x2,data=KK))
> with(KK,coef(glm(y~x1+x2)))
>
> #However if I write the above code inside a function, with() does not
> appear to work..
>
> ff<-function(Formula,Data,method=1){
> KK<-new.env()
> for(i in 1:ncol(Data)) assign(names(Data[i]),Data[[i]],envir=KK)
> o<-if(method==1) glm(Formula,data=KK) else with(KK,glm(Formula))
> o}
>
> > ff(y~x1+x2,dati,1) #it works
> Call: glm(formula = Formula, data = KK)
> ..[SNIP]..
> > ff(y~x1+x2,dati,2) #it does not
> Error in eval(expr, envir, enclos) : object "y" not found
> >
>
> Could anyone to explain such difference? I believed that
> "with(data,glm(formula))" and "glm(formula,data)" were equivalent.
I think this is a bug in terms.formula. Near the end it has
environment(terms) <- environment(x)
where x is the formula. Since "y" isn't defined in that environment, it
fails. It would work for you with
environment(terms) <- data
but see below.
A workaround that should work for you is to put
environment(Formula) <- KK
before the call to glm.
I'm not going to make the patch I suggest above, because I don't think
it's consistent with the expected behaviour of glm() in the case where
some of the terms in the formula are supposed to come from
environment(x), and some from "data".
I don't know how to handle that case properly: I think it requires a
different search strategy than R employs (but I might be wrong). This
isn't a problem with the workaround I suggested to you, because there
the parent of KK is environment(x), but that wouldn't be true in general.
Duncan Murdoch
More information about the R-devel
mailing list