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 Rcode 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 lmretourne 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 lmretourne 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 lmest le même dans les deux appels, il faut que les arguments lmsoient différents. Alors, regardons les arguments. Evidemment, yc'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 xet 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 xet la deuxième colonne ne l'est pas x^2. Donc, quoi poly(x,2)qu’il en soit , il ne revient pas xet x^2. Si nous voulons savoir ce qui se polypasse, 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 polya une option rawqui 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".