Secretaría de Ciencia, Humanidades, Tecnología e Innovación y Centro de Investigación en Matemáticas, A.C.

ESTADÍSTICA · EMED — MEB 2024
Sesión 3
Análisis de regresión lineal simple: ajuste, inferencia, predicción y diagnóstico

Dr. Héctor de la Torre Gutiérrez Última actualización: 28/09/2026

OBJETIVO DE LA SESIÓN

Ajustar e interpretar un modelo de regresión lineal simple, evaluar la significancia de la relación lineal, cuantificar la variabilidad explicada, construir intervalos de confianza y predicción, y revisar los principales supuestos mediante el análisis de residuales.

1 Análisis de regresión lineal simple

Ejercicio. Supongamos que se extrae una muestra de farmacias instaladas en la ciudad de Querétaro. Los datos corresponden a los costos \((x_i)\) y ventas \((y_i)\) de las 12 farmacias seleccionadas.

El objetivo es estudiar si existe una relación lineal entre los costos y las ventas, cuantificar dicha relación y utilizar el modelo para realizar estimaciones y predicciones.

1.1 Captura y organización de los datos

Los datos se capturan en R y posteriormente se organizan en un marco de datos:

datos_ejem <- matrix(
  c(11,19, 10,15, 14,20, 13,14, 12,16, 20,33,
    21,32, 15,18, 22,29, 18,22, 19,23, 16,20),
  ncol = 2,
  byrow = TRUE
)

dato_ejem2 <- data.frame(
  Costo = datos_ejem[, 1],
  Venta = datos_ejem[, 2]
)

dato_ejem2

Variables del análisis. En este ejemplo, Costo es la variable explicativa \((X)\) y Venta es la variable de respuesta \((Y)\).

1.2 Ajuste del modelo de regresión

El modelo de regresión lineal simple puede escribirse como:

\[ Y_i = \beta_0 + \beta_1 X_i + \varepsilon_i, \]

donde \(\beta_0\) es el intercepto, \(\beta_1\) representa el cambio promedio esperado en las ventas por cada unidad adicional de costo, y \(\varepsilon_i\) representa el componente aleatorio.

El modelo se ajusta mediante mínimos cuadrados ordinarios:

regre_ejem <- lm(Venta ~ Costo, data = dato_ejem2)
summary(regre_ejem)
#> 
#> Call:
#> lm(formula = Venta ~ Costo, data = dato_ejem2)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -3.6914 -2.5181 -0.7575  1.9065  5.5679 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)  -0.3984     3.8889  -0.102 0.920421    
#> Costo         1.3915     0.2374   5.862 0.000159 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 3.193 on 10 degrees of freedom
#> Multiple R-squared:  0.7746, Adjusted R-squared:  0.7521 
#> F-statistic: 34.37 on 1 and 10 DF,  p-value: 0.0001589
Resultado del ajuste

La recta estimada es:

\(\widehat{Venta} = -0.3984 + 1.3915\,Costo\).

El coeficiente de Costo presenta un p-valor de 0.0001589, por lo que existe evidencia estadística de una asociación lineal entre costo y venta al nivel de significancia usual de 0.05.

El coeficiente de determinación es \(R^2=77.46\%\) y el coeficiente ajustado es \(R^2_{aj}= 75.21\%\).

Interpretación de la pendiente. Por cada unidad adicional de costo, el modelo estima un incremento promedio de aproximadamente 1.392 unidades en las ventas. Esta interpretación describe una asociación lineal dentro del rango observado de los datos y no implica, por sí sola, causalidad.

1.3 Visualización del ajuste por mínimos cuadrados

Para estudiar gráficamente el ajuste, se presenta el diagrama de dispersión junto con la recta estimada por mínimos cuadrados. También se añaden, únicamente con fines didácticos, otras rectas que no corresponden al ajuste de mínimos cuadrados.

plot(
  dato_ejem2$Costo, dato_ejem2$Venta,
  pch = 19,
  xlab = "Costo",
  ylab = "Venta",
  main = "Costo y ventas: ajuste lineal"
)

abline(regre_ejem, col = "red", lwd = 2)
abline(a = -0.3984, b = 1.2315, col = "blue", lwd = 2)
abline(a = -0.3984, b = 1.59, col = "blue", lwd = 2)
abline(a = -0.3984, b = 2.3915, col = "blue", lwd = 2)

legend(
  "topleft",
  legend = c("Mínimos cuadrados", "Otras rectas"),
  col = c("red", "blue"),
  lty = 1,
  lwd = 2,
  bty = "n"
)

Idea central de mínimos cuadrados. La recta estimada por lm() es aquella que minimiza la suma de los cuadrados de los residuales, \(\sum_i (y_i-\hat y_i)^2\).

1.4 Descomposición de la variabilidad y ANOVA

El análisis de varianza permite descomponer la variabilidad total de la respuesta en una parte explicada por el modelo y otra atribuida a los residuales:

\[ SST = SSR + SSE, \]

donde \(SST\) es la suma de cuadrados total, \(SSR\) la suma de cuadrados explicada por la regresión y \(SSE\) la suma de cuadrados de los errores.

anova_regre <- anova(regre_ejem)
anova_regre
Descomposición de variabilidad

La suma de cuadrados total es aproximadamente 452.25.

El modelo explica aproximadamente 77.46% de la variabilidad observada en las ventas, mientras que alrededor de 22.54% permanece en los residuales.

El porcentaje explicado por la regresión coincide con \(R^2\). El \(R^2\) ajustado, en cambio, incorpora una penalización por el número de predictores y por ello es ligeramente menor.

1.5 Intervalos de confianza para los coeficientes

Los intervalos de confianza al 95% para \(\beta_0\) y \(\beta_1\) se obtienen mediante:

coef(regre_ejem)
#> (Intercept)       Costo 
#>  -0.3984339   1.3915246
confint(regre_ejem, level = 0.95)
#>                 2.5 %   97.5 %
#> (Intercept) -9.063393 8.266526
#> Costo        0.862639 1.920410

Lectura del intervalo para \(\beta_1\). Si el intervalo de confianza de la pendiente no contiene al cero, ello es consistente con el rechazo de \(H_0:\beta_1=0\) en la prueba bilateral al mismo nivel de significancia.

1.6 Estimación de la media de ventas

Si se desea estimar la venta promedio para farmacias con costo igual a 25, se utiliza un intervalo de confianza para la respuesta media:

predict(
  regre_ejem,
  newdata = data.frame(Costo = 25),
  interval = "confidence",
  level = 0.95
)
#>        fit      lwr      upr
#> 1 34.38968 29.16512 39.61424

Un intervalo de confianza aquí se refiere al valor medio esperado de las ventas para todas las farmacias con un costo determinado; no a una farmacia individual.

1.7 Intervalos de predicción

Para predecir las ventas de farmacias individuales cuyos costos sean 30 y 35 se utilizan intervalos de predicción:

predict(
  regre_ejem,
  newdata = data.frame(Costo = c(30, 35)),
  interval = "prediction",
  level = 0.95
)
#>        fit      lwr      upr
#> 1 41.34731 30.84478 51.84983
#> 2 48.30493 35.78735 60.82251

Los intervalos de predicción son más amplios que los intervalos de confianza para la media porque incorporan tanto la incertidumbre de la recta estimada como la variabilidad individual alrededor de la recta.

Precaución con la extrapolación. Los costos observados en la muestra están entre 10 y 22. Por tanto, predecir para costos de 30 y 35 implica extrapolar fuera del rango observado. Matemáticamente R puede producir estos intervalos, pero su interpretación debe hacerse con cautela porque la relación lineal no ha sido observada en ese intervalo de costos.

2 Análisis de residuales

El análisis de residuales permite revisar si los supuestos que sustentan la inferencia del modelo son razonables. Para ello utilizaremos los residuales estandarizados.

residuales_stand <- rstandard(regre_ejem)

2.1 Normalidad de los residuales

La normalidad se revisa mediante un gráfico Q-Q y, como apoyo, la prueba de Shapiro-Wilk.

qqnorm(
  residuales_stand,
  pch = 19,
  main = "Gráfico Q-Q de residuales estandarizados"
)
qqline(residuales_stand, col = "red", lwd = 2)

prueba_shapiro <- shapiro.test(residuales_stand)
prueba_shapiro
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  residuales_stand
#> W = 0.92236, p-value = 0.3061

Interpretación. Si el p-valor de Shapiro-Wilk es mayor que \(\alpha=0.05\), no se rechaza la hipótesis de normalidad. Esto no demuestra que los residuales sean exactamente normales; indica que, con esta muestra, no se encontró evidencia suficiente para cuestionar ese supuesto. El gráfico Q-Q debe evaluarse de forma conjunta con la prueba.

2.2 Varianza constante (homocedasticidad)

Se examina la relación entre los valores ajustados y los residuales estandarizados:

plot(
  fitted(regre_ejem),
  residuales_stand,
  pch = 19,
  xlab = "Valores ajustados",
  ylab = "Residuales estandarizados",
  main = "Residuales vs. valores ajustados"
)
abline(h = 0, lty = 2, col = "red")

Qué buscamos. Una nube aproximadamente aleatoria alrededor de cero y con dispersión semejante a lo largo del eje horizontal es compatible con el supuesto de varianza constante. Patrones en forma de abanico, curvatura o cambios sistemáticos en la dispersión pueden indicar problemas de especificación u heterocedasticidad.

2.3 Observaciones atípicas en los residuales

El resumen de los residuales estandarizados es:

summary(residuales_stand)
#>     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
#> -1.23982 -0.82820 -0.27699  0.01926  0.69246  1.92061

Para revisar específicamente si existen residuales estandarizados con magnitud superior a 3:

max(abs(residuales_stand))
#> [1] 1.92061
which(abs(residuales_stand) > 3)
#> named integer(0)

Criterio práctico. Un residual estandarizado con \(|r_i|>3\) puede considerarse una señal de posible observación atípica. La ausencia de valores por encima de este umbral no sustituye un análisis de influencia; en estudios más completos conviene revisar también leverage y distancia de Cook.

2.4 Independencia y otros diagnósticos

La independencia de los errores no puede establecerse únicamente con los gráficos anteriores. Debe justificarse principalmente a partir del diseño y del mecanismo de muestreo. Si los datos tienen un orden temporal o espacial, pueden requerirse diagnósticos adicionales de autocorrelación.

Como revisión gráfica general, R proporciona cuatro diagnósticos clásicos del modelo:

par(mfrow = c(2, 2))
plot(regre_ejem)

par(mfrow = c(1, 1))

3 Síntesis de la sesión

Conclusión. En este ejemplo existe evidencia de una asociación lineal positiva entre costo y venta, y el modelo explica aproximadamente 77.5% de la variabilidad de las ventas. La inspección de residuales permite valorar si los supuestos necesarios para la inferencia son razonables. Las conclusiones deben distinguir entre asociación y causalidad, y las predicciones fuera del rango observado deben interpretarse como extrapolaciones.

Secuencia recomendada de análisis: plantear el modelo → estimar los coeficientes → evaluar la significancia → interpretar \(R^2\) → construir intervalos → revisar residuales → identificar observaciones potencialmente problemáticas → comunicar las conclusiones dentro del rango y contexto de los datos.