Anpassen des Polynommodells an Daten in R.


83

Ich habe die Antworten auf diese Frage gelesen und sie sind sehr hilfreich, aber ich brauche Hilfe, insbesondere in R.

Ich habe einen Beispieldatensatz in R wie folgt:

x <- c(32,64,96,118,126,144,152.5,158)  
y <- c(99.5,104.8,108.5,100,86,64,35.3,15)

Ich möchte ein Modell an diese Daten anpassen, damit y = f(x). Ich möchte, dass es ein Polynommodell 3. Ordnung ist.

Wie kann ich das in R machen?

Kann R mir außerdem helfen, das am besten passende Modell zu finden?

Antworten:


96

Um ein Polynom dritter Ordnung in x (x ^ 3) zu erhalten, können Sie dies tun

lm(y ~ x + I(x^2) + I(x^3))

oder

lm(y ~ poly(x, 3, raw=TRUE))

Sie könnten ein Polynom 10. Ordnung anpassen und eine nahezu perfekte Anpassung erhalten, aber sollten Sie?

BEARBEITEN: Poly (x, 3) ist wahrscheinlich die bessere Wahl (siehe @hadley unten).


6
ist genau richtig in der Frage "sollten Sie". Die Beispieldaten haben nur 8 Punkte. Die Freiheitsgrade sind hier ziemlich niedrig. Die realen Daten können natürlich viel mehr enthalten.
JD Long

1
Danke für deine Antwort. Wie wäre es, wenn R das am besten passende Modell findet? Gibt es dafür Funktionen?
Mehper C. Palavuzlar

4
Dies hängt von Ihrer Definition des "besten Modells" ab. Das Modell, das Ihnen das größte R ^ 2 liefert (was ein Polynom 10. Ordnung wäre), ist nicht unbedingt das "beste" Modell. Die Begriffe in Ihrem Modell müssen angemessen ausgewählt werden. Sie können mit vielen Parametern eine nahezu perfekte Anpassung erzielen, aber das Modell hat keine Vorhersagekraft und ist für nichts anderes als das Zeichnen einer Best-Fit-Linie durch die Punkte nutzlos.
Greg

9
Warum benutzt du raw = T? Es ist besser, nicht korrelierte Variablen zu verwenden.
Hadley

2
Ich habe es getan, um die gleichen Ergebnisse zu erzielen wie lm(y ~ x + I(x^2) + I(x^3)). Vielleicht nicht optimal, nur zwei Mittel zum gleichen Zweck geben.
Greg

45

Welches Modell das "am besten passende Modell" ist, hängt davon ab, was Sie unter "am besten" verstehen. R hat Tools, die Ihnen helfen können, aber Sie müssen die Definition für "am besten" angeben, um zwischen ihnen wählen zu können. Betrachten Sie die folgenden Beispieldaten und den folgenden Code:

x <- 1:10
y <- x + c(-0.5,0.5)

plot(x,y, xlim=c(0,11), ylim=c(-1,12))

fit1 <- lm( y~offset(x) -1 )
fit2 <- lm( y~x )
fit3 <- lm( y~poly(x,3) )
fit4 <- lm( y~poly(x,9) )
library(splines)
fit5 <- lm( y~ns(x, 3) )
fit6 <- lm( y~ns(x, 9) )

fit7 <- lm( y ~ x + cos(x*pi) )

xx <- seq(0,11, length.out=250)
lines(xx, predict(fit1, data.frame(x=xx)), col='blue')
lines(xx, predict(fit2, data.frame(x=xx)), col='green')
lines(xx, predict(fit3, data.frame(x=xx)), col='red')
lines(xx, predict(fit4, data.frame(x=xx)), col='purple')
lines(xx, predict(fit5, data.frame(x=xx)), col='orange')
lines(xx, predict(fit6, data.frame(x=xx)), col='grey')
lines(xx, predict(fit7, data.frame(x=xx)), col='black')

Welches dieser Modelle ist das beste? Für jeden von ihnen könnten Argumente vorgebracht werden (aber ich würde den lila nicht für die Interpolation verwenden wollen).


15

In Bezug auf die Frage 'Kann R mir helfen, das am besten passende Modell zu finden' gibt es wahrscheinlich eine Funktion, um dies zu tun, vorausgesetzt, Sie können die Menge der zu testenden Modelle angeben, aber dies wäre ein guter erster Ansatz für die Menge von n-1 Gradpolynome:

polyfit <- function(i) x <- AIC(lm(y~poly(x,i)))
as.integer(optimize(polyfit,interval = c(1,length(x)-1))$minimum)

Anmerkungen

  • Die Gültigkeit dieses Ansatzes auf Ihrer Ziele abhängen, die Annahmen optimize()und , AIC()und wenn AIC ist das Kriterium , dass Sie verwenden möchten,

  • polyfit()darf kein einziges Minimum haben. Überprüfen Sie dies mit etwas wie:

    for (i in 2:length(x)-1) print(polyfit(i))
  • Ich habe die as.integer()Funktion verwendet, weil mir nicht klar ist, wie ich ein nicht ganzzahliges Polynom interpretieren würde.

  • Betrachten Sie zum Testen eines beliebigen Satzes mathematischer Gleichungen das von Andrew Gelman hier besprochene 'Eureqa'- Programm

Aktualisieren

Siehe auch die stepAICFunktion (im MASS-Paket) zur Automatisierung der Modellauswahl.


Wie kann ich Eurequa mit R verbinden?
Adam.888

@ adam.888 tolle Frage - Ich kenne die Antwort nicht, aber du könntest sie separat posten. Dieser letzte Punkt war ein kleiner Exkurs.
David LeBauer

Hinweis: AIC ist das Akaike-Informationskriterium , das eine enge Anpassung belohnt und eine größere Anzahl von Parametern eines Modells auf eine Weise bestraft, die sich in verschiedener Hinsicht als optimal erwiesen hat. en.wikipedia.org/wiki/Akaike_information_criterion
Evgeni Sergeev

5

Der einfachste Weg, die beste Anpassung in R zu finden, besteht darin, das Modell wie folgt zu codieren:

lm.1 <- lm(y ~ x + I(x^2) + I(x^3) + I(x^4) + ...)

Nach Verwendung der Step-Down-AIC-Regression

lm.s <- step(lm.1)

5
Die Verwendung von I(x^2)usw. ergibt keine angemessen orthogonalen Polynome zum Anpassen.
Brian Diggs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.