Dlaczego otrzymuję różne prognozy dotyczące ręcznego rozwijania wielomianu i korzystania z poly
funkcji 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)
Moja próba:
Wydaje się, że to problem z przechwytywaniem, kiedy dopasowuję model do przechwytywania, tj. Nie
-1
w modeluformula
, dwie linie są takie same. Ale dlaczego bez przecięcia dwie linie są różne?Inną „poprawką” jest użycie
raw
rozszerzenia wielomianowego zamiast wielomianu ortogonalnego. Jeśli zmienimy kod nafit2 = lm(y~ poly(x,degree=2, raw=T) -1)
, sprawimy , że 2 linie będą takie same. Ale dlaczego?
r
regression
polynomial
Haitao Du
źródło
źródło
=
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.<-
mniej kłopotów wpisać:alt+-
.Odpowiedzi:
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ędzyfit
ifit3
. 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śmyfit<-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.
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 Gramcrossprod( 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
fit
fit2
fit2_b
Ciekawym pytaniem jest, dlaczego
fit_b
ifit2_b
są takie same; po wszystkich matrycach modelu z wartości nominalnychfit_b
ifit2_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
źródło