La mia risposta dettagliata è di seguito, ma la risposta generale (cioè reale) a questo tipo di domanda è: 1) sperimentare, rovinare, guardare i dati, non si può rompere il computer indipendentemente da ciò che si fa, quindi. . . sperimentare; o 2) RTFM .
Ecco del R
codice che replica più o meno il problema identificato in questa domanda:
# 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))
Il primo lm
restituisce la risposta prevista:
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
Il secondo lm
restituisce qualcosa di strano:
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
Poiché lm
è lo stesso nelle due chiamate, devono essere gli argomenti di lm
cui sono diversi. Quindi, diamo un'occhiata agli argomenti. Ovviamente y
è lo stesso. Sono le altre parti. Diamo un'occhiata alle prime osservazioni sulle variabili di destra nella prima chiamata di lm
. Il ritorno di head(cbind(x,x^2))
assomiglia a:
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
Questo è come previsto. La prima colonna è x
e la seconda colonna è x^2
. Che ne dici della seconda chiamata di lm
, quella con poli? Il ritorno di head(poly(x,2))
assomiglia a:
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, è davvero diverso. La prima colonna non lo è x
e la seconda colonna no x^2
. Quindi, qualunque cosa poly(x,2)
faccia, non ritorna x
e x^2
. Se vogliamo sapere cosa poly
fa, potremmo iniziare leggendo il suo file di aiuto. Quindi diciamo help(poly)
. La descrizione dice:
Restituisce o valuta i polinomi ortogonali di grado 1 in gradi rispetto all'insieme di punti specificato x. Questi sono tutti ortogonali al polinomio costante di grado 0. In alternativa, valutare i polinomi grezzi.
Ora, o sai cosa sono i "polinomi ortogonali" o no. Se non lo fai, usa Wikipedia o Bing (non Google, ovviamente, perché Google è malvagio, non tanto cattivo quanto Apple, naturalmente, ma comunque cattivo). Oppure potresti decidere che non ti importa cosa siano i polinomi ortogonali. Potresti notare la frase "polinomi grezzi" e potresti notare un po 'più in basso nel file della guida che poly
ha un'opzione raw
che, per impostazione predefinita, è uguale a FALSE
. Queste due considerazioni potrebbero ispirarti a provare head(poly(x, 2, raw=TRUE))
quale restituisce:
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
Eccitato da questa scoperta (sembra giusto, ora sì?), Potresti continuare a provare summary(lm(y ~ poly(x, 2, raw=TRUE)))
Questo ritorna:
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
Esistono almeno due livelli per la risposta sopra. Innanzitutto, ho risposto alla tua domanda. In secondo luogo, e molto più importante, ho illustrato come dovresti rispondere tu stesso a domande come questa. Ogni singola persona che "sa programmare" ha attraversato una sequenza come quella sopra sessanta milioni di volte. Anche le persone che sono depresse nella programmazione come me sono continuamente in questa sequenza. È normale che il codice non funzioni. È normale fraintendere le funzioni. Il modo per gestirlo è fare un giro, sperimentare, guardare i dati e RTFM. Esci dalla modalità "insensatamente seguendo una ricetta" e nella modalità "detective".