library(readxl)
# Usamos la ruta exacta que encontraste
datos <- read_excel("C:/Users/danie/Downloads/base de datos corregida final......10.xlsx")
# Verificamos que se cargaron las 9 variables
colnames(datos)
## [1] "inev" "imat" "ilyl" "ifis" "iqui" "ibio" "ihis" "ifil" "ied"
# Generamos la matriz de correlación para las 9 variables
matriz_completa <- cor(datos)
# La mostramos redondeada a 3 decimales para que sea legible
round(matriz_completa, 3)
## inev imat ilyl ifis iqui ibio ihis ifil ied
## inev 1.000 0.151 0.718 0.337 0.444 0.430 0.520 0.732 0.640
## imat 0.151 1.000 0.167 -0.001 0.141 0.004 0.090 -0.078 0.154
## ilyl 0.718 0.167 1.000 0.219 0.243 0.250 0.329 0.262 0.326
## ifis 0.337 -0.001 0.219 1.000 0.124 0.151 0.091 0.200 0.177
## iqui 0.444 0.141 0.243 0.124 1.000 0.127 0.198 0.208 0.312
## ibio 0.430 0.004 0.250 0.151 0.127 1.000 0.183 0.141 0.262
## ihis 0.520 0.090 0.329 0.091 0.198 0.183 1.000 0.230 0.279
## ifil 0.732 -0.078 0.262 0.200 0.208 0.141 0.230 1.000 0.286
## ied 0.640 0.154 0.326 0.177 0.312 0.262 0.279 0.286 1.000
library(GGally)
# Gráfico de dispersión para las 9 materias
ggpairs(datos, lower = list(continuous = "smooth"),
diag = list(continuous = "barDiag"), axisLabels = "none")
# 1. Creamos el modelo de Regresión Lineal Múltiple
# El punto "." le dice a R que use las otras 8 materias para predecir 'inev'
modelo_final <- lm(inev ~ ., data = datos)
# 2. Mostramos el resumen estadístico detallado
summary(modelo_final)
##
## Call:
## lm(formula = inev ~ ., data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.66238 -0.22686 -0.00376 0.23690 0.62139
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.8509052 4.2847489 0.199 0.843
## imat 0.1241462 0.0044360 27.986 <2e-16 ***
## ilyl 0.1267874 0.0007773 163.115 <2e-16 ***
## ifis 0.1243658 0.0039215 31.714 <2e-16 ***
## iqui 0.1256307 0.0024306 51.688 <2e-16 ***
## ibio 0.1270581 0.0017620 72.111 <2e-16 ***
## ihis 0.1232425 0.0016901 72.922 <2e-16 ***
## ifil 0.1239672 0.0005712 217.035 <2e-16 ***
## ied 0.1235633 0.0011611 106.419 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2851 on 123 degrees of freedom
## Multiple R-squared: 0.9995, Adjusted R-squared: 0.9995
## F-statistic: 3.155e+04 on 8 and 123 DF, p-value: < 2.2e-16
# 3. Verificamos la multicolinealidad (VIF)
library(car)
vif(modelo_final)
## imat ilyl ifis iqui ibio ihis ifil ied
## 1.082936 1.321800 1.092112 1.167271 1.127746 1.196217 1.206188 1.325223
aqui todas intervinenn y no tengo que borrar niguna porque ninguan me salio mayor a 10 no generan multicolinealidad(por el vif bajo en todas)
# 1. Análisis de Inflación de Varianza (VIF)
# Ya vimos que tus valores están entre 1.08 y 1.32 (¡Excelentes!)
library(car)
vif(modelo_final)
## imat ilyl ifis iqui ibio ihis ifil ied
## 1.082936 1.321800 1.092112 1.167271 1.127746 1.196217 1.206188 1.325223
# 2. Gráficos de Diagnóstico
# Ajustamos los márgenes para que se vean bien
par(mfrow = c(2, 2))
plot(modelo_final, which = 1) # Linealidad: Los puntos deben estar repartidos al azar
plot(modelo_final, which = 2) # Normalidad: Los puntos deben seguir la línea diagonal
plot(modelo_final, which = 3) # Homocedasticidad: La línea roja debe ser lo más recta posible
1. Linealidad (Gráfico Residuals vs Fitted) Observa el primer gráfico
(arriba a la izquierda):
Lo que vemos: Los puntos están dispersos de forma aleatoria alrededor de la línea roja central.
Conclusión: Se cumple el supuesto de linealidad. Esto confirma que una regresión lineal es el método correcto para analizar estos datos, ya que no hay patrones extraños (como curvas o formas de “U”).
Lo que vemos: Casi todos los puntos están perfectamente alineados sobre la línea punteada diagonal.
Conclusión: Los residuos siguen una distribución normal. Esto es fundamental en estadística porque significa que tus predicciones no están sesgadas y que los resultados de las “estrellitas” (p-valores) son totalmente confiables.
Lo que vemos: La línea roja es prácticamente horizontal y los puntos tienen una dispersión constante a lo largo de todo el gráfico.
Conclusión: Hay homocedasticidad. Esto quiere decir que el margen de error del modelo es el mismo tanto para alumnos con pocas faltas como para alumnos con muchas faltas. El modelo es estable en toda la base de datos.
# 1. Cargamos la librería para pruebas de normalidad en muestras grandes
library(nortest)
# 2. Ejecutamos el Test de Lilliefors (Corrección de Kolmogorov-Smirnov)
# Este es el adecuado para tus 132 datos
prueba_lillie <- lillie.test(modelo_final$residuals)
print(prueba_lillie)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: modelo_final$residuals
## D = 0.096709, p-value = 0.004123
# 3. Interpretación automática del resultado
if(prueba_lillie$p.value > 0.05){
print("Conclusión: Los residuos siguen una distribución normal (p > 0.05)")
} else {
print("Conclusión: Los residuos no siguen una distribución normal (p < 0.05)")
}
## [1] "Conclusión: Los residuos no siguen una distribución normal (p < 0.05)"
test de homocedasticidad
# 1. Cargamos la librería
library(lmtest)
# 2. Ejecutamos el Test de Breusch-Pagan
prueba_bp <- bptest(modelo_final)
print(prueba_bp)
##
## studentized Breusch-Pagan test
##
## data: modelo_final
## BP = 2.7232, df = 8, p-value = 0.9505
# 3. Interpretación del resultado
if(prueba_bp$p.value > 0.05){
print("Conclusión: Existe Homocedasticidad (p > 0.05). Las varianzas son constantes.")
} else {
print("Conclusión: Existe Heterocedasticidad (p < 0.05). Revisar dispersión.")
}
## [1] "Conclusión: Existe Homocedasticidad (p > 0.05). Las varianzas son constantes."
existe mocedasticidad
tests de dependicia linal
# 1. Cargamos la librería (ya la usaste para Breusch-Pagan, pero por seguridad)
library(lmtest)
# 2. Ejecutamos el Test de Durbin-Watson
# Evalúa la independencia de los errores (autocorrelación)
prueba_dw <- dwtest(modelo_final)
print(prueba_dw)
##
## Durbin-Watson test
##
## data: modelo_final
## DW = 1.8974, p-value = 0.2674
## alternative hypothesis: true autocorrelation is greater than 0
# 3. Interpretación automática
# Un valor de DW cercano a 2 indica independencia total
if(prueba_dw$p.value > 0.05){
print("Conclusión: Los errores son independientes (p > 0.05). No hay autocorrelación.")
} else {
print("Conclusión: Los errores están correlacionados (p < 0.05).")
}
## [1] "Conclusión: Los errores son independientes (p > 0.05). No hay autocorrelación."