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:
# Datos
Horas_sueno <- c(3,2,1,6,8,8,9,5,6,6,7,8,7,8,5,3,2,1,6,8,8,9,5,6,6,7,8,7,8,5,8,8,8,7,7,6,7)
Hora_estudio <- c(2,3,1.5,4,3.5,5,6,2.5,7,8,1,4.5,5.5,6.5,7.5,3,2,4.2,3.8,5.8,6,8,4,5,5,6,9,6,8,4,8,8,9,7,6,5,4)
promedio <- c(60, 58, 50, 70, 75, 80, 85, 65, 78, 88, 55, 72, 76, 84, 90, 62, 59, 61, 74, 81, 83, 89, 68, 73, 75, 77, 91, 79, 86, 70, 87, 88, 89, 85, 84, 82, 80)
# Nueva variable: Horas de uso de internet
Horas_internet <- c(5,6,7,3,2,1,1,4,2,1,6,3,2,2,1,5,6,5,3,2,1,1,4,3,3,2,1,2,1,3,1,1,1,2,2,3,2)
# Crear data frame
datos <- data.frame(Horas_sueno, Hora_estudio, Horas_internet, promedio)
# Ver primeras filas
head(datos)
## Horas_sueno Hora_estudio Horas_internet promedio
## 1 3 2.0 5 60
## 2 2 3.0 6 58
## 3 1 1.5 7 50
## 4 6 4.0 3 70
## 5 8 3.5 2 75
## 6 8 5.0 1 80
cor(datos$Hora_estudio,datos$promedio)
## [1] 0.9197599
# [1] 0.9197599
## Interpretacion: existe una correlacion fuerte y positiva,es decir a mayor horas de estudio mayor sera el promedio.
cor(datos$Horas_sueno, datos$promedio)
## [1] 0.777676
# [1] 0.777676
## Interpretacion: existe una correlacion fuerte y positivo, es decir a mayor horas de sueño mayor sera el promedio
cor(datos$Horas_internet,datos$promedio)
## [1] -0.958969
# [1] -0.958969
## Interpretacion: existe una correlacion fuerte y negativa, es decir a mayor horas de internet menor el promedio
modelo <- lm(promedio ~ Horas_sueno + Hora_estudio + Horas_internet, data = datos)
# Resumen del modelo
summary(modelo)
##
## Call:
## lm(formula = promedio ~ Horas_sueno + Hora_estudio + Horas_internet,
## data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.9257 -1.2724 -0.2788 0.8921 7.7416
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 74.3183 5.4318 13.682 3.73e-15 ***
## Horas_sueno 0.2575 0.3629 0.710 0.483
## Hora_estudio 1.9452 0.4088 4.758 3.75e-05 ***
## Horas_internet -3.7769 0.7098 -5.321 7.16e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.506 on 33 degrees of freedom
## Multiple R-squared: 0.953, Adjusted R-squared: 0.9487
## F-statistic: 223 on 3 and 33 DF, p-value: < 2.2e-16
## Interpretacion Modelo
#Intercepto ( 74.3): indica el promedio cuando todas las variables independientes son cero (hora de sueño, hora de estudio y horas de internet)
#Horas_sueno (0.2575, p 0.483): por cada hora de sueño, el promedio aumenta 0.25, lo que no representa un aumento significativo.
#Horas_estudio ( 1.94, p < 0.001) : por cada hora que se estudie, el promedio aumenta 1.94, mostrando una relacion significativa.
#Horas _internet(-3.77, p < 0.001): indica que por cada hora de internet el promedio disminuye 3.77, teniendo una relacion significativa.
modelo <- lm(promedio ~ Horas_sueno + Hora_estudio + Horas_internet, data = datos)
summary(modelo)
##
## Call:
## lm(formula = promedio ~ Horas_sueno + Hora_estudio + Horas_internet,
## data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.9257 -1.2724 -0.2788 0.8921 7.7416
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 74.3183 5.4318 13.682 3.73e-15 ***
## Horas_sueno 0.2575 0.3629 0.710 0.483
## Hora_estudio 1.9452 0.4088 4.758 3.75e-05 ***
## Horas_internet -3.7769 0.7098 -5.321 7.16e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.506 on 33 degrees of freedom
## Multiple R-squared: 0.953, Adjusted R-squared: 0.9487
## F-statistic: 223 on 3 and 33 DF, p-value: < 2.2e-16
cat("promedio =", round(coef(modelo)[1], 2), "+",
round(coef(modelo)[2], 2), "* Horas_sueno +",
round(coef(modelo)[3], 2), "* Hora_estudio +",
round(coef(modelo)[4], 2), "* Horas_internet")
## promedio = 74.32 + 0.26 * Horas_sueno + 1.95 * Hora_estudio + -3.78 * Horas_internet
## promedio = 74.32 + 0.26 * Horas_sueno + 1.95 * Hora_estudio + -3.78 * Horas_internet
#Grafico de residuos vs valores ajustados
plot(modelo$fitted.values, resid(modelo),
xlab = "Valores Ajustados",
ylab = "Residuos",
main = "Gráfico de residuos vs. valores ajustados",
pch = 19, col = "blue")
abline(h = 0, col = "red", lty = 2)
##Intepretacion: como se puede observar en el grafico la mayoria de los puntos se encuentran dispersos alrededor de la linea del 0, lo que sugiere que no hay tendencia generalizada entre los residuos, lo que es deseable.
residuos <- resid(modelo)
# Histograma de los residuos
hist(residuos,
breaks = 10,
col = "skyblue",
main = "Histograma de los Residuos",
xlab = "Residuos",
ylab = "Frecuencia")
# Superponer curva normal teórica
xfit <- seq(min(residuos), max(residuos), length = 100)
yfit <- dnorm(xfit, mean = mean(residuos), sd = sd(residuos))
yfit <- yfit * diff(hist(residuos, plot = FALSE)$breaks)[1] * length(residuos)
lines(xfit, yfit, col = "red", lwd = 2)
## Interpretacion: la forma de dsirtibucion en la grafica sugiere que los residuos no tienen normalidad.
residuos <- resid(modelo)
# Prueba de Shapiro-Wilk
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.93815, p-value = 0.04029
#[1] p-value = 0.04029
##Interpretacion: el resultado nos indica que no exixte evidencia para afirmar que los residuo siguen una distribucion normal.
#install.packages("lmtest")
library(lmtest)
## Cargando paquete requerido: zoo
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(modelo)
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 0.73424, df = 3, p-value = 0.8651
#{1} p-value = 0.8651
##Interpretacion:como p es 0.8651 que es mayor a 0.05 no se rechaza la hipotesis nula de homocedaticidad, es decir no hay heterocedasticidad en el modelo.
#install.packages("lmtest")
library(lmtest)
dwtest(modelo)
##
## Durbin-Watson test
##
## data: modelo
## DW = 1.3141, p-value = 0.01017
## alternative hypothesis: true autocorrelation is greater than 0
##Interpretacion: como el valor de Dw esta cercano a 2 nos indica Autocorrelacion de los residuos, violando un supuesto de la regresion lineal.
#install.packages("car")
library(car)
## Cargando paquete requerido: carData
vif(modelo)
## Horas_sueno Hora_estudio Horas_internet
## 3.599186 4.420278 8.642497
# #{1} Hora_sueno= 3.599186 Hora_estudio= 4.420278 Hora_internet=8.642497
##Interpretacion: hora y sueno presentan una correlacion moderado que no es preocupante, sin embargo Horas internet presenta un vif de 8.64 sugiriendo multicolinealidad afectando las estimaciones de los coeficientes.
El modelo funciona razonablemente bien, pero presenta dos preocupaciones con la autocorrelacion positiva y la alta multicolinealidad en la variable Horas_internet. se recomienda revisar las variables y utilizar metodos alternatiivos como seires de tiempo.