Dlaczego otrzymuję różne prognozy dotyczące ręcznego rozszerzania wielomianu i korzystania z funkcji R `poly`?

10

Dlaczego otrzymuję różne prognozy dotyczące ręcznego rozwijania wielomianu i korzystania z polyfunkcji R.

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)

wprowadź opis zdjęcia tutaj

Moja próba:

  • Wydaje się, że to problem z przechwytywaniem, kiedy dopasowuję model do przechwytywania, tj. Nie -1w modelu formula, dwie linie są takie same. Ale dlaczego bez przecięcia dwie linie są różne?

  • Inną „poprawką” jest użycie rawrozszerzenia wielomianowego zamiast wielomianu ortogonalnego. Jeśli zmienimy kod na fit2 = lm(y~ poly(x,degree=2, raw=T) -1), sprawimy , że 2 linie będą takie same. Ale dlaczego?

Haitao Du
źródło
4
To nie wchodzi w zakres twojego pytania, ale często jesteś bardzo otwarty na komentarze. Podczas czytania twojego kodu, pierwszą rzeczą, którą zauważam, jest to, że używasz =i <-do przypisywania niekonsekwentnie. Naprawdę nie zrobiłbym tego, nie jest to do końca mylące, ale dodaje dużo wizualnego szumu do twojego kodu bez żadnej korzyści. Powinieneś zdecydować się na jeden lub drugi, aby użyć w swoim osobistym kodzie, i po prostu trzymaj się go.
Matthew Drury
dzięki za pomoc w kodowaniu! pytanie naprawione. @MatthewDrury
Haitao Du
3
Losowe obserwacji wskazówka do tworzenia <-mniej kłopotów wpisać: alt+-.
JAD
@JarkoDubbeldam dzięki za wskazówkę dotyczącą kodowania. Uwielbiam skróty klawiszowe
Haitao Du

Odpowiedzi:

12

Jak słusznie zauważasz, oryginalna różnica polega na tym, że w pierwszym przypadku używasz „surowych” wielomianów, podczas gdy w drugim przypadku używasz wielomianów ortogonalnych. Dlatego jeśli późniejsze lmwywołanie zostanie zmienione na: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)uzyskalibyśmy te same wyniki między fiti fit3. Powodem, dla którego uzyskujemy te same wyniki w tym przypadku jest „trywialny”; dopasowujemy dokładnie ten sam model, w który go wyposażyliśmy fit<-lm(y~.-1,data=x_exp), bez niespodzianek.

Można łatwo sprawdzić, czy macierze modeli dwóch modeli są takie same all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE).


Bardziej interesujące jest to, dlaczego otrzymujesz te same wykresy podczas korzystania z przechwytywania. Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że podczas dopasowywania modelu do punktu przecięcia

  • W przypadku fit2po prostu przesuwamy prognozy modelu w pionie; rzeczywisty kształt krzywej jest taki sam.

  • Z drugiej strony, w tym przechwytywanie w przypadku fit wyników w nie tylko inną linię pod względem położenia pionowego, ale ogólnie o zupełnie innym kształcie.

Możemy to łatwo zauważyć, po prostu dodając następujące pasowania do istniejącej działki.

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

wprowadź opis zdjęcia tutaj

OK ... Dlaczego pasowania bez przechwytywania były różne, a pasowania z włączeniem przechwytywania są takie same? Połów jest ponownie w stanie ortogonalności.

W przypadku fit_bzastosowanej matrycy modelowej zawierającej elementy nieortogonalne matryca Gram crossprod( model.matrix(fit_b) )jest daleka od przekątnej; w przypadkufit2_b elementów są ortogonalne ( crossprod( model.matrix(fit2_b) )efektywnie przekątna).

fitfit_b XT.Xfitfit2fit2_b

Ciekawym pytaniem jest, dlaczego fit_bi fit2_bsą takie same; po wszystkich matrycach modelu z wartości nominalnychfit_b i fit2_bnie są one takie same . Tutaj musimy tylko pamiętać o tym i mieć te same informacje. jest po prostu liniową kombinacją, więc zasadniczo ich dopasowania będą takie same. Różnice obserwowane w dopasowanym współczynniku odzwierciedlają liniową rekombinację wartości w celu uzyskania ich prostopadłości. (patrz G. Grothendieck odpowiedź tutaj też na innym przykładzie.)fit_bfit2_bfit2_bfit_bfit_b

usεr11852
źródło
+2,5 dzięki za świetną odpowiedź. Na potrzeby końcowego wykresu nauczyłem się z @kjetilb halvorsen: Jeszcze jednym abstrakcyjnym sposobem opisania tego jest to, że sam model zależy tylko od pewnej podprzestrzeni liniowej, a mianowicie przestrzeni kolumny zdefiniowanej przez macierz projektową. Ale parametry zależą nie tylko od tej podprzestrzeni, ale od podstawy tej podprzestrzeni, podanej przez zastosowane określone zmienne, czyli same kolumny. Na przykład prognozy z modelu będą zależeć tylko od podprzestrzeni liniowej, a nie od wybranej podstawy.
Haitao Du
mam nadzieję, że nie masz nic przeciwko, sformatowałem trochę ..
Haitao Du
@ hxd1011: W ogóle nie ma problemu, dziękuję za poświęcenie czasu na „przeczesanie” go.
usεr11852