R-beta: Powers ('x^2') in lm/glm

Martin Maechler maechler at stat.math.ethz.ch
Fri Aug 15 15:07:07 CEST 1997

>>>>> "Matt" == Matthew R Nelson <mrn at superh.hg.med.umich.edu> writes:

    Matt> R users, I was a bit surprised to find that when I attempted to
    Matt> add a polynomial term to a linear model using either lm or glm as
    Matt> could be done in S resulted in a fit without that term included
    Matt> and without warning(!!), e.g.

    >> lm(response ~ x + x^2, data).

    Matt> As far as I can gather, there is no poly() yet in R, and if
    Matt> lm/glm do not allow functions of variables as their formula
    Matt> arguements, is our only option to add variables to our dataframe
    Matt> before using lm/glm?

    >> data2 <- cbind(data,x2=data$x^2)

    Matt> I did search the archive for a discussion of this topic, but did
    Matt> not come up with any discussion on this topic.  Have I missed
    Matt> something?

This is an older topic that has been discussed a bit, however not resolved.

You would have found the answer in the archives,

and then search for 'x^2'.

>From that discussion, my feeling was that it was accepted to a be bug
rather than a feature.....

Unfortunately, it did not make its way into 
either  $RHOME/TASKS  nor the R-FAQ. 
		(I think it should go into BOTH -- yes it IS important).   !!!


The gist is :  You  MUST use  I(x^2)   etc. instead of  'x^2' etc

As Bill Venables had pointed out, the problem really becomes a pain
for anova with several factors,e.g.
	(w + x + y + z)^3
gives something very different in R than in S
[and you would have to replace it by

	(w + x + y + z)^3 +
		 I(w^2) + I(x^2) + I(y^2) + I(z^2) +
		 I(w^3) + I(x^3) + I(y^3) + I(z^3)

 which is quite long, especially when the variables have more than 1-letter
 names ...

As Ross had pointed out, it's really the    terms(.) function which  
either needs fixing or should be replaced by another function for term
extraction of model formulas.

This is R :

> attr(terms(formula(y ~ x + x^2)),"variables")
model.data.frame(y, x)
> attr(terms(formula(y ~ x + I(x^2))),"variables")
model.data.frame(y, x, I(x^2))

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