Hay mil motivos para criticar una regresión "trucha", pero una R² baja no es uno de ellos

Todo esto arranca con el tuit:

Esa gráfica, extraída de un documento de la OCDE, creo, fue uno de los argumentos esgrimidos por JR Rallo para defender cierta postura que no viene al caso. Lo relevante para estas páginas es que fue contestado y protestado por muchos —de algunos de los cuales, dada su autoproclamada condición de divulgadores científicos, cabría esperar más— en términos exclusivamente de lo pequeño de la R².

Hay mil argumentos para criticar una regresión de ese estilo y mi favorita es 10k regresiones truchas para que cada cual elija la que más le cuadre, en estas mismas páginas. Pero no, la R² no es argumento de nada. La R² está relacionada con el error irreductible, la cantidad de ruido presente en los datos como pone en evidencia el ejemplo que desarrollo a continuación.

En primer lugar, genero varios conjuntos de datos con la misma estructura probabilística pero haciendo variar (crecer) el error irreductible, es decir, la $latex \sigma$ del error normal:

n <- 3000
x <- rnorm(n)

foo <- function(sigma){
  y <- 4 - .2 * x + rnorm(n, 0, sigma)
  modelo <- lm(y ~ x)
  datos <- data.frame(
    x = x,
    y = y, sigma = sigma,
    r.squared = summary(modelo)$r.squared)
}

res <- do.call(
  rbind,
  lapply(seq(0, 2, length.out = 20), foo))

Los datos tienen este aspecto:

library(ggplot2)
ggplot(res, aes(x = x, y = y)) + geom_point(alpha = .2) +
  geom_smooth(method = "lm", col = "red") +
  facet_wrap(~sigma)

El ajuste es siempre el mismo y es —queda propuesto como ejercicio para el lector— perfectamente compatible con la formulación original del modelo. Sin embargo:

r.squared <- unique(res[, c("sigma", "r.squared")])

plot(r.squared$sigma,
      r.squared$r.squared,
      type = "l",
      xlab = "sigma",
      ylab = "r squared",
      main = "r cuadrado según el error\nirreductible del modelo")

¡Oh! La R² se desploma.

En fin…