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

Martin Maechler
Fri, 15 Aug 1997 13:07:07 -0000

>>>>> "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,
i.e.,
	ftp://ftp.stat.math.ethz.ch/Mail-archives/r-help-97-04-28--97-05-09

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))
		   =========