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 lm
wywołanie zostanie zmienione na: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)
uzyskalibyśmy te same wyniki między fit
i 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 fit2
po 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')
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_b
zastosowanej 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).
fit
fit_b
XT.Xfit
fit2
fit2_b
Ciekawym pytaniem jest, dlaczego fit_b
i fit2_b
są takie same; po wszystkich matrycach modelu z wartości nominalnychfit_b
i fit2_b
nie 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_b
fit2_b
fit2_b
fit_b
fit_b
=
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.