Warum erhalte ich unterschiedliche Vorhersagen für die manuelle Polynomerweiterung und verwende die R `poly` -Funktion?

10

Warum erhalte ich unterschiedliche Vorhersagen für die manuelle Polynomerweiterung und die Verwendung der R- polyFunktion?

set.seed(0)
x <- rnorm(10)
y <- runif(10)
plot(x,y,ylim=c(-0.5,1.5))
grid()

# xp is a grid variable for ploting
xp <- seq(-3,3,by=0.01)
x_exp <- data.frame(f1=x,f2=x^2)
fit <- lm(y~.-1,data=x_exp)
xp_exp <- data.frame(f1=xp,f2=xp^2)
yp <- predict(fit,xp_exp)
lines(xp,yp)

# using poly function
fit2 <- lm(y~ poly(x,degree=2) -1)
yp <- predict(fit2,data.frame(x=xp))
lines(xp,yp,col=2)

Geben Sie hier die Bildbeschreibung ein

Mein Versuch:

  • Es scheint ein Problem mit dem Abfangen zu sein, wenn ich das Modell mit dem Abfangen anpasse, dh nein -1im Modell formula, die beiden Linien sind gleich. Aber warum sind die beiden Linien ohne den Achsenabschnitt unterschiedlich?

  • Eine andere "Lösung" ist die Verwendung einer rawPolynomexpansion anstelle eines orthogonalen Polynoms. Wenn wir den Code in ändern fit2 = lm(y~ poly(x,degree=2, raw=T) -1), werden 2 Zeilen gleich. Aber wieso?

Haitao Du
quelle
4
Dies ist kein Thema Ihrer Frage, aber Sie sind oft sehr offen für Kommentare. Beim Lesen Ihres Codes fällt mir als Erstes auf, dass Sie =und <-für die Zuordnung inkonsistent verwenden. Ich würde das wirklich nicht tun, es ist nicht gerade verwirrend, aber es fügt Ihrem Code viel visuelles Rauschen hinzu, ohne dass dies von Vorteil ist. Sie sollten sich für das eine oder andere entscheiden, um es in Ihrem persönlichen Code zu verwenden, und sich einfach daran halten.
Matthew Drury
Danke, dass du mir beim Codieren geholfen hast! Frage behoben. @ MatthewDrury
Haitao Du
3
Zufälliger Follow-up-Tipp, um die <-Eingabe zu vereinfachen : alt+-.
JAD
@ JarkoDubbeldam danke für den Codierungstipp. Ich liebe Tastenkombinationen
Haitao Du

Antworten:

12

Wie Sie richtig bemerken, besteht der ursprüngliche Unterschied darin, dass Sie im ersten Fall die "rohen" Polynome verwenden, während Sie im zweiten Fall die orthogonalen Polynome verwenden. Wenn also der spätere lmAufruf in geändert fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)würde : würden wir die gleichen Ergebnisse zwischen fitund erhalten fit3. Der Grund, warum wir in diesem Fall die gleichen Ergebnisse erzielen, ist "trivial"; Wir passen genau das gleiche Modell wie wir fit<-lm(y~.-1,data=x_exp), keine Überraschungen.

Man kann leicht überprüfen, ob die Modellmatrizen der beiden Modelle gleich sind all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE.


Interessanter ist, warum Sie bei Verwendung eines Abschnitts dieselben Diagramme erhalten. Das Erste, was Sie bemerken müssen, ist, dass Sie ein Modell mit einem Achsenabschnitt versehen

  • Im Fall von verschieben fit2wir einfach die Modellvorhersagen vertikal; Die tatsächliche Form der Kurve ist dieselbe.

  • Auf der anderen Seite führt das Einschließen eines Abschnitts bei fitErgebnissen nicht nur zu einer anderen Linie in Bezug auf die vertikale Platzierung, sondern insgesamt zu einer ganz anderen Form.

Wir können dies leicht erkennen, indem wir einfach die folgenden Anpassungen an das vorhandene Diagramm anhängen.

fit_b<-lm(y~. ,data=x_exp)
yp=predict(fit_b,xp_exp)
lines(xp,yp, col='green', lwd = 2)

fit2_b<-lm(y~ poly(x,degree=2, raw = FALSE) )
yp=predict(fit2_b,data.frame(x=xp))
lines(xp,yp,col='blue')

Geben Sie hier die Bildbeschreibung ein

OK ... Warum waren die No-Intercept-Anpassungen unterschiedlich, während die Intercept-Inclusive-Anpassungen gleich sind? Der Haken ist wieder unter der Orthogonalitätsbedingung.

Wenn fit_bdie verwendete Modellmatrix nicht orthogonale Elemente enthält, ist die Gram-Matrix crossprod( model.matrix(fit_b) )weit von der Diagonale entfernt. im Fall fit2_bder Elemente sind orthogonal ( crossprod( model.matrix(fit2_b) )ist effektiv diagonal).

Als solches haben fitwir im Fall, wenn wir es erweitern, um einen Achsenabschnitt fit_beinzuschließen, die nicht diagonalen Einträge der Gram-Matrix geändert, und daher ist die resultierende Anpassung im Vergleich insgesamt unterschiedlich (unterschiedliche Krümmung, Achsenabschnitt usw.) mit der Passform von . Im Falle von obwohl , wenn wir es erweitern einen Schnittpunkt zu schließen , wie in wir nur eine Spalte anhängen, die den Spalten bereits orthogonal wir hatten, ist die Rechtwinkligkeit gegen das konstante Polynom vom Grad 0 . Dies führt einfach dazu, dass unsere angepasste Linie durch den Achsenabschnitt vertikal verschoben wird. Aus diesem Grund sind die Darstellungen unterschiedlich.XTXfitfit2fit2_b

Die interessante Nebenfrage ist, warum die fit_bund fit2_bdie gleichen sind; Immerhin sind die Modellmatrizen von fit_bund im Nennwertfit2_b nicht gleich . Hier müssen wir uns letztendlich nur daran erinnern und die gleichen Informationen haben. ist nur eine lineare Kombination der so im Wesentlichen ihre resultierenden Anpassungen werden gleich sein. Die im angepassten Koeffizienten beobachteten Unterschiede spiegeln die lineare Rekombination der Werte von wider , um sie orthogonal zu erhalten. (Siehe auch G. Grothendieck Antwort hier für ein anderes Beispiel.)fit_bfit2_bfit2_bfit_bfit_b

usεr11852
quelle
+2,5 danke für die tolle antwort. Für das endgültige Diagramm habe ich von @kjetilb halvorsen gelernt: Eine abstraktere Art, dies zu beschreiben, besteht darin, dass das Modell selbst nur von einem bestimmten linearen Unterraum abhängt, nämlich dem durch die Entwurfsmatrix definierten Spaltenraum. Die Parameter hängen jedoch nicht nur von diesem Unterraum ab, sondern auch von der Basis für diesen Unterraum, die durch die verwendeten spezifischen Variablen, dh die Spalten selbst, gegeben ist. Vorhersagen aus dem Modell hängen beispielsweise nur vom linearen Unterraum ab, nicht von der gewählten Basis.
Haitao Du
Ich hoffe, es macht Ihnen nichts aus, ich habe ein wenig neu formatiert ..
Haitao Du
@ hxd1011: Überhaupt kein Problem, danke, dass du dir die Zeit genommen hast, es ein bisschen zu "kämmen".
usεr11852