Considérez le code R suivant:
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)
Regarder http://svn.r-project.org/R/trunk/src/appl/dqrls.f ) ne m'a pas aidé à comprendre ce qui se passe, car je ne connais pas Fortran. Dans une autre question, il a été répondu que les erreurs de tolérance de la machine à virgule flottante étaient à blâmer pour les coefficients pour X qui sont proches, mais pas tout à fait de 0.
est supérieur lorsque la valeur de coef(example(n))["X"]
est plus proche de 0. Mais ...
- Pourquoi y a-t-il une valeur ?
- Qu'est-ce (spécifiquement) qui le détermine?
- Pourquoi la progression apparemment ordonnée des
NaN
résultats? - Pourquoi les violations de cette progression?
- Qu'en est-il du comportement «attendu»?
r
regression
russellpierce
la source
la source
Y <- rep(1,n)+runif(n)*ynoise
), ce serait intéressant :-)apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})
. (Mes résultats, sur un Win 7 x64 Xeon, vont de -8e-17 à + 3e-16; environ la moitié sont de vrais zéros.) BTW, la source Fortran ne sert à rien: c'est juste un wrapper pour dqrdc; c'est le code que vous voulez regarder.Réponses:
Comme le dit Ben Bolker, la réponse à cette question se trouve dans le code de
summary.lm()
.Voici l'en-tête:
Alors, jetons
x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)
un œil à cet extrait légèrement modifié:Notez que ans $ r.squared vaut ...0.4998923
Pour répondre à une question par une question: que pouvons-nous en tirer? :)
Je crois que la réponse réside dans la façon dont R gère les nombres à virgule flottante. Je pense queR2
mss
etrss
sont les sommes des très petites erreurs d'arrondi (au carré), d'où la raison pour laquelle est d'environ 0,5. Quant à la progression, je soupçonne que cela a à voir avec le nombre de valeurs nécessaires pour que les approximations +/- s'annulent à 0 (pour les deux et , comme c'est probablement la source de ces valeurs). Je ne sais pas pourquoi les valeurs diffèrent d'une progression, cependant.mss
rss
0/0
NaN
2^(1:k)
Mise à jour 1: voici un joli fil de discussion de R-help abordant certaines des raisons pour lesquelles les avertissements de dépassement de capacité ne sont pas traités dans R.
De plus, ce SO Q&A a un certain nombre de publications intéressantes et de liens utiles concernant le sous-dépassement, l'arithmétique de haute précision, etc.
la source
Je suis curieux de savoir pourquoi vous avez posé la question. Je ne peux pas penser à une raison pratique pour laquelle ce comportement devrait être important; la curiosité intellectuelle est une raison alternative (et beaucoup plus sensée à l'OMI). Je pense que vous n'avez pas besoin de comprendre FORTRAN pour répondre à cette question, mais je pense que vous devez connaître la décomposition QR et son utilisation dans la régression linéaire. Si vous traitez
dqrls
comme une boîte noire qui calcule une décomposition QR et renvoie diverses informations à ce sujet, vous pourrez peut-être suivre les étapes ... ou simplement aller directementsummary.lm
et suivre pour voir comment le R ^ 2 est calculé. En particulier:Ensuite, vous devez revenir dans
lm.fit
et voir que les valeurs ajustées sont calculées commer1 <- y - z$residuals
(c'est-à-dire comme la réponse moins les résidus). Maintenant, vous pouvez déterminer ce qui détermine la valeur des résidus et si la valeur moins sa moyenne est exactement nulle ou non, et à partir de là, déterminer les résultats de calcul ...la source
mss
et lerss
"bruit". C'est le principe GIGO qui garantit que est précis, mais incorrect. Je préfère insérer un "détecteur de déchets" avant de calculer que de modifier l'algorithme QR, car je doute que sa validité puisse être améliorée. R 2R 2 = 1 - SS e r rR2 est défini comme ( http://en.wikipedia.org/wiki/R_squared ), donc si la somme des carrés-total est 0 alors elle n'est pas définie. À mon avis, R devrait afficher un message d'erreur.R2=1−SSerrSStot
la source