Más allá de las fórmulas matemáticas, la idea central de los Mínimos Cuadrados es muy intuitiva. Su objetivo es encontrar la única línea recta que mejor se ajusta a un conjunto de puntos de datos. Pero, ¿qué significa “mejor”?
Imagina que tenemos un conjunto de datos que relaciona las horas de estudio (\(X\)) con la calificación en un examen (\(Y\)). Al graficarlos en un diagrama de dispersión, vemos una nube de puntos. Nuestro objetivo es trazar una línea a través de esta nube que represente la tendencia general.
# Cargamos la librería para graficar
library(ggplot2)
# Creamos datos de ejemplo para que el gráfico sea reproducible
set.seed(42) # para que siempre salgan los mismos números "aleatorios"
datos <- data.frame(
horas_estudio = runif(30, 1, 10)
)
datos$calificacion <- 20 + 7 * datos$horas_estudio + rnorm(30, mean = 0, sd = 8)
# Graficamos el diagrama de dispersión
ggplot(datos, aes(x = horas_estudio, y = calificacion)) +
geom_point(color = "blue", size = 3, alpha = 0.7) +
labs(
title = "Diagrama de Dispersión: Calificación vs. Horas de Estudio",
x = "Horas de Estudio (X)",
y = "Calificación Obtenida (Y)"
) +
theme_minimal()
Podríamos trazar infinitas líneas a través de esos puntos. ¿Cuál es la mejor?
La “mejor” línea será aquella que esté lo más cerca posible de todos los puntos a la vez. Para medir qué tan “lejos” está nuestra línea de un punto de dato real, usamos el residuo.
Un residuo (\(e_i\)) no es más que la distancia vertical entre un punto observado (\(Y_i\)) y el punto correspondiente en nuestra línea de regresión (\(\hat{Y}_i\)).
El siguiente gráfico muestra la línea de regresión óptima (en rojo) y los residuos (líneas verticales discontinuas) para cada punto.
# Calculamos el modelo de regresión lineal con R
modelo_lm <- lm(calificacion ~ horas_estudio, data = datos)
# Añadimos los valores predichos al dataframe
datos$predicho <- predict(modelo_lm)
# Graficamos la línea y los residuos
ggplot(datos, aes(x = horas_estudio, y = calificacion)) +
# La línea de regresión (la mejor línea)
geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "solid", size=1) +
# Los segmentos que representan los residuos
geom_segment(aes(xend = horas_estudio, yend = predicho), color = "gray", linetype = "dashed") +
# Los puntos observados
geom_point(color = "blue", size = 3, alpha = 0.7) +
labs(
title = "Visualización de los Residuos",
subtitle = "La distancia vertical de cada punto a la línea roja es un residuo",
x = "Horas de Estudio (X)",
y = "Calificación Obtenida (Y)"
) +
annotate("text", x = 2, y = 95, label = "Valor Observado (Y)", color="blue") +
annotate("text", x = 3.5, y = 55, label = "Valor Predicho (Ŷ)", color="red") +
annotate("text", x = 8, y = 50, label = "Residuo (e)", color="black") +
theme_minimal()
Ahora necesitamos una medida del “error total” de nuestra línea.
¿Por qué no simplemente sumar los residuos? No funcionaría, porque los residuos positivos se cancelarían con los negativos. Una línea muy mala podría tener una suma de residuos igual a cero.
La solución: ¡Elevarlos al cuadrado! Al elevar cada residuo al cuadrado, logramos dos cosas muy importantes:
El método de Mínimos Cuadrados consiste en encontrar la única línea (es decir, el único par de \(\hat{\beta}_0\) y \(\hat{\beta}_1\)) para la cual la suma del área de todos estos cuadrados sea lo más pequeña posible.
Podemos visualizar estos cuadrados:
# Creamos un rectángulo para cada residuo
# La esquina inferior-izquierda del rectangulo es (horas_estudio, predicho)
# La esquina superior-derecha es (horas_estudio + residuo, calificacion)
datos$residuo <- datos$calificacion - datos$predicho
ggplot(datos, aes(x = horas_estudio, y = calificacion)) +
# Dibujamos los "cuadrados" de los residuos
geom_rect(
aes(xmin = horas_estudio,
xmax = horas_estudio + residuo,
ymin = predicho,
ymax = calificacion),
fill = "orange", alpha = 0.4
) +
geom_smooth(method = "lm", se = FALSE, color = "red", size=1) +
geom_segment(aes(xend = horas_estudio, yend = predicho), color = "gray", linetype = "dashed") +
geom_point(color = "blue", size = 3, alpha = 0.7) +
labs(
title = "Visualización de los Residuos al Cuadrado",
subtitle = "MCO minimiza la suma del área de todos los cuadrados naranjas",
x = "Horas de Estudio (X)",
y = "Calificación Obtenida (Y)"
) +
theme_minimal()
En resumen, la intuición es esta: Imagina que cada residuo es el lado de un cuadrado. El método de mínimos cuadrados prueba todas las líneas posibles y elige aquella que hace que la suma total del área de todos esos cuadrados sea mínima. Esa es, por definición, la “mejor” línea de ajuste.
El objetivo de la regresión lineal simple es modelar la relación entre una variable predictora (independiente), \(X\), y una variable de respuesta (dependiente), \(Y\), a través de una línea recta.
El modelo postula que la relación entre \(X\) y \(Y\) es lineal y se puede describir como:
\[ Y_i = \beta_0 + \beta_1 X_i + \varepsilon_i \]
Donde: - \(Y_i\) es el valor observado de la variable dependiente para la i-ésima observación. - \(X_i\) es el valor observado de la variable independiente para la i-ésima observación. - \(\beta_0\) es el intercepto de la población (el valor de \(Y\) cuando \(X=0\)). - \(\beta_1\) es la pendiente de la población (el cambio en \(Y\) por cada unidad de cambio en \(X\)). - \(\varepsilon_i\) es el término de error aleatorio para la i-ésima observación. Este término captura toda la variabilidad en \(Y\) que no es explicada por \(X\).
Como no conocemos los verdaderos valores de \(\beta_0\) y \(\beta_1\), nuestro objetivo es estimarlos a partir de los datos de nuestra muestra. Llamaremos a estos estimadores \(\hat{\beta}_0\) y \(\hat{\beta}_1\). La línea de regresión ajustada será:
\[ \hat{Y}_i = \hat{\beta}_0 + \hat{\beta}_1 X_i \]
Donde \(\hat{Y}_i\) es el valor predicho para \(Y_i\).
El método de mínimos cuadrados busca encontrar los valores de \(\hat{\beta}_0\) y \(\hat{\beta}_1\) que minimizan la suma de los cuadrados de los residuos (o errores). El residuo (\(e_i\)) es la diferencia entre el valor observado \(Y_i\) y el valor predicho \(\hat{Y}_i\).
\[ e_i = Y_i - \hat{Y}_i = Y_i - (\hat{\beta}_0 + \hat{\beta}_1 X_i) \]
Queremos minimizar la Suma de los Cuadrados de los Errores (SCE), que es una función de \(\hat{\beta}_0\) y \(\hat{\beta}_1\):
\[ S(\hat{\beta}_0, \hat{\beta}_1) = \sum_{i=1}^{n} e_i^2 = \sum_{i=1}^{n} (Y_i - \hat{Y}_i)^2 = \sum_{i=1}^{n} (Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i)^2 \]
Para encontrar los valores de \(\hat{\beta}_0\) y \(\hat{\beta}_1\) que minimizan la función \(S\), utilizamos cálculo diferencial. Tomamos las derivadas parciales de \(S\) con respecto a \(\hat{\beta}_0\) y \(\hat{\beta}_1\) y las igualamos a cero.
a) Derivada parcial con respecto a \(\hat{\beta}_0\):
\[ \frac{\partial S}{\partial \hat{\beta}_0} = \frac{\partial}{\partial \hat{\beta}_0} \sum_{i=1}^{n} (Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i)^2 \]
Aplicando la regla de la cadena:
\[ \frac{\partial S}{\partial \hat{\beta}_0} = \sum_{i=1}^{n} 2(Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i)(-1) = -2 \sum_{i=1}^{n} (Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i) \]
b) Derivada parcial con respecto a \(\hat{\beta}_1\):
\[ \frac{\partial S}{\partial \hat{\beta}_1} = \frac{\partial}{\partial \hat{\beta}_1} \sum_{i=1}^{n} (Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i)^2 \]
Aplicando la regla de la cadena:
\[ \frac{\partial S}{\partial \hat{\beta}_1} = \sum_{i=1}^{n} 2(Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i)(-X_i) = -2 \sum_{i=1}^{n} X_i(Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i) \]
Ahora, igualamos ambas derivadas parciales a cero para encontrar el mínimo. Esto nos da un sistema de dos ecuaciones lineales con dos incógnitas (\(\hat{\beta}_0\) y \(\hat{\beta}_1\)), conocidas como las ecuaciones normales.
A partir de \(\frac{\partial S}{\partial \hat{\beta}_0} = 0\): \[ -2 \sum (Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i) = 0 \implies \sum Y_i - \sum \hat{\beta}_0 - \sum \hat{\beta}_1 X_i = 0 \] \[ \sum Y_i - n\hat{\beta}_0 - \hat{\beta}_1 \sum X_i = 0 \implies n\hat{\beta}_0 + \hat{\beta}_1 \sum X_i = \sum Y_i \]
A partir de \(\frac{\partial S}{\partial \hat{\beta}_1} = 0\): \[ -2 \sum X_i(Y_i - \hat{\beta}_0 - \hat{\beta}_1 X_i) = 0 \implies \sum (X_i Y_i - \hat{\beta}_0 X_i - \hat{\beta}_1 X_i^2) = 0 \] \[ \sum X_i Y_i - \hat{\beta}_0 \sum X_i - \hat{\beta}_1 \sum X_i^2 = 0 \implies \hat{\beta}_0 \sum X_i + \hat{\beta}_1 \sum X_i^2 = \sum X_i Y_i \]
Resolvemos el sistema de ecuaciones normales. Primero, despejamos \(\hat{\beta}_0\) de la primera ecuación normal. Sabiendo que \(\bar{Y} = \frac{\sum Y_i}{n}\) y \(\bar{X} = \frac{\sum X_i}{n}\):
\[ \hat{\beta}_0 = \frac{\sum Y_i}{n} - \hat{\beta}_1 \frac{\sum X_i}{n} \implies \hat{\beta}_0 = \bar{Y} - \hat{\beta}_1 \bar{X} \]
Ahora, sustituimos esta expresión para \(\hat{\beta}_0\) en la segunda ecuación normal para resolver para \(\hat{\beta}_1\):
\[ (\bar{Y} - \hat{\beta}_1 \bar{X}) \sum X_i + \hat{\beta}_1 \sum X_i^2 = \sum X_i Y_i \] \[ \bar{Y} \sum X_i - \hat{\beta}_1 \bar{X} \sum X_i + \hat{\beta}_1 \sum X_i^2 = \sum X_i Y_i \] \[ \hat{\beta}_1 (\sum X_i^2 - \bar{X} \sum X_i) = \sum X_i Y_i - \bar{Y} \sum X_i \] \[ \hat{\beta}_1 = \frac{\sum X_i Y_i - \bar{Y} \sum X_i}{\sum X_i^2 - \bar{X} \sum X_i} \]
Esta fórmula se puede simplificar a una forma más conocida usando las sumas de cuadrados y productos cruzados:
\[ \hat{\beta}_1 = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sum (X_i - \bar{X})^2} \]
Los estimadores de mínimos cuadrados para la pendiente (\(\hat{\beta}_1\)) y el intercepto (\(\hat{\beta}_0\)) de una regresión lineal simple son:
Estimador de la Pendiente: \[ \hat{\beta}_1 = \frac{\sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y})}{\sum_{i=1}^{n} (X_i - \bar{X})^2} = \frac{S_{xy}}{S_{xx}} \]
Estimador del Intercepto: \[ \hat{\beta}_0 = \bar{Y} - \hat{\beta}_1 \bar{X} \]
Donde \(\bar{X}\) y \(\bar{Y}\) son las medias muestrales de \(X\) y \(Y\), respectivamente.
mpg
vs
wt
En este ejercicio, investigaremos la relación entre el peso de un
automóvil (wt
, en miles de libras) y su eficiencia de
combustible (mpg
, millas por galón), utilizando el conjunto
de datos mtcars
. Nuestra hipótesis es que a mayor peso,
menor será la eficiencia de combustible.
Primero, cargamos y exploramos el dataset para entender nuestras variables.
# Cargamos el dataset
data(mtcars)
# Vemos la estructura del dataset
# wt está en 1000 lbs, mpg es Millas/Galón
str(mtcars)
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
El paso más importante en la exploración es visualizar la relación entre las dos variables mediante un diagrama de dispersión. Esto nos ayuda a confirmar si una relación lineal es una suposición razonable.
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "navy", size = 3, alpha = 0.8) +
labs(
title = "Relación entre Peso y Eficiencia de Combustible",
subtitle = "Dataset mtcars",
x = "Peso del Automóvil (en 1000 lbs)",
y = "Millas por Galón (mpg)"
) +
theme_bw()
Como podemos observar, existe una clara tendencia lineal
negativa: a medida que el peso (wt
) aumenta, las
millas por galón (mpg
) tienden a disminuir. Esto confirma
que un modelo de regresión lineal simple es apropiado.
Ahora, usaremos la función lm()
(linear model) para
ajustar nuestro modelo. La fórmula mpg ~ wt
se lee como
“mpg explicado por wt”.
# Ajustamos el modelo de regresión lineal
modelo_mtcars <- lm(mpg ~ wt, data = mtcars)
Para ver los resultados, usamos la función summary()
.
Esta nos proporciona los coeficientes, el R-cuadrado, los p-valores y
más.
# Mostramos el resumen del modelo
summary(modelo_mtcars)
##
## Call:
## lm(formula = mpg ~ wt, data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.5432 -2.3647 -0.1252 1.4096 6.8727
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 37.2851 1.8776 19.858 < 2e-16 ***
## wt -5.3445 0.5591 -9.559 1.29e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.046 on 30 degrees of freedom
## Multiple R-squared: 0.7528, Adjusted R-squared: 0.7446
## F-statistic: 91.38 on 1 and 30 DF, p-value: 1.294e-10
El summary()
nos da toda la información que necesitamos.
Vamos a desglosarla:
1. Coeficientes (Estimates):
Intercepto (\(\hat{\beta}_0\)):
37.285
. Este es el valor predicho de mpg
cuando el peso (wt
) es cero. En este contexto, no tiene una
interpretación práctica (un coche no puede pesar 0 lbs), pero es
matemáticamente necesario para definir la línea.
Pendiente (\(\hat{\beta}_1\)):
-5.344
. ¡Este es el coeficiente más importante! Se
interpreta de la siguiente manera: > Por cada aumento de 1000
lbs en el peso del coche (wt
), se espera que el consumo de
combustible (mpg
) disminuya en promedio 5.344 millas por
galón.
La ecuación de nuestra línea de regresión es: \[ \text{mpg} = 37.285 - 5.344 \times \text{wt} \]
2. Significancia Estadística (p-valor):
El p-valor para el coeficiente wt
es
1.29e-10
(un número extremadamente pequeño). Como este
valor es mucho menor que el nivel de significancia estándar (\(\alpha = 0.05\)), concluimos que
existe una relación estadísticamente significativa
entre el peso y el consumo de combustible. El peso es un predictor útil
para mpg
.
3. Bondad de Ajuste (R-cuadrado):
0.7528
. Esto
significa que el 75.28% de la variabilidad en el consumo de
combustible (mpg
) es explicada por el peso del automóvil
(wt
). Este es un valor alto, lo que indica que
nuestro modelo tiene un buen poder explicativo.Una excelente práctica es graficar la línea de regresión sobre los datos originales para ver visualmente qué tan bien se ajusta.
# Obtenemos la ecuación como texto para añadirla al gráfico
eq <- sprintf("mpg = %.2f %.2f * wt\nR² = %.2f",
coef(modelo_mtcars)[1], # Intercepto
coef(modelo_mtcars)[2], # Pendiente
summary(modelo_mtcars)$r.squared) # R-cuadrado
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "navy", size = 3, alpha = 0.8) +
# Añadimos la línea de regresión con geom_smooth()
geom_smooth(method = "lm", se = FALSE, color = "red", linetype = "dashed") +
labs(
title = "Modelo de Regresión Ajustado",
x = "Peso del Automóvil (en 1000 lbs)",
y = "Millas por Galón (mpg)"
) +
# Anotamos la ecuación en el gráfico
annotate("text", x = 4.5, y = 30, label = eq, hjust = "left", size = 4) +
theme_bw()
## `geom_smooth()` using formula = 'y ~ x'
Un buen análisis no termina con la interpretación. Debemos verificar
si los supuestos del modelo de Mínimos Cuadrados se cumplen. R tiene una
función plot()
fantástica para esto.
par(mfrow = c(2, 2)) # Para mostrar 4 gráficos en una cuadrícula
plot(modelo_mtcars)
par(mfrow = c(1, 1)) # Restablecemos la configuración de gráficos
¿Qué buscamos en estos gráficos?
Residuals vs Fitted (Arriba a la izquierda): Buscamos que los puntos se distribuyan aleatoriamente alrededor de la línea horizontal en 0, sin patrones evidentes. La línea roja debe ser aproximadamente plana. En nuestro caso, se ve bastante bien, aunque hay una ligera curva, lo que podría sugerir que una relación no lineal (quizás un término cuadrático) podría mejorar el modelo.
Normal Q-Q (Arriba a la derecha): Buscamos que los puntos caigan lo más cerca posible de la línea diagonal. Esto verifica el supuesto de normalidad de los residuos. En nuestro caso, los puntos siguen la línea razonablemente bien, por lo que podemos asumir normalidad.
Scale-Location (Abajo a la izquierda): Similar al primer gráfico, busca verificar la homocedasticidad (varianza constante de los residuos). La línea roja debe ser plana, y la dispersión de los puntos debe ser uniforme. Aquí también se ve aceptable.
Residuals vs Leverage (Abajo a la derecha): Ayuda a identificar puntos influyentes (outliers) que podrían tener un gran impacto en el modelo. Puntos fuera de la línea de Cook (líneas discontinuas rojas) son potencialmente problemáticos. En nuestro caso, no hay puntos que excedan estas líneas.
Nuestro modelo de regresión lineal simple fue exitoso. Encontramos
una relación negativa, fuerte y estadísticamente
significativa entre el peso de un coche y su eficiencia de
combustible. El modelo explica aproximadamente el 75% de la variabilidad
en mpg
y, según los diagnósticos, los supuestos del modelo
de MCO se cumplen de manera razonable.