Betrachten Sie den folgenden R-Code:
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)
Ein Blick auf http://svn.r-project.org/R/trunk/src/appl/dqrls.f ) hat mir nicht geholfen zu verstehen, was los ist, da ich Fortran nicht kenne. In einer anderen Frage wurde beantwortet, dass Gleitkomma-Maschinentoleranzfehler für Koeffizienten für X verantwortlich sind, die nahe, aber nicht ganz 0 sind.
ist größer, wenn der Wert für coef(example(n))["X"]
näher bei 0 liegt. Aber ...
- Warum gibt es überhaupt einen Wert?
- Was bestimmt es (konkret)?
- Warum das scheinbar geordnete Fortschreiten der
NaN
Ergebnisse? - Warum die Verstöße gegen diesen Fortschritt?
- Was ist das "erwartete" Verhalten?
r
regression
russellpierce
quelle
quelle
Y <- rep(1,n)+runif(n)*ynoise
), wäre das interessant :-)apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})
. (Meine Ergebnisse auf einem Win 7 x64 Xeon reichen von -8e-17 bis + 3e-16; ungefähr die Hälfte sind echte Nullen.) Übrigens ist die Fortran-Quelle keine Hilfe: Es ist nur ein Wrapper für dqrdc; Das ist der Code, den Sie sich ansehen möchten.Antworten:
Wie Ben Bolker sagt, finden Sie die Antwort auf diese Frage im Code für
summary.lm()
.Hier ist der Header:
x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)
Schauen wir uns also diesen leicht modifizierten Auszug an:Beachten Sie, dass Ans $ r.squared ist ...0.4998923
Um eine Frage mit einer Frage zu beantworten: Was ziehen wir daraus? :) :)
Ich glaube, die Antwort liegt darin, wie R mit Gleitkommazahlen umgeht. Ich denke dasR2
mss
undrss
sind die Summen sehr kleiner (quadratischer) Rundungsfehler, daher liegt der Grund für bei etwa 0,5. Ich vermute, dass dies mit der Anzahl der Werte zusammenhängt, die erforderlich sind, damit sich die +/- Näherungen auf 0 aufheben (für beide und , wie wahrscheinlich die Quelle dieser Werte ist). Ich weiß jedoch nicht, warum sich die Werte von einer Progression unterscheiden.mss
rss
0/0
NaN
2^(1:k)
Update 1: Hier ist ein netter Thread von R-help , der einige der Gründe behandelt, warum Unterlaufwarnungen in R nicht behandelt werden.
Darüber hinaus enthält diese SO Q & A eine Reihe interessanter Beiträge und nützlicher Links zu Unterlauf, Arithmetik mit höherer Genauigkeit usw.
quelle
Ich bin gespannt auf Ihre Motivation, die Frage zu stellen. Ich kann mir keinen praktischen Grund vorstellen, warum dieses Verhalten von Bedeutung sein sollte. Intellektuelle Neugier ist ein alternativer (und IMO viel vernünftigerer) Grund. Ich denke, Sie müssen FORTRAN nicht verstehen, um diese Frage zu beantworten, aber ich denke, Sie müssen etwas über die QR-Zerlegung und ihre Verwendung in der linearen Regression wissen. Wenn Sie
dqrls
als Black Box behandeln, die eine QR-Zerlegung berechnet und verschiedene Informationen darüber zurückgibt, können Sie möglicherweise die Schritte verfolgen ... oder gehen Sie einfach direkt zusummary.lm
und verfolgen Sie, um zu sehen, wie der R ^ 2 berechnet wird. Speziell:Dann müssen Sie zurückgehen
lm.fit
und sehen, dass die angepassten Werte berechnet werden alsr1 <- y - z$residuals
(dh als Antwort abzüglich der Residuen). Jetzt können Sie herausfinden, was den Wert der Residuen bestimmt und ob der Wert minus seines Mittelwerts genau Null ist oder nicht, und von dort aus die Berechnungsergebnisse herausfinden ...quelle
mss
undrss
"Rauschen". Es ist das GIGO-Prinzip, das sicherstellt, dass präzise, aber falsch ist. Ich würde lieber einen "Mülldetektor" einfügen, bevor ich berechne, als das QR-Algo zu modifizieren, da ich bezweifle, dass seine Gültigkeit verbessert werden könnte. R 2R 2 = 1 - SS e r rR2 ist definiert als ( http://en.wikipedia.org/wiki/R_squared ). Wenn also die Summe der Quadrate 0 ist, ist sie undefiniert. Meiner Meinung nach sollte R eine Fehlermeldung anzeigen.R2=1−SSerrSStot
quelle