[R] ordinary polynomial coefficients from orthogonal polynomials?
Prof Brian Ripley
ripley at stats.ox.ac.uk
Tue Jun 14 16:28:43 CEST 2005
On Tue, 14 Jun 2005, Frank E Harrell Jr wrote:
> Prof Brian Ripley wrote:
>> On Tue, 14 Jun 2005, James Salsman wrote:
>>
>>
>>> How can ordinary polynomial coefficients be calculated
>>> from an orthogonal polynomial fit?
>>
>>
>> Why would you want to do that? predict() is perfectly happy with an
>> orthogonal polynomial fit and the `ordinary polynomial coefficients' are
>> rather badly determined in your example since the design matrix has a very
>> high condition number.
>
> Brian - I don't fully see the relevance of the high condition number nowadays
> unless the predictor has a really bad origin. Orthogonal polynomials are a
> mess for most people to deal with.
It means that if you write down the coeffs to a few places and then try to
reproduce the predictions you will do badly. The perturbation analysis
depends on the condition number, and so is saying that the predictions are
dependent on fine details of the coefficients.
Using (year-2000)/1000 or (year - 1970)/1000 would be a much better idea.
Why do `people' need `to deal with' these, anyway. We have machines to do
that.
>
> Frank
>
>>
>>
>>> I'm trying to do something like find a,b,c,d from
>>> lm(billions ~ a+b*decade+c*decade^2+d*decade^3)
>>> but that gives: "Error in eval(expr, envir, enclos) :
>>> Object "a" not found"
>>
>>
>> You could use
>>
>> lm(billions ~ decade + I(decade^2) + I(decade^3))
>>
>> except that will be numerically inaccurate, since
>>
>>
>>> m <- model.matrix(~ decade + I(decade^2) + I(decade^3))
>>> kappa(m)
>>
>> [1] 3.506454e+16
>>
>>
>>
>>
>>>> decade <- c(1950, 1960, 1970, 1980, 1990)
>>>> billions <- c(3.5, 5, 7.5, 13, 40)
>>>> # source: http://www.ipcc.ch/present/graphics/2001syr/large/08.17.jpg
>>>>
>>>> pm <- lm(billions ~ poly(decade, 3))
>>>>
>>>> plot(decade, billions, xlim=c(1950,2050), ylim=c(0,1000),
>>>
>>> main="average yearly inflation-adjusted dollar cost of extreme weather
>>> events worldwide")
>>>
>>>> curve(predict(pm, data.frame(decade=x)), add=TRUE)
>>>> # output: http://www.bovik.org/storms.gif
>>>>
>>>> summary(pm)
>>>
>>> Call:
>>> lm(formula = billions ~ poly(decade, 3))
>>>
>>> Residuals:
>>> 1 2 3 4 5
>>> 0.2357 -0.9429 1.4143 -0.9429 0.2357
>>>
>>> Coefficients:
>>> Estimate Std. Error t value Pr(>|t|)
>>> (Intercept) 13.800 0.882 15.647 0.0406 *
>>> poly(decade, 3)1 25.614 1.972 12.988 0.0489 *
>>> poly(decade, 3)2 14.432 1.972 7.318 0.0865 .
>>> poly(decade, 3)3 6.483 1.972 3.287 0.1880
>>> ---
>>> Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1
>>>
>>> Residual standard error: 1.972 on 1 degrees of freedom
>>> Multiple R-Squared: 0.9957, Adjusted R-squared: 0.9829
>>> F-statistic: 77.68 on 3 and 1 DF, p-value: 0.08317
>>>
>>>
>>>> pm
>>>
>>> Call:
>>> lm(formula = billions ~ poly(decade, 3))
>>>
>>> Coefficients:
>>> (Intercept) poly(decade, 3)1 poly(decade, 3)2 poly(decade, 3)3
>>> 13.800 25.614 14.432 6.483
>>>
>>> ______________________________________________
>>> R-help at stat.math.ethz.ch mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide!
>>> http://www.R-project.org/posting-guide.html
>>>
>>
>>
>
>
> --
> Frank E Harrell Jr Professor and Chair School of Medicine
> Department of Biostatistics Vanderbilt University
>
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-help
mailing list