Meine ausführliche Antwort ist unten, aber die allgemeine (dh echte) Antwort auf diese Art von Frage lautet: 1) Experimentieren Sie, schrauben Sie herum, schauen Sie sich die Daten an, Sie können den Computer nicht kaputt machen, egal was Sie tun. . . Experiment; oder 2) RTFM .
Hier ist ein R
Code, der das in dieser Frage identifizierte Problem mehr oder weniger reproduziert:
# 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))
Der erste lm
gibt die erwartete Antwort zurück:
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
Der zweite lm
gibt etwas Seltsames zurück:
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
Da lm
es in beiden Aufrufen dasselbe ist, müssen die Argumente lm
unterschiedlich sein. Schauen wir uns also die Argumente an. Offensichtlich y
ist das auch so. Es sind die anderen Teile. Schauen wir uns die ersten Beobachtungen zu den Variablen auf der rechten Seite im ersten Aufruf von an lm
. Die Rückkehr von head(cbind(x,x^2))
sieht so aus:
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
Das ist wie erwartet. Erste Spalte ist x
und zweite Spalte ist x^2
. Wie wäre es mit dem zweiten Anruf von lm
, dem mit Poly? Die Rückkehr von head(poly(x,2))
sieht so aus:
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, das ist wirklich anders. Die erste Spalte ist nicht x
und die zweite Spalte ist nicht x^2
. Also, was poly(x,2)
auch immer tut, es kommt nicht zurück x
und x^2
. Wenn wir wissen wollen, was poly
passiert, können wir zunächst die Hilfedatei lesen. Also sagen wir help(poly)
. Die Beschreibung lautet:
Gibt orthogonale Polynome vom Grad 1 bis zum Grad über der angegebenen Menge von Punkten x zurück oder wertet sie aus. Diese sind alle orthogonal zum konstanten Polynom vom Grad 0. Alternativ können Sie Rohpolynome auswerten.
Entweder wissen Sie, was "orthogonale Polynome" sind, oder Sie wissen es nicht. Wenn Sie dies nicht tun, verwenden Sie Wikipedia oder Bing (natürlich nicht Google, weil Google böse ist - natürlich nicht so schlecht wie Apple, aber immer noch schlecht). Oder Sie entscheiden, dass es Ihnen egal ist, was orthogonale Polynome sind. Möglicherweise bemerken Sie den Ausdruck "Rohpolynome" und etwas weiter unten in der Hilfedatei poly
eine Option, raw
die standardmäßig gleich ist FALSE
. Diese beiden Überlegungen könnten Sie dazu inspirieren, herauszufinden, head(poly(x, 2, raw=TRUE))
welche Ergebnisse Sie erzielen:
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
Angeregt durch diese Entdeckung (es sieht richtig, jetzt, nicht wahr?), Könnten Sie gehen , um zu versuchen summary(lm(y ~ poly(x, 2, raw=TRUE)))
Das gibt:
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
Es gibt mindestens zwei Ebenen für die obige Antwort. Zuerst habe ich deine Frage beantwortet. Zweitens, und noch viel wichtiger, habe ich Ihnen gezeigt, wie Sie solche Fragen selbst beantworten sollen. Jede einzelne Person, die "weiß, wie man programmiert", hat eine Sequenz wie die über sechzig Millionen Mal durchlaufen. Sogar Leute, die so deprimierend schlecht programmieren wie ich, gehen diese Sequenz die ganze Zeit durch. Es ist normal, dass Code nicht funktioniert. Es ist normal zu missverstehen, was Funktionen tun. Der Umgang damit besteht darin, herumzudrehen, zu experimentieren, die Daten und RTFM zu betrachten. Verlassen Sie den Modus "einem Rezept gedankenlos folgen" und wechseln Sie in den Modus "Detektiv".