Considere o seguinte código 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)
Ver http://svn.r-project.org/R/trunk/src/appl/dqrls.f ) não me ajudou a entender o que está acontecendo, porque não conheço o Fortran. Em outra pergunta , foi respondido que os erros de tolerância da máquina de ponto flutuante são os responsáveis pelos coeficientes de X que estão próximos, mas não exatamente de 0.
é maior quando o valor de coef(example(n))["X"]
for mais próximo de 0. Mas ...
- Por que existe um valor ?
- O que (especificamente) está determinando isso?
- Por que a progressão aparentemente ordenada dos
NaN
resultados? - Por que as violações dessa progressão?
- O que é esse comportamento "esperado"?
r
regression
russellpierce
fonte
fonte
Y <- rep(1,n)+runif(n)*ynoise
), que seria interessante :-)apply(as.matrix(2:17), 1, function(n){example(n)$coefficients[-1]})
,. (Meus resultados, em um Win 7 x64 Xeon, variam de -8e-17 a + 3e-16; cerca da metade são zeros verdadeiros.) Aliás, a fonte Fortran não ajuda em nada: é apenas um invólucro para o dqrdc; esse é o código que você deseja analisar.Respostas:
Como Ben Bolker diz, a resposta para esta pergunta pode ser encontrada no código para
summary.lm()
.Aqui está o cabeçalho:
Então, vamos
x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x)
dar uma olhada neste extrato ligeiramente modificado:Para responder a uma pergunta com uma pergunta: o que extraímos disso? :)
mss
rss
mss
rss
0/0
NaN
2^(1:k)
Atualização 1: Aqui está um bom tópico da R-help, abordando alguns dos motivos pelos quais avisos de fluxo insuficiente não são abordados em R.
Além disso, essas perguntas e respostas da SO têm várias postagens interessantes e links úteis sobre subfluxo, aritmética de alta precisão, etc.
fonte
Estou curioso sobre sua motivação para fazer a pergunta. Não consigo pensar em uma razão prática para esse comportamento ter importância; a curiosidade intelectual é uma razão alternativa (e IMO muito mais sensível). Acho que você não precisa entender o FORTRAN para responder a essa pergunta, mas acho que precisa saber sobre a decomposição do QR e seu uso na regressão linear. Se você tratar
dqrls
como uma caixa preta que calcula uma decomposição QR e retorna várias informações sobre ela, poderá rastrear as etapas ... ou simplesmente ir diretosummary.lm
e rastrear para ver como o R ^ 2 é calculado. Em particular:Então você deve voltar
lm.fit
e verificar que os valores ajustados são calculados comor1 <- y - z$residuals
(ou seja, como a resposta menos os resíduos). Agora você pode descobrir o que determina o valor dos resíduos e se o valor menos sua média é exatamente zero ou não, e daí descobrir os resultados computacionais ...fonte
mss
rss
fonte