10 votos

¿Por qué hay un R ^ 2 valor (y lo que es determinante) cuando lm no tiene ninguna variación en el valor previsto?

Considere el siguiente 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)

Mirando http://svn.r-project.org/R/trunk/src/appl/dqrls.fa) no me ayude a entender lo que está pasando, porque no sé Fortran. En otra pregunta se contestó que de punto flotante de la máquina de tolerancia de errores son culpa de los coeficientes de X que están cerca, pero no exactamente de 0.

$R^2$ es mayor cuando el valor de coef(example(n))["X"] está más cerca de 0. Pero...

  1. ¿Por qué hay un $R^2$ valor?
  2. Lo que (precisamente) es determinante?
  3. ¿Por qué la aparente progresión ordenada de NaN de resultados?
  4. ¿Por qué las violaciones de esa progresión?
  5. Lo de esta "espera" comportamiento?

6voto

Nikos Alexandris Puntos 764

Como Ben Bolker dice, la respuesta a esta pregunta se puede encontrar en el código de summary.lm().

Aquí está el encabezado:

function (object, correlation = FALSE, symbolic.cor = FALSE, 
    ...) 
{

Por lo tanto, vamos x <- 1:1000; y <- rep(1,1000); z <- lm(y ~ x) y, a continuación, echa un vistazo a esta ligeramente modificada extracto:

    p <- z$rank
    rdf <- z$df.residual
    Qr <- stats:::qr.lm(z)
    n <- NROW(Qr$qr)
    r <- z$residuals
    f <- z$fitted.values
    w <- z$weights
    if (is.null(w)) {
        mss <- sum((f - mean(f))^2)
        rss <- sum(r^2)
    }
    ans <- z[c("call", "terms")]
    if (p != attr(z$terms, "intercept")) {
        df.int <- 1L
        ans$r.squared <- mss/(mss + rss)
        ans$adj.r.squared <- 1 - (1 - ans$r.squared) * ((n - 
            df.int)/rdf)
    }

Observe que ans\$r.squared is $0.4998923$...

To answer a question with a question: what do we draw from this? :)

I believe the answer lies in how R handles floating point numbers. I think that mss and rss are the sums of very small (squared) rounding errors, hence the reason $R^2$ es de alrededor de 0.5. Como para la progresión, sospecho que esto tiene que ver con el número de valores que toma para que el +/- aproximaciones a cancelar a 0 (por tanto mss y rss, 0/0 es probable que la fuente de estos NaN valores). No sé por qué difieren los valores de una 2^(1:k) progresión, aunque.


Actualización 1: Aquí es un buen hilo de R-ayudar a abordar algunas de las razones por las que subdesbordamiento advertencias no son abordados en R.

Además, esta MANERA de Q&A tiene un número de posts interesantes y enlaces útiles sobre el subdesbordamiento, una mayor precisión de la aritmética, etc.

5voto

Ben Bolker Puntos 8729

Estoy curioso acerca de su motivación para hacer la pregunta. No puedo pensar en un práctico de la razón de este comportamiento de la materia; la curiosidad intelectual es una alternativa (y la OMI mucho más sensible) de la razón. Creo que usted no necesita entender FORTRAN para responder a esta pregunta, pero pienso que usted necesita saber acerca de descomposición QR y su uso en la regresión lineal. Si tratas dqrls como una caja negra que calcula una descomposición QR y devuelve información sobre esto, entonces usted puede ser capaz de rastrear los pasos ... o ir directamente a la summary.lm y de seguimiento para ver cómo el R^2 es calculado. En particular:

mss <- if (attr(z$terms, "intercept")) 
          sum((f - mean(f))^2)
       else sum(f^2)
rss <- sum(r^2)
## ... stuff ...
ans$r.squared <- mss/(mss + rss)

Entonces usted tiene que ir de nuevo en lm.fit y ver que los valores ajustados son calculadas como r1 <- y - z$residuals (es decir, como la respuesta de menos de los residuos). Ahora usted puede ir a averiguar lo que determina el valor de los residuos y si el valor de menos su media es exactamente cero o no, y a partir de ahí averiguar el cómputo de los resultados ...

0voto

Bernd Elkemann Puntos 109

$R^2$ se define como el $R^2 = 1-\frac{\textrm{SS}_{err}}{\textrm{SS}_{tot}}$ ( http://en.wikipedia.org/wiki/R_squared ), así que si la suma-de-cuadrados-total es 0 entonces es indefinido. En mi opinión R debe mostrar un mensaje de error.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X