Ma réponse détaillée est ci-dessous, mais la réponse générale (c'est-à-dire réelle) à ce type de question est la suivante: 1) expérimentez, vissez, regardez les données, vous ne pouvez pas casser l'ordinateur, peu importe ce que vous faites, donc. . . expérience; ou 2) RTFM .
Voici un R
code qui reproduit plus ou moins le problème identifié dans cette question:
# This program written in response to a Cross Validated question
# http://stats.stackexchange.com/questions/95939/
#
# It is an exploration of why the result from lm(y_x+I(x^2))
# looks so different from the result from lm(y~poly(x,2))
library(ggplot2)
epsilon <- 0.25*rnorm(100)
x <- seq(from=1, to=5, length.out=100)
y <- 4 - 0.6*x + 0.1*x^2 + epsilon
# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2
ggplot(data=NULL,aes(x, y)) + geom_point() +
geom_smooth(method = "lm", formula = y ~ poly(x, 2))
summary(lm(y~x+I(x^2))) # Looks right
summary(lm(y ~ poly(x, 2))) # Looks like garbage
# What happened?
# What do x and x^2 look like:
head(cbind(x,x^2))
#What does poly(x,2) look like:
head(poly(x,2))
Le premier lm
retourne la réponse attendue:
Call:
lm(formula = y ~ x + I(x^2))
Residuals:
Min 1Q Median 3Q Max
-0.53815 -0.13465 -0.01262 0.15369 0.61645
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.92734 0.15376 25.542 < 2e-16 ***
x -0.53929 0.11221 -4.806 5.62e-06 ***
I(x^2) 0.09029 0.01843 4.900 3.84e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared: 0.1985, Adjusted R-squared: 0.182
F-statistic: 12.01 on 2 and 97 DF, p-value: 2.181e-05
La seconde lm
retourne quelque chose d'étrange:
Call:
lm(formula = y ~ poly(x, 2))
Residuals:
Min 1Q Median 3Q Max
-0.53815 -0.13465 -0.01262 0.15369 0.61645
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.24489 0.02241 144.765 < 2e-16 ***
poly(x, 2)1 0.02853 0.22415 0.127 0.899
poly(x, 2)2 1.09835 0.22415 4.900 3.84e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared: 0.1985, Adjusted R-squared: 0.182
F-statistic: 12.01 on 2 and 97 DF, p-value: 2.181e-05
Puisque lm
est le même dans les deux appels, il faut que les arguments lm
soient différents. Alors, regardons les arguments. Evidemment, y
c'est pareil. Ce sont les autres parties. Regardons les premières observations sur les variables de droite lors du premier appel de lm
. Le retour de head(cbind(x,x^2))
ressemble à:
x
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853
C'est comme prévu. La première colonne est x
et la deuxième colonne est x^2
. Que diriez-vous du deuxième appel de lm
, celui avec poly? Le retour de head(poly(x,2))
ressemble à:
1 2
[1,] -0.1714816 0.2169976
[2,] -0.1680173 0.2038462
[3,] -0.1645531 0.1909632
[4,] -0.1610888 0.1783486
[5,] -0.1576245 0.1660025
[6,] -0.1541602 0.1539247
OK, c'est vraiment différent. La première colonne ne l'est pas x
et la deuxième colonne ne l'est pas x^2
. Donc, quoi poly(x,2)
qu’il en soit , il ne revient pas x
et x^2
. Si nous voulons savoir ce qui se poly
passe, nous pourrions commencer par lire son fichier d’aide. Alors on dit help(poly)
. La description dit:
Retourne ou évalue les polynômes orthogonaux de degré 1 à degré sur l'ensemble de points spécifié x. Ceux-ci sont tous orthogonaux au polynôme constant du degré 0. Vous pouvez également évaluer les polynômes bruts.
Maintenant, vous savez ce que sont les "polynômes orthogonaux" ou vous ne le savez pas. Si vous ne le faites pas, utilisez alors Wikipedia ou Bing (pas Google, bien sûr, car Google est diabolique - pas aussi grave qu'Apple, bien sûr, mais toujours aussi mauvais). Ou bien, vous pouvez décider que vous ne vous souciez pas de ce que sont les polynômes orthogonaux. Vous remarquerez peut-être l'expression "polynômes bruts" et vous remarquerez peut-être un peu plus loin dans le fichier d'aide qui poly
a une option raw
qui est, par défaut, égale à FALSE
. Ces deux considérations peuvent vous inciter à choisir les head(poly(x, 2, raw=TRUE))
retours:
1 2
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853
Excité par cette découverte (ça a l'air bien, maintenant, oui?), Vous pouvez continuer d'essayer summary(lm(y ~ poly(x, 2, raw=TRUE)))
Cela revient:
Call:
lm(formula = y ~ poly(x, 2, raw = TRUE))
Residuals:
Min 1Q Median 3Q Max
-0.53815 -0.13465 -0.01262 0.15369 0.61645
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.92734 0.15376 25.542 < 2e-16 ***
poly(x, 2, raw = TRUE)1 -0.53929 0.11221 -4.806 5.62e-06 ***
poly(x, 2, raw = TRUE)2 0.09029 0.01843 4.900 3.84e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared: 0.1985, Adjusted R-squared: 0.182
F-statistic: 12.01 on 2 and 97 DF, p-value: 2.181e-05
La réponse ci-dessus comporte au moins deux niveaux. Tout d'abord, j'ai répondu à votre question. Deuxièmement, et bien plus important encore, j’ai illustré comment vous êtes censé répondre vous-même à de telles questions. Chaque personne qui "sait programmer" a suivi une séquence semblable à celle décrite plus de soixante millions de fois. Même des gens aussi décevants en matière de programmation que moi parcourent cette séquence tout le temps. Il est normal que le code ne fonctionne pas. Il est normal de mal comprendre ce que font les fonctions. La façon de le gérer consiste à faire le tour, à expérimenter, à regarder les données et à RTFM. Sortez du mode "suivre une recette sans réfléchir" et passez en mode "détective".