2010-09-29 58 views
67

Czytałem odpowiedź na to question i są bardzo pomocne, ale trzeba pomóc szczególnie w R.Mocowanie wielomian modelu do danych w R

Mam przykład zbiór danych w R następująco:

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) 

Chcę dopasować model do tych danych, aby y = f(x). Chcę, żeby był to model wielomianowy 3. rzędu.

Jak mogę to zrobić w R?

Dodatkowo, czy R pomoże mi znaleźć najlepszy model dopasowania?

Odpowiedz

71

Aby uzyskać Wielomian stopnia trzeciego w x (x^3), można zrobić

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

lub

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

Można dopasować 10. porządku wielomianu i dostać niemal idealne dopasowanie , ale czy powinieneś?

EDYCJA: poly (x, 3) jest prawdopodobnie lepszym wyborem (patrz @Hadley poniżej).

+6

jest na miejscu w pytając „należy”. Przykładowe dane mają tylko 8 punktów. Stopnie wolności są tutaj dość niskie. Oczywiście rzeczywiste dane mogą mieć znacznie więcej. –

+1

Dzięki za odpowiedź. A co z otrzymaniem R, aby znaleźć najlepszy model dopasowania? Czy są w tym jakieś funkcje? –

+4

To zależy od twojej definicji "najlepszego modelu". Model, który daje największy R^2 (który byłby wielomianem rzędu 10) niekoniecznie jest "najlepszym" modelem. Warunki w twoim modelu muszą być rozsądnie wybrane. Możesz uzyskać niemal idealne dopasowanie z wieloma parametrami, ale model nie będzie miał mocy predykcyjnej i będzie bezużyteczny do niczego innego niż rysowanie linii najlepszego dopasowania przez punkty. – Greg

12

Jeśli chodzi o pytanie "Czy R pomogę mi znaleźć najlepszy model dopasowania", prawdopodobnie jest to funkcja, zakładając, że możesz podać zestaw modeli do testowania, ale byłoby to dobre pierwsze podejście do zestawu n-1 wielomianów stopnia:

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

Uwagi

  • słuszność tego podejścia zależy od celów, założenia optimize() i AIC() a jeśli AIC jest kryterium, które chcesz użyć ,

  • polyfit() może nie mieć jednego minimum. sprawdź to z czymś takim:

    for (i in 2:length(x)-1) print(polyfit(i)) 
    
  • użyłem funkcji as.integer() ponieważ nie jest dla mnie jasne, w jaki sposób interpretować wielomian nie jest liczbą całkowitą.

  • do testowania dowolny zestaw równań matematycznych, należy rozważyć program 'Eureqa' przeglądowi przez Andrew Gelman here

Aktualizacja

Zobacz także funkcję stepAIC (w pakiecie masowy) w celu zautomatyzowania wybór modelu.

+0

Jak mogę połączyć Eurequę z R? –

+0

@ adam.888 świetne pytanie - nie znam odpowiedzi, ale możesz zamieścić ją osobno. Ten ostatni punkt stanowił pewną dygresję. –

+0

Uwaga: AIC to _Akaike Information Criterion_, które nagradza ścisłe dopasowanie i karze większą liczbę parametrów modelu, w sposób, który został wykazany jako optymalny w różnych znaczeniach. http://en.wikipedia.org/wiki/Akaike_information_criterion –

37

Który model jest "najlepiej dopasowanym modelem", zależy od tego, co rozumie się przez "najlepszy". R ma narzędzia, które Ci pomogą, ale musisz podać definicję "najlepszego", aby wybrać między nimi. Rozważ następujące dane i kod przykładowy:

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') 

Który z tych modeli jest najlepszy?można argumentować za którąkolwiek z nich (ale ja nie chciałbym użyć purpurowego do interpolacji).

5

Najprostszym sposobem, aby znaleźć najlepsze dopasowanie w R jest kod modelu jako:

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

Po użyciu ustąpić AIC regresji

lm.s <- step(lm.1) 
+2

Użycie 'I (x^2)', itp. nie daje odpowiednio ortogonalnych wielomianów do dopasowania. –