Próbuję utworzyć wielomian dopasowania drugiego rzędu do niektórych danych, które mam. Powiedzmy, że knuję to dopasowanie z ggplot()
:
ggplot(data, aes(foo, bar)) + geom_point() +
geom_smooth(method="lm", formula=y~poly(x, 2))
Dostaję:
Tak więc dopasowanie drugiego rzędu działa całkiem dobrze. Obliczam to za pomocą R:
summary(lm(data$bar ~ poly(data$foo, 2)))
I dostaję:
lm(formula = data$bar ~ poly(data$foo, 2))
# ...
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 3.268162 0.008282 394.623 <2e-16 ***
# poly(data$foo, 2)1 -0.122391 0.096225 -1.272 0.206
# poly(data$foo, 2)2 1.575391 0.096225 16.372 <2e-16 ***
# ....
Zakładam, że wzór na moje dopasowanie to:
Ale to po prostu daje mi złe wartości. Na przykład, gdy ma wartość 3, spodziewałbym się, że stanie się czymś w pobliżu 3.15. Jednak wstawiając do powyższej formuły otrzymuję: bar foo
Co daje? Czy niewłaściwie interpretuję współczynniki modelu?
r
regression
interpretation
regression-coefficients
użytkownik13907
źródło
źródło
poly
bez wpisywania?poly
R najpierw? Na górze napis „ Oblicz ortogonalne wielomiany ” dużymi przyjaznymi literami.?poly
zrozumieć składnię. Trzeba przyznać, że mam niewielką wiedzę na temat koncepcji. Nie wiedziałem, że istnieje coś jeszcze (lub tak duża różnica między „normalnymi” wielomianami i ortogonalnymi wielomianami), a przykładami, które widziałem online, wszystkie używanepoly()
do dopasowania, szczególnie zggplot
- więc dlaczego nie miałbym tego użyć i być zdezorientowanym, jeśli wynik był „zły”? Pamiętaj, że nie mam umiejętności matematycznych - po prostu stosuję to, co widzieli inni, i staram się to zrozumieć.Odpowiedzi:
Moja szczegółowa odpowiedź znajduje się poniżej, ale ogólna (tj. Prawdziwa) odpowiedź na tego rodzaju pytanie brzmi: 1) eksperymentuj, przekręć się, spójrz na dane, nie możesz uszkodzić komputera bez względu na to, co robisz, więc. . . eksperyment; lub 2) RTFM .
Oto
R
kod, który mniej więcej odzwierciedla problem zidentyfikowany w tym pytaniu:Pierwszy
lm
zwraca oczekiwaną odpowiedź:Drugi
lm
zwraca coś dziwnego:Ponieważ
lm
jest tak samo w dwóch wywołaniach, muszą to byćlm
różne argumenty . Spójrzmy więc na argumenty. Oczywiściey
jest tak samo. To inne części. Spójrzmy na kilka pierwszych obserwacji zmiennych po prawej stronie w pierwszym wywołaniulm
. Powróthead(cbind(x,x^2))
wygląda następująco:To jest zgodne z oczekiwaniami. Pierwsza kolumna to
x
druga kolumnax^2
. Co powiesz na drugie połączenie zlm
tym z poli? Powróthead(poly(x,2))
wygląda następująco:OK, to naprawdę coś innego. Pierwsza kolumna nie jest
x
, a druga kolumna niex^2
. Cokolwiek więcpoly(x,2)
zrobi, nie powrócix
ix^2
. Jeśli chcemy wiedzieć, copoly
robi, możemy zacząć od przeczytania pliku pomocy. Tak mówimyhelp(poly)
. Opis mówi:Teraz albo wiesz, co to są „wielomiany ortogonalne”, albo nie. Jeśli nie, skorzystaj z Wikipedii lub Binga (oczywiście nie Google, ponieważ Google jest zły - nie tak zły jak Apple, oczywiście, ale nadal zły). Lub możesz zdecydować, że nie obchodzi Cię, jakie są wielomiany ortogonalne. Możesz zauważyć wyrażenie „surowe wielomiany” i możesz zauważyć nieco dalej w pliku pomocy
poly
z opcją,raw
która domyślnie jest równaFALSE
. Te dwa względy mogą zainspirować Cię do wypróbowania,head(poly(x, 2, raw=TRUE))
które zwroty:Podekscytowany tym odkryciem (teraz wygląda na to, prawda?), Możesz spróbować.
summary(lm(y ~ poly(x, 2, raw=TRUE)))
Zwraca:Powyższa odpowiedź ma co najmniej dwa poziomy. Najpierw odpowiedziałem na twoje pytanie. Po drugie i, co ważniejsze, zilustrowałem, w jaki sposób powinieneś sam odpowiadać na takie pytania. Każda osoba, która „umie programować”, przechodziła przez sekwencję taką jak ta ponad sześćdziesiąt milionów razy. Nawet ludzie tak przygnębiająco słabi w programowaniu jak ja cały czas przechodzę przez tę sekwencję. To normalne, że kod nie działa. Nieporozumienie, jakie funkcje pełnią, jest normalne. Sposobem poradzenia sobie z tym jest przekręcenie, eksperymentowanie, przeglądanie danych i RTFM. Wyjdź z trybu „bezmyślnego przestrzegania przepisu” i przejdź do trybu „detektywistycznego”.
źródło
Interesujące podejście do interpretacji regresji wielomianowej opracowali Stimson i in. (1978) . Wymaga przepisania
tak jak
źródło
Jeśli chcesz po prostu popchnąć we właściwym kierunku bez dość osądu:
poly()
tworzy wielomianów ortogonalnych (nie skorelowanych), w przeciwieństwie doI()
, który całkowicie ignoruje korelację między wynikowymi wielomiany. Korelacja pomiędzy predyktorami może być problem w modelach liniowych (patrz tutaj , aby uzyskać więcej informacji na temat dlaczego korelacja może być problematyczne), więc to chyba lepiej (w ogóle), aby używaćpoly()
zamiastI()
. Dlaczego wyniki wyglądają tak inaczej? Cóż, zarównopoly()
iI()
podjąć X i przekształcić go w nowym X (w przypadkuI()
, nowa x jest tylko x ^ 1 lub x ^ 2, w przypadkupoly()
, nowy X są dużo bardziej skomplikowane (jeśli chcesz wiedzieć skąd pochodzą (a prawdopodobnie nie), możesz zacząćtutaj lub wyżej wymieniona strona Wikipedii lub podręcznik). Chodzi o to, że gdy obliczasz (przewidujesz) y na podstawie określonego zestawu wartości x, musisz użyć przekonwertowanych wartości x wytworzonych przez jeden z nich (poly()
lub wI()
zależności od tego, która z nich była w twoim modelu liniowym). Więc:W takim przypadku oba modele zwracają tę samą odpowiedź, co sugeruje, że korelacja między zmiennymi predykcyjnymi nie wpływa na wyniki. Gdyby korelacja była problemem, dwie metody przewidywałyby różne wartości.
źródło
„poly” wykonuje orto-normalizację Grahama-Schmidta na wielomianach 1, x, x ^ 2, ..., x ^ deg Na przykład ta funkcja działa tak samo jak „poli” bez zwracania oczywiście atrybutów „coef”.
Wylądowałem na tym wątku, ponieważ interesowała mnie forma funkcjonalna. Jak zatem wyrazić wynik „poli” jako wyrażenia? Po prostu odwróć procedurę Grahama-Schmidta. Skończy się bałagan!
źródło