Rozważ następujący kod R:
example <- function(n) {
X <- 1:n
Y <- rep(1,n)
return(lm(Y~X))
}
#(2.13.0, i386-pc-mingw32)
summary(example(7)) #R^2 = .1963
summary(example(62)) #R^2 = .4529
summary(example(4540)) #R^2 = .7832
summary(example(104))) #R^2 = 0
#I did a search for n 6:10000, the result for R^2 is NaN for
#n = 2, 4, 16, 64, 256, 1024, 2085 (not a typo), 4096, 6175 (not a typo), and 8340 (not a typo)
Spojrzenie na http://svn.r-project.org/R/trunk/src/appl/dqrls.f ) nie pomogło mi zrozumieć, co się dzieje, ponieważ nie znam Fortrana. W innym pytaniu odpowiedziano, że błędy tolerancji maszyny zmiennoprzecinkowej są winne za współczynniki dla X, które są bliskie, ale niezupełnie 0.
jest większe, gdy wartość dla coef(example(n))["X"]
jest bliższa 0. Ale ...
- Dlaczego w ogóle istnieje wartość ?
- Co (konkretnie) to determinuje?
- Dlaczego pozornie uporządkowany postęp
NaN
wyników? - Dlaczego naruszenia tego postępu?
- Co z tego jest „oczekiwanym” zachowaniem?
r
regression
russellpierce
źródło
źródło
Y <- rep(1,n)+runif(n)*ynoise
), byłoby to interesujące :-)apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})
. (Moje wyniki na Xeonie Win 7 x64 wynoszą od -8e-17 do + 3e-16; około połowa to prawdziwe zera.) BTW, źródło Fortran nie pomaga: to tylko opakowanie dla dqrdc; to kod, na który chcesz spojrzeć.Odpowiedzi:
Jak mówi Ben Bolker, odpowiedź na to pytanie znajduje się w kodzie dla
summary.lm()
.Oto nagłówek:
A więc spójrzmy
x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)
na ten nieco zmodyfikowany wyciąg:Zauważ, że ans $ r.squared to ...0.4998923
Aby odpowiedzieć na pytanie pytaniem: co z tego czerpiemy? :)
Wierzę, że odpowiedź leży w tym, jak R obsługuje liczby zmiennoprzecinkowe. Myślę, żeR2
mss
irss
są to sumy bardzo małych (kwadratowych) błędów zaokrąglania, stąd przyczyna wynosi około 0,5. Co do progresji, podejrzewam, że ma to związek z liczbą wartości, które trzeba czekać na +/- przybliżenia odwołać się do 0 (zarówno i , jak to prawdopodobne, że źródłem tych wartości). Nie wiem jednak, dlaczego wartości różnią się od progresji.mss
rss
0/0
NaN
2^(1:k)
Aktualizacja 1: Oto fajny wątek z pomocy R, który omawia niektóre powody, dla których ostrzeżenia o niedopełnieniu nie są adresowane w R.
Ponadto w tym SO Q&A znajduje się wiele interesujących postów i przydatnych linków dotyczących niedomiaru, arytmetyki o wyższej precyzji itp.
źródło
Jestem ciekawy twojej motywacji do zadania pytania. Nie mogę wymyślić praktycznego powodu, dla którego takie zachowanie powinno mieć znaczenie; ciekawość intelektualna jest alternatywnym (i IMO o wiele bardziej rozsądnym) powodem. Myślę, że nie musisz rozumieć FORTRAN, aby odpowiedzieć na to pytanie, ale myślę, że musisz wiedzieć o rozkładzie QR i jego zastosowaniu w regresji liniowej. Jeśli traktujesz
dqrls
jak czarną skrzynkę, która oblicza rozkład QR i zwraca różne informacje na jego temat, być może będziesz w stanie prześledzić kroki ... lub po prostu przejdź prostosummary.lm
i prześledzić, aby zobaczyć, jak oblicza się R ^ 2. W szczególności:Następnie musisz wrócić
lm.fit
i zobaczyć, że dopasowane wartości są obliczane jakor1 <- y - z$residuals
(tj. Jako odpowiedź minus reszty). Teraz możesz dowiedzieć się, co determinuje wartość reszt i czy wartość minus jej średnia wynosi dokładnie zero, czy nie, a następnie dowiedzieć się, jakie są wyniki obliczeń ...źródło
mss
irss
„szumu”. Jest to zasada GIGO, która zapewnia, że jest dokładna, ale niepoprawna. Wolę wstawić „wykrywacz śmieci” przed obliczeniem niż zmodyfikować algo QR, ponieważ wątpię, aby jego poprawność mogła zostać poprawiona. R 2R 2 = 1 - SS e r rR2 jest zdefiniowane jako ( http://en.wikipedia.org/wiki/R_squared ), więc jeśli suma kwadratów-suma wynosi 0, to jest niezdefiniowana. Moim zdaniem R powinien pokazać komunikat o błędzie.R2=1−SSerrSStot
źródło