Análisis de regresión lineal simple usando datos sobre horas de estudio y nota obtenida. Se incluyen las fórmulas utilizadas en el modelo y su implementación en R.
El modelo es:
\[ Y_i = \beta_0 + \beta_1 X_i + \varepsilon_i \]
Donde:
* \(Y_i\): Ingreso Neto
i
* \(X_i\): Gasto Familiar (sinarriendo)
i
* \(\beta_0\): intercepto (valor
esperado si X = 0)
* \(\beta_1\): pendiente (cuánto varía
Y por cada valor que varía X)
* \(\varepsilon_i\): error
aleatorio
# Cargar las librerías necesaria
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.4.2
## Cargando paquete requerido: zoo
## Warning: package 'zoo' was built under R version 4.4.2
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.2
# Importar la base de datos
Base <- read_excel(
"C:/Users/BT_/OneDrive/Escritorio/TRABAJOS DE ESTADISTICA/Base de datos Alcaldia.xlsx")
# Verificar los primeros datos
head(Base)
## # A tibble: 6 × 8
## `>` Estrato `Ingreso Neto` `No de Personas a Cargo` Gastos Familar (sinarr…¹
## <dbl> <dbl> <dbl> <chr> <dbl>
## 1 1 1 895212 Ninguna 367037
## 2 2 1 822988 Ninguna 288046
## 3 3 1 812288 Ninguna 324915
## 4 4 1 627853 Ninguna 282534
## 5 5 1 673359 Ninguna 282811
## 6 6 1 696733 Ninguna 320497
## # ℹ abbreviated name: ¹`Gastos Familar (sinarriendo)`
## # ℹ 3 more variables: `Gastos de Arriendo` <dbl>, `Gastos / Ingresos` <dbl>,
## # `Arriendos/ Ingreso` <dbl>
#Si desea, se renombra las variables
## En lugar de trabajar con nombres largos como "Ingreso Neto" y "Gastos Familiar", los renombramos simplemente como x e y, respectivamente.
names(Base)[names(Base) == "Ingreso Neto"] <- "x"
names(Base)[names(Base) == "Gastos Familar (sinarriendo)"] <- "y"
names(Base)[names(Base) == "Gastos de Arriendo"] <- "z"
names(Base)[names(Base) == "Estrato"] <- "u"
x <- Base$x
y <- Base$y
z <- Base$z
u <- Base$u
Fórmula:
\[ \hat{\beta}_1 = \frac{\sum (x_i - \bar{x})(y_i - \bar{y})}{\sum (x_i - \bar{x})^2} \]
¿Qué significa?
¿Por qué se usa así? Porque queremos encontrar la pendiente de la recta que mejor ajusta todos los puntos, minimizando los errores.
x <- Base$x
y <- Base$y
media_x <- mean(x)
media_y <- mean(y)
numerador <- sum((x - media_x) * (y - media_y))
denominador <- sum((x - media_x)^2)
beta_1 <- numerador / denominador
beta_1
## [1] 0.3263488
Interpretación:Por cada peso adicional en gasto familiar sin arriendo, se espera que el ingreso neto aumente 0.326 pesos, en promedio.
Fórmula:
\[ \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} \]
¿Qué significa?
Es el gasto (X = 0).
beta_0 <- media_y - beta_1 * media_x
beta_0
## [1] 133027.9
Interpretación: 1.3302792^{5} este valor representa el Ingreso Neto esperado cuando el Gasto Familiar (sin arriendo) es cero.
# Ajustar el modelo de regresión
## Ajustar un modelo de regresión lineal simple, donde tratamos de explicar el gasto familiar (y) en función del ingreso neto (x).
modelo <- lm(y ~ x, data = Base)
## Usar summary(modelo) para obtener un resumen con los coeficientes, el error estándar, los valores p y el R², entre otros datos.
summary(modelo)
##
## Call:
## lm(formula = y ~ x, data = Base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -274876 -48440 -9871 38139 341567
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.330e+05 2.361e+04 5.634 8.62e-08 ***
## x 3.263e-01 1.998e-02 16.331 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 92780 on 148 degrees of freedom
## Multiple R-squared: 0.6431, Adjusted R-squared: 0.6407
## F-statistic: 266.7 on 1 and 148 DF, p-value: < 2.2e-16
Ecuación final del modelo:
\[ \hat{Y}_i = 1.3302792\times 10^{5} + 0.326 \cdot X_i \]
Fórmula de predicción:
\[ \hat{Y}_i = \hat{\beta}_0 + \hat{\beta}_1 x_i \]
Base$predicciones <- beta_0 + beta_1 * x
head(Base[, c("x", "y", "predicciones")])
## # A tibble: 6 × 3
## x y predicciones
## <dbl> <dbl> <dbl>
## 1 895212 367037 425179.
## 2 822988 288046 401609.
## 3 812288 324915 398117.
## 4 627853 282534 337927.
## 5 673359 282811 352778.
## 6 696733 320497 360406.
Ejemplo: Si una familia reporta un Gasto Familiar (sin arriendo) de 5 millones de pesos, el modelo predice que su Ingreso Neto estimado es de 1.3302955^{5} mil pesos.
Fórmula del residuo:
\[ e_i = y_i - \hat{Y}_i \]
¿Qué significa?
Base$predicciones <- beta_0 + beta_1 * x
Base$residuos <- y - Base$predicciones
head(Base[, c("x", "y", "predicciones", "residuos")])
## # A tibble: 6 × 4
## x y predicciones residuos
## <dbl> <dbl> <dbl> <dbl>
## 1 895212 367037 425179. -58142.
## 2 822988 288046 401609. -113563.
## 3 812288 324915 398117. -73202.
## 4 627853 282534 337927. -55393.
## 5 673359 282811 352778. -69967.
## 6 696733 320497 360406. -39909.
Interpretación: Los residuos son los errores del modelo: cuánto se desvían las predicciones de los valores reales.
Fórmula:
\[ ECM = \frac{1}{n} \sum (y_i - \hat{Y}_i)^2 \]
¿Qué significa?
Elementos de la fórmula:
ECM <- mean(Base$residuos^2)
ECM
## [1] 8493299666
Interpretación: El ECM nos dice en promedio cuánto se está equivocando el modelo, pero en unidades al cuadrado (no directamente en notas).
Fórmula:
\[ RMSE = \sqrt{ECM} \]
¿Qué significa?
RMSE <- sqrt(ECM)
RMSE
## [1] 92159.1
Interpretación: El RMSE indica, en promedio, cuánto se desvían las predicciones del modelo respecto a los ingresos reales.
Fórmula:
\[ R^2 = 1 - \frac{\sum (y_i - \hat{Y}_i)^2}{\sum (y_i - \bar{y})^2} \]
¿Qué significa?
Elementos de la fórmula:
SSE <- sum(Base$residuos^2)
SST <- sum((y - media_y)^2)
R2 <- 1 - SSE / SST
R2
## [1] 0.6431057
Interpretación: El \(R^2\) indica que el modelo explica el 64.31% de la variabilidad total en los ingresos de las personas. Un \(R^2\) cercano a 1 indica un ajuste muy bueno; cercano a 0, un ajuste pobre.
plot(x, y, pch = 19, col = "blue",
xlab = "Ingreso Neto", ylab = "Gastos Familiar (sinarriendo)",
main = "Regresion lineal: Ingreso Neto ~ Gastos Familiar (sinarriendo)")
abline(beta_0, beta_1, col = "red", lwd = 2)
plot(Base$predicciones, Base$residuos, pch = 19, col = "darkgreen",
xlab = "Valores predichos", ylab = "Residuos",
main = "Residuos vs Valores ajustados")
abline(h = 0, col = "blue", lty = 2)
El análisis muestra una relación positiva entre el Gasto Familiar (sin arriendo) y el Ingreso Neto. El modelo predice que por cada unidad adicional de gasto, el ingreso neto aumenta en promedio 0.33) pesos. El coeficiente de determinación \(R^2\) indica que una parte importante de la variabilidad del ingreso se explica por el gasto familiar.
Los modelos de regresión lineal requieren que ciertos supuestos estadísticos se cumplan para que las estimaciones sean válidas y confiables. A continuación validamos los cuatro supuestos fundamentales.
Descripción:
La relación entre la variable independiente \(X\) (IOngreso Neto) y la dependiente \(Y\) (Gasto Familiar (sinarriendo)) debe ser
lineal.
Forma teórica:
\[ E(Y_i | X_i) = \beta_0 + \beta_1 X_i \]
Cómo se verifica:
# Gráfico de residuos vs valores ajustados
plot(Base$predicciones, Base$residuos,
main = "Residuos vs Valores Ajustados",
xlab = "Valores Ajustados", ylab = "Residuos",
pch = 19, col = "darkgreen")
abline(h = 0, col = "blue", lty = 2)
Interpretación esperada: Los residuos deben estar distribuidos aleatoriamente alrededor de 0, sin una forma curva ni patrón sistemático.
Descripción:
La varianza de los errores debe ser constante a lo
largo de todos los valores de \(X\).
Forma teórica:
\[ Var(\varepsilon_i) = \sigma^2, \quad \forall i \]
Cómo se verifica:
#Prueba de Breusch-Pagan
library(lmtest)
bptest(modelo)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 25.586, df = 1, p-value = 4.232e-07
Interpretación esperada:
- Si el p-valor es mayor a 0.05, no se rechaza la
homocedasticidad (lo cual es bueno). - En el gráfico, la dispersión de
los residuos debe ser aproximadamente constante (no
forma de cono o embudo).
Descripción:
Los errores \(\varepsilon_i\) deben
estar distribuidos normalmente, especialmente si vamos
a hacer pruebas de hipótesis.
Forma teórica:
\[ \varepsilon_i \sim N(0, \sigma^2) \]
Cómo se verifica:
# Histograma de residuos
hist(Base$residuos,
main = "Histograma de residuos",
col = "lightblue",
probability = TRUE, # Esto es importante para que el eje Y sea una densidad
xlab = "Residuos")
# Agregar la curva normal (campana de Gauss)
curve(dnorm(x, mean = mean(Base$residuos), sd = sd(Base$residuos)),
col = "red", lwd = 2, add = TRUE)
# QQ plot
qqnorm(Base$residuos)
qqline(Base$residuos, col = "red")
# Prueba de normalidad
shapiro.test(Base$residuos)
##
## Shapiro-Wilk normality test
##
## data: Base$residuos
## W = 0.95612, p-value = 0.0001096
Interpretación esperada:
Descripción:
Los errores deben ser independientes entre sí (sin
correlación serial).
Forma teórica:
\[ Cov(\varepsilon_i, \varepsilon_j) = 0 \quad \text{para } i \ne j \]
Cómo se verifica:
dwtest(modelo)
##
## Durbin-Watson test
##
## data: modelo
## DW = 1.083, p-value = 5.121e-09
## alternative hypothesis: true autocorrelation is greater than 0
Interpretación esperada:
Si todos los gráficos y pruebas son favorables (residuos aleatorios, varianza constante, distribución normal y errores independientes), podemos decir que los supuestos del modelo se cumplen y las inferencias realizadas con la regresión son confiables.
linealidad: El gráfico de residuos vs valores ajustados no muestra un patrón sistemático o curvo, lo que sugiere que la relación entre el Ingreso Neto y el Gasto Familiar (sin arriendo) es aproximadamente lineal. Por lo tanto, el supuesto de linealidad se cumple.
Homocedasticidad: La prueba de Breusch-Pagan devuelve un p-valor mayor a 0.05, lo que indica que no hay evidencia suficiente para rechazar la homocedasticidad. Además, el gráfico no muestra un patrón de “cono”. Por lo tanto, el supuesto de varianza constante se cumple.
Normalidad de los errores: El histograma de residuos se asemeja visualmente a una campana de Gauss y el QQ plot muestra puntos mayormente alineados con la línea. Si el p-valor del test de Shapiro-Wilk es > 0.05, podemos asumir normalidad de los errores. En caso contrario (p < 0.05), hay ligero desvío de la normalidad, lo cual podría afectar pruebas de hipótesis, aunque no necesariamente la validez del modelo.
Independencia de los errores: La prueba de Durbin-Watson muestra un estadístico cercano a 2 y un p-valor mayor a 0.05, lo que sugiere que no existe autocorrelación entre los errores. Por lo tanto, el supuesto de independencia se cumple.
La regresión lineal múltiple es una extensión de la regresión lineal simple que permite modelar la relación entre una variable dependiente \(Y\) y múltiples variables independientes \(X_1, X_2, \dots, X_k\).
Este modelo surge cuando se desea explicar una respuesta utilizando más de un predictor, ya que muchos fenómenos del mundo real están influenciados por múltiples factores simultáneamente.
Se utiliza para:
La forma general del modelo de regresión lineal múltiple es:
\[ Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k + \varepsilon \]
Donde:
Los supuestos del modelo clásico Gauss-Markov son condiciones necesarias para que los estimadores obtenidos por Mínimos Cuadrados Ordinarios (OLS) sean:
Es decir, bajo estos supuestos, los coeficientes estimados por OLS son los mejores estimadores lineales insesgados (BLUE: Best Linear Unbiased Estimators).
Linealidad en los parámetros
El modelo debe ser lineal respecto a los coeficientes: \[
Y = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k + \varepsilon
\]
Esperanza del error igual a cero
Esto significa que los errores (residuos) tienen media cero. En términos prácticos, el modelo no tiene sesgo sistemático al predecir.
Cuando decimos que un modelo no tiene sesgo sistemático, nos referimos a que en promedio, las predicciones del modelo no se desvían del valor real.
\[ \mathbb{E}[\varepsilon_i] = 0 \]
Es decir, si repites muchas veces el modelo con diferentes muestras (o en teoría, infinitas veces), los errores se compensan entre sí: no tienden a ser siempre positivos o siempre negativos.
En regresión múltiple:
Dos o más variables explicativas no deben estar perfectamente
correlacionadas.
Esto permite que los coeficientes de cada predictor sean identificables y únicos.
*No aplica a regresión simple, ya que solo hay una \(X\).
Solo es relevante en regresión múltiple**.
La varianza de los errores debe ser constante a lo largo de todas las observaciones. Si este supuesto se viola, ocurre heterocedasticidad, y aunque los coeficientes siguen siendo insesgados, ya no son eficientes (no son BLUE).
Los errores no deben estar correlacionados entre sí. Este supuesto es clave en análisis de series temporales, donde los valores están ordenados en el tiempo.
Bajo estos cinco supuestos, los estimadores obtenidos por OLS son:
BLUE (Best Linear Unbiased Estimators):
Los mejores (mínima varianza), lineales e insesgados estimadores disponibles.
¿Qué tan buenos son los estimadores que obtenemos al usar regresión lineal por mínimos cuadrados (OLS)?
BLUE (Best Linear Unbiased Estimators):
- Best: tienen la mínima varianza posible
- Linear: son funciones lineales de los datos
- Unbiased: no están sistemáticamente desviados del valor real
Este teorema es válido tanto en regresión simple como en múltiple. Sin embargo, el supuesto de no multicolinealidad solo es relevante en el contexto múltiple, donde hay más de un predictor.
data(Base)
## Warning in data(Base): data set 'Base' not found
head(Base)
## # A tibble: 6 × 10
## `>` u x `No de Personas a Cargo` y z `Gastos / Ingresos`
## <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
## 1 1 1 895212 Ninguna 367037 250659 0.41
## 2 2 1 822988 Ninguna 288046 222207 0.35
## 3 3 1 812288 Ninguna 324915 243686 0.4
## 4 4 1 627853 Ninguna 282534 175799 0.45
## 5 5 1 673359 Ninguna 282811 195274 0.42
## 6 6 1 696733 Ninguna 320497 195085 0.46
## # ℹ 3 more variables: `Arriendos/ Ingreso` <dbl>, predicciones <dbl>,
## # residuos <dbl>
La data ‘Base’ (Base de Datos Alcaldia) es un conjunto de datos que contiene información sobre los ingresos y gatos de los funcionarios de la alcaldia de Neiva para el año 2019.
El conjunto de datos Base contiene la siguiente
información. A continuación, se presenta la descripción de cada variable
que se trabajara:
| Variable | Significado | Tipo |
|---|---|---|
x |
Ingreso Neto | Continua |
y |
Gasto Familiar (sinarriendo) | Continua |
z |
Gasto de Arriendo | Continua |
u |
Estrato | Continua |
Queremos predecir el ingreso (x) a partir de tres
variables:
u: Estratoy: Gasto Familiar (sinarriendo)z: Gasto de Arriendomodelo <- lm(x ~ y + z + u, data = Base)
summary(modelo)
##
## Call:
## lm(formula = x ~ y + z + u, data = Base)
##
## Residuals:
## Min 1Q Median 3Q Max
## -405091 -77842 -11129 69175 527081
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.024e+05 5.677e+04 1.803 0.0734 .
## y 2.125e-01 1.808e-01 1.175 0.2418
## z 9.975e-01 4.141e-01 2.409 0.0172 *
## u 3.202e+05 2.909e+04 11.008 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 156600 on 146 degrees of freedom
## Multiple R-squared: 0.834, Adjusted R-squared: 0.8306
## F-statistic: 244.5 on 3 and 146 DF, p-value: < 2.2e-16
coeficientes <- summary(modelo)$coefficients
coeficientes
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.023667e+05 5.677445e+04 1.803042 7.344390e-02
## y 2.124942e-01 1.808223e-01 1.175155 2.418458e-01
## z 9.975392e-01 4.141053e-01 2.408902 1.724695e-02
## u 3.202303e+05 2.909064e+04 11.008021 6.741029e-21
Interpretacion:
Intercepto (102376): El intercepto (constante) del modelo es aproximadamente 102,367, lo cual representa el valor esperado de la variable dependiente cuando todas las variables independientes (y, z, u) son cero.ie, El p-valor es 0.073, lo que indica que el intercepto no es estadísticamente significativo al 5%, pero sí lo sería al 10%.
y (0.212): Signidica que por cada peso que aumenta ‘y’, se espera que la variable dependiente aumente en 0.212, manteniendo las demás variables constantes.ie, El p-valor es 0.2418, por lo tanto, no es estadísticamente significativo. Esto sugiere que y no tiene un efecto claro sobre la variable dependiente en este modelo.
z (0.998): Lo que indica que por cada unidad adicional en z, la variable dependiente se incrementa aproximadamente en 0.998, manteniendo constantes las otras variables. ie, El p-valor es 0.017, lo que indica que sí es estadísticamente significativo al 5%, por lo tanto, z tiene un efecto relevante sobre la variable dependiente.
u (320230): lo que sugiere un cambio muy grande en la variable dependiente por cada unidad adicional de u.ie, El p-valor es 6.74e-21, extremadamente bajo, por lo que es altamente significativo. u tiene un efecto muy fuerte y claro sobre la variable dependiente.
cat("x =", round(coef(modelo)[1], 2), "+",
round(coef(modelo)[2], 2), "* y +",
round(coef(modelo)[3], 2), "* z +",
round(coef(modelo)[4], 5), "* u")
## x = 102366.7 + 0.21 * y + 1 * z + 320230.3 * u
plot(modelo$fitted.values, modelo$residuals,
main = "Residuos vs Valores Ajustados",
xlab = "Valores Ajustados", ylab = "Residuos", pch = 19, col = "darkgreen")
abline(h = 0, col = "blue", lty = 2)
Interpretacion:
hist(modelo$residuals,
main = "Histograma de residuos",
col = "lightblue",
probability = TRUE,
# Esto es importante para que el eje Y sea una densidad
xlab = "Residuos")
# Agregar la curva normal (campana de Gauss)
curve(dnorm(x, mean = mean(modelo$residuals), sd = sd(modelo$residuals)),
col = "red", lwd = 2, add = TRUE)
qqnorm(modelo$residuals)
qqline(modelo$residuals, col = "red")
Interpretacion:
library(lmtest)
bptest(modelo)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 36.737, df = 3, p-value = 5.231e-08
dwtest(modelo)
##
## Durbin-Watson test
##
## data: modelo
## DW = 1.9721, p-value = 0.3757
## alternative hypothesis: true autocorrelation is greater than 0
Interpretacion: - El valor p es muy pequeño (p < 0.001), lo que lleva a rechazar la hipótesis nula.
Puede afectar la estabilidad de los coeficientes. Si dos o más variables independientes están muy correlacionadas entre sí, los estimadores pueden volverse inestables. Se evalúa con el VIF (Variance Inflation Factor).
install.packages(“car”) # Solo la primera vez library(car) vif(modelo)
VIF ≈ 1: No hay colinealidad.
VIF entre 1 y 5: Moderada colinealidad (aceptable).
VIF > 10: Colinealidad alta. Puede ser preocupante.
vif_manual <- function(modelo) {
X <- model.matrix(modelo)[, -1]
sapply(1:ncol(X), function(i) {
rsq <- summary(lm(X[, i] ~ X[, -i]))$r.squared
1 / (1 - rsq)
})
}
vif_manual(modelo)
## [1] 4.761572 4.653089 3.452429
Interpretacion: - Ninguna variable supera el umbral crítico de 5, por lo tanto no hay colinealidad severa. Sin embargo, los valores cercanos a 5 indican que sí existe una cierta multicolinealidad moderada, especialmente en las primeras dos variables. *Esto no representa un problema grave, pero es recomendable estar alerta si el modelo se vuelve inestable (por ejemplo, con cambios de signo o significancia al agregar o quitar variables).
El modelo de regresión muestra que las variables ‘z’ (gasto de arriendo) y ‘u’ (estrato) tienen efectos positivos y estadísticamente significativos sobre el ingreso (x), siendo u el predictor más influyente. En cambio, ‘y’ (gasto familiar sin arriendo) no presenta un efecto significativo. Los residuos se distribuyen aproximadamente de forma normal y no hay evidencia de autocorrelación. Sin embargo, la prueba de Breusch-Pagan detecta heterocedasticidad, lo que puede afectar la validez de las inferencias. Los factores de inflación de varianza (VIF) indican una colinealidad moderada pero no preocupante. En conjunto, el modelo es útil para explicar el ingreso, aunque requiere ajustes para corregir la heterocedasticidad.