# Ejercicio de econometría con la base de datos CASchools

# Cargar libreria y base de datos 
library(AER)
## Cargando paquete requerido: car
## Cargando paquete requerido: carData
## Cargando paquete requerido: lmtest
## Cargando paquete requerido: zoo
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Cargando paquete requerido: sandwich
## Cargando paquete requerido: survival
data("CASchools")
attach(CASchools)

# Análisis descriptivo de variables de interés
CASchools$avg = (math + read) / 2   # Crea la variable del rendimiento promedio en matematica y lectura

attach(CASchools)
## The following objects are masked from CASchools (pos = 3):
## 
##     calworks, computer, county, district, english, expenditure, grades,
##     income, lunch, math, read, school, students, teachers
summary(students)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    81.0   379.0   950.5  2628.8  3008.0 27176.0
summary(avg)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   605.5   640.0   654.5   654.2   666.7   706.8
hist(students, main = "Distribución del numero de estudiantes", col = "blue")

hist(avg, main = "Distribución del rendimiento de los estudiantes", col = "blue")

# Realizar grafico de dispersión
CASchools$ratiope= CASchools$students/CASchools$teachers #agregar variable a base de datos

attach(CASchools)
## The following objects are masked from CASchools (pos = 3):
## 
##     avg, calworks, computer, county, district, english, expenditure,
##     grades, income, lunch, math, read, school, students, teachers
## The following objects are masked from CASchools (pos = 4):
## 
##     calworks, computer, county, district, english, expenditure, grades,
##     income, lunch, math, read, school, students, teachers
plot(students, avg)

plot(ratiope, avg)

# Realizar modelo
modelo= lm(avg~ratiope)
summary(modelo)
## 
## Call:
## lm(formula = avg ~ ratiope)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -47.727 -14.251   0.483  12.822  48.540 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 698.9329     9.4675  73.825  < 2e-16 ***
## ratiope      -2.2798     0.4798  -4.751 2.78e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.58 on 418 degrees of freedom
## Multiple R-squared:  0.05124,    Adjusted R-squared:  0.04897 
## F-statistic: 22.58 on 1 and 418 DF,  p-value: 2.783e-06
abline(coef = coef(modelo), col = "blue", lwd = 2)

print("Los resultados de la regresión muestran una relación negativa significativa entre la cantidad de estudiantes por profesor y el rendimiento de los estudiantes, específicamente por cada aumento unitario en la ratio de alumnos por profesor, el rendimiento descende en 2.28 unidades")
## [1] "Los resultados de la regresión muestran una relación negativa significativa entre la cantidad de estudiantes por profesor y el rendimiento de los estudiantes, específicamente por cada aumento unitario en la ratio de alumnos por profesor, el rendimiento descende en 2.28 unidades"
# Predicción de rendimiento para ratio-ep
coef = coef(modelo)

# Ratio pe de 17 ; Correspondiente al ratio en general para la matricula en Nicaragua en 2022, datos CNU
(pred_rend = coef[1] + coef[2]*17)  # El rendimiento correspondiente sería de 660.18
## (Intercept) 
##    660.1762
print("El rendimiento correspondiente a un ratio de 17 alumnos por profesor sería de 660.18")
## [1] "El rendimiento correspondiente a un ratio de 17 alumnos por profesor sería de 660.18"
# Ratio pe correspondiente a un rendimiento de 650
(ratio_est = (650 - coef[1]) / coef[2])
## (Intercept) 
##    21.46363
print("El ratio de estudiantes que garantiza un mínimo de 650 puntos de rendimiento es de 21.5 estudiantes por profesor")
## [1] "El ratio de estudiantes que garantiza un mínimo de 650 puntos de rendimiento es de 21.5 estudiantes por profesor"
# Variación en el rendimiento frente a variacion de estudiantes de 19 -> 23
rend_19e = coef[1] + coef[2]*19
rend_23e = coef[1] + coef[2]*23
(var_rend = rend_23e - rend_19e)
## (Intercept) 
##   -9.119233
(var_rend_p = (rend_23e / rend_19e) - 1)
## (Intercept) 
##  -0.0139094
print("Ante un aumento en los estudiantes de 19 a 23, el rendimiento se redujo en 9 unidades, o en un 1.4% aproximadamente")
## [1] "Ante un aumento en los estudiantes de 19 a 23, el rendimiento se redujo en 9 unidades, o en un 1.4% aproximadamente"
# Resultados de la pendiente y el intercepto con fórmulas
# Fórmula de la pendiente
num = sum((ratiope - mean(ratiope))*(avg - mean(avg)))
den = sum((ratiope-mean(ratiope))^2)
(beta_1 = num/den)
## [1] -2.279808
print("Resultado en la pendiente idéntico al resultado del modelo")
## [1] "Resultado en la pendiente idéntico al resultado del modelo"
# Fórmula del intercepto
(beta_0 = mean(avg) - beta_1 * mean(ratiope))
## [1] 698.9329
print("Resultado en el intercepto idéntico al resultado del modelo")
## [1] "Resultado en el intercepto idéntico al resultado del modelo"
# Ajuste del modelo sin intercepto
modelo_si= lm(avg~ratiope + 0)
summary(modelo_si)
## 
## Call:
## lm(formula = avg ~ ratiope + 0)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -204.193  -38.908    4.705   49.045  215.696 
## 
## Coefficients:
##         Estimate Std. Error t value Pr(>|t|)    
## ratiope   32.980      0.172   191.8   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 69.54 on 419 degrees of freedom
## Multiple R-squared:  0.9887, Adjusted R-squared:  0.9887 
## F-statistic: 3.678e+04 on 1 and 419 DF,  p-value: < 2.2e-16
plot(ratiope, avg)
abline(a = 0, b = coef(modelo_si), col = "red", lwd = 2)

print("Se evidencia una clara diferencia en la estimación del modelo con y sin intercepto, tanto de magnitud como de dirección (la direccion del modelo sin intercepto se vuelve positiva)")
## [1] "Se evidencia una clara diferencia en la estimación del modelo con y sin intercepto, tanto de magnitud como de dirección (la direccion del modelo sin intercepto se vuelve positiva)"
print("La omisión del valor del intercepto cambia la interpretación de la estimación, y sobre todo del valor que toma el rendimiento promedio cuando la ratio de estudiantes a profesores es 0, pues al no haber intercepto este se define como un valor de 0, i.e. cuando el valor del ratio es nulo, se asigna igualmente un valor nulo al promedio de notas")
## [1] "La omisión del valor del intercepto cambia la interpretación de la estimación, y sobre todo del valor que toma el rendimiento promedio cuando la ratio de estudiantes a profesores es 0, pues al no haber intercepto este se define como un valor de 0, i.e. cuando el valor del ratio es nulo, se asigna igualmente un valor nulo al promedio de notas"
# Resultado de la pendiente en modelo sin intercepto con fórmula
(beta_1_si = (sum(ratiope*avg))/(sum((ratiope)^2)))
## [1] 32.98027
print("Resultado en la pendiente idéntico al resultado del modelo sin intercepto")
## [1] "Resultado en la pendiente idéntico al resultado del modelo sin intercepto"