4.2 Estimación de los Coeficientes del Modelo de Regresión Lineal
En la práctica, se desconocen la intersección \(\beta_0\) y la pendiente \(\beta_1\) de la línea de regresión poblacional. Por lo tanto, debemos emplear datos para estimar ambos parámetros desconocidos. A continuación, se utilizará un ejemplo del mundo real para demostrar cómo se logra esto. Queremos relacionar los resultados de las pruebas con la proporción de estudiantes y maestros medida en las escuelas californianas. El puntaje de la prueba es el promedio de todo el distrito de calificaciones de lectura y matemáticas para estudiantes de quinto grado. Una vez más, el tamaño de la clase se mide como el número de estudiantes dividido por el número de maestros (la proporción de estudiantes por maestro). En cuanto a los datos, el conjunto de datos escolares de California (CASchools) viene con un paquete R llamado AER, un acrónimo de Econometría Aplicada con R (Kleiber y Zeileis 2020). Después de instalar el paquete con install.paquetes («AER») y adjuntarlo con la biblioteca(AER) el conjunto de datos se puede cargar utilizando la función data ().
## # install the AER package (once)## install.packages("AER")## ## # load the AER packagelibrary(AER)# load the the data set in the workspacedata(CASchools)
Una vez que se ha instalado un paquete, está disponible para su uso en otras ocasiones cuando se invoca con library() — no es necesario ejecutar install.packages () de nuevo!
Es interesante saber con qué tipo de objeto estamos tratando.class () devuelve la clase de un objeto. Dependiendo de la clase de un objeto, algunas funciones (por ejemplo, plot () y summary ()) se comportan de manera diferente.
Comprobemos la clase del objeto CASchools.
class(CASchools)#> "data.frame"
Resulta que CASchools es de datos de clase.marco, que es un formato conveniente para trabajar, especialmente para realizar análisis de regresión.
Con la ayuda de head() obtenemos una primera visión general de nuestros datos. Esta función muestra solo las primeras 6 filas del conjunto de datos, lo que evita una salida de consola superpoblada.
head(CASchools)#> district school county grades students teachers#> 1 75119 Sunol Glen Unified Alameda KK-08 195 10.90#> 2 61499 Manzanita Elementary Butte KK-08 240 11.15#> 3 61549 Thermalito Union Elementary Butte KK-08 1550 82.90#> 4 61457 Golden Feather Union Elementary Butte KK-08 243 14.00#> 5 61523 Palermo Union Elementary Butte KK-08 1335 71.50#> 6 62042 Burrel Union Elementary Fresno KK-08 137 6.40#> calworks lunch computer expenditure income english read math#> 1 0.5102 2.0408 67 6384.911 22.690001 0.000000 691.6 690.0#> 2 15.4167 47.9167 101 5099.381 9.824000 4.583333 660.5 661.9#> 3 55.0323 76.3226 169 5501.955 8.978000 30.000002 636.3 650.9#> 4 36.4754 77.0492 85 7101.831 8.978000 0.000000 651.9 643.5#> 5 33.1086 78.4270 171 5235.988 9.080333 13.857677 641.8 639.9#> 6 12.3188 86.9565 25 5580.147 10.415000 12.408759 605.7 605.4
Encontramos que el conjunto de datos consta de muchas variables y que la mayoría de ellas son numéricas.
Por cierto: una alternativa a class() y head() es str () que se deduce de ‘structure’ y da una visión general completa del objeto. ¡Tratá!
Volviendo a las escuelas cas, las dos variables que nos interesan (p.ej., el puntaje promedio de la prueba y la proporción estudiante-maestro) no están incluidos. Sin embargo, es posible calcular ambos a partir de los datos proporcionados. Para obtener las proporciones estudiante-maestro, simplemente dividimos el número de estudiantes por el número de maestros. La puntuación media de la prueba es la media aritmética de la puntuación de la prueba de lectura y la puntuación de la prueba de matemáticas. El siguiente fragmento de código muestra cómo se pueden construir las dos variables como vectores y cómo se anexan a los CASchools.
# compute STR and append it to CASchoolsCASchools$STR <- CASchools$students/CASchools$teachers # compute TestScore and append it to CASchoolsCASchools$score <- (CASchools$read + CASchools$math)/2
Si corriéramos head(CASchools) de nuevo, encontraríamos las dos variables de interés como columnas adicionales llamadas STR y score (¡marque esto!).
La tabla 4.1 del libro de texto resume la distribución de los puntajes de las pruebas y la proporción de alumnos por maestro. Hay varias funciones que se pueden utilizar para producir resultados similares, p. ej.,
-
mean () (calcula la media aritmética de los números proporcionados),
-
sd () (calcula la desviación estándar de la muestra),
-
cuantil () (devuelve un vector de los cuantiles de muestra especificados para los datos).
El siguiente fragmento de código muestra cómo lograrlo. Primero, calculamos estadísticas de resumen en las columnas STR y score de CASchools. Con el fin de obtener una buena salida, recopilamos las medidas en un dato.marco llamado DistributionSummary.
# compute sample averages of STR and scoreavg_STR <- mean(CASchools$STR) avg_score <- mean(CASchools$score)# compute sample standard deviations of STR and scoresd_STR <- sd(CASchools$STR) sd_score <- sd(CASchools$score)# set up a vector of percentiles and compute the quantiles quantiles <- c(0.10, 0.25, 0.4, 0.5, 0.6, 0.75, 0.9)quant_STR <- quantile(CASchools$STR, quantiles)quant_score <- quantile(CASchools$score, quantiles)# gather everything in a data.frame DistributionSummary <- data.frame(Average = c(avg_STR, avg_score), StandardDeviation = c(sd_STR, sd_score), quantile = rbind(quant_STR, quant_score))# print the summary to the consoleDistributionSummary#> Average StandardDeviation quantile.10. quantile.25. quantile.40.#> quant_STR 19.64043 1.891812 17.3486 18.58236 19.26618#> quant_score 654.15655 19.053347 630.3950 640.05000 649.06999#> quantile.50. quantile.60. quantile.75. quantile.90.#> quant_STR 19.72321 20.0783 20.87181 21.86741#> quant_score 654.45000 659.4000 666.66249 678.85999
En cuanto a los datos de muestra, usamos plot(). Esto nos permite detectar características de nuestros datos, como valores atípicos que son más difíciles de descubrir al observar meros números. Esta vez añadimos algunos argumentos adicionales a la llamada de plot().
El primer argumento de nuestra llamada a plot(), score ~ STR, es de nuevo una fórmula que establece variables en los ejes y y x. Sin embargo, esta vez las dos variables no se guardan en vectores separados, sino que son columnas de CASchools. Por lo tanto, R no los encontraría sin especificar correctamente los datos del argumento. los datos deben estar de acuerdo con el nombre de los datos.marco al que pertenecen las variables, en este caso CASchools. Se utilizan argumentos adicionales para cambiar la apariencia de la gráfica: mientras main agrega un título, xlab e ylab agregan etiquetas personalizadas a ambos ejes.
plot(score ~ STR, data = CASchools, main = "Scatterplot of TestScore and STR", xlab = "STR (X)", ylab = "Test Score (Y)")
La gráfica (Figura 4.2 en el libro) muestra la gráfica de dispersión de todas las observaciones sobre la relación alumno-profesor y la puntuación de la prueba. Vemos que los puntos están fuertemente dispersos, y que las variables están correlacionadas negativamente. Es decir, esperamos observar puntajes más bajos en las clases más grandes.
La función cor () (ver ?cor para más información) se puede utilizar para calcular la correlación entre dos vectores numéricos.
cor(CASchools$STR, CASchools$score)#> -0.2263627
Como ya sugiere la gráfica de dispersión, la correlación es negativa, pero más bien débil.
La tarea a la que nos enfrentamos ahora es encontrar la línea que mejor se adapte a los datos. Por supuesto, podríamos simplemente seguir con la inspección gráfica y el análisis de correlación y luego seleccionar la mejor línea de ajuste con ojales. Sin embargo, esto sería bastante subjetivo: diferentes observadores dibujarían diferentes líneas de regresión. En este sentido, nos interesan las técnicas menos arbitrarias. Tal técnica se da por estimación de mínimos cuadrados ordinarios (OLS).
El Estimador de Mínimos Cuadrados Ordinarios
El estimador OLS elige los coeficientes de regresión de manera que la línea de regresión estimada sea lo más «cercana» posible a los puntos de datos observados. Aquí, la cercanía se mide por la suma de los errores al cuadrado cometidos al predecir \(Y\) dado \(X\). Sean \(b_0\) y \(b_1\) algunos estimadores de \(\beta_0\) y \(\beta_1\). Luego, la suma de errores de estimación al cuadrado se puede expresar como
\
El estimador OLS en el modelo de regresión simple es el par de estimadores para intersección y pendiente que minimiza la expresión anterior. La derivación de los estimadores OLS para ambos parámetros se presenta en el apéndice 4.1 del libro. Los resultados se resumen en el Concepto clave 4.2.
El Estimador OLS, los Valores Predichos y los Residuos
Los estimadores OLS de la pendiente \(\beta_1\) y la intersección \(\beta_0\) en el modelo de regresión lineal simple son\Los valores predichos OLS \(\widehat{Y}_i\) y los residuos \(\hat{u}_i\) son\
La intersección estimada \(\hat{\beta}_0\), el parámetro de pendiente \(\hat{\beta}_1\) y los residuos \(\left(\hat{u}_i\right)\) se calculan a partir de una muestra de \(n\) observaciones de \(X_i\) y \(Y_i\), \(i\), \(…\), \(y\). Estas son estimaciones de la intersección de población desconocida \(\left (\beta_0 \ right)\), la pendiente \(\left(\beta_1\right)\) y el término de error \((u_i)\).
Las fórmulas presentadas anteriormente pueden no ser muy intuitivas a primera vista. La siguiente aplicación interactiva tiene como objetivo ayudarlo a comprender la mecánica de OLS. Puede agregar observaciones haciendo clic en el sistema de coordenadas donde los datos están representados por puntos. Una vez disponibles dos o más observaciones, la aplicación calcula una línea de regresión utilizando OLS y algunas estadísticas que se muestran en el panel derecho. Los resultados se actualizan a medida que agrega más observaciones al panel izquierdo. Un doble clic restablece la aplicación, es decir, se eliminan todos los datos.
Hay muchas formas posibles de calcular \(\hat{\beta}_0\) y \(\hat{\beta}_1\) en R. Por ejemplo, podríamos implementar las fórmulas presentadas en Key Concept 4.2 con dos de las funciones más básicas de R: mean() y sum(). Antes de hacerlo, adjuntamos el conjunto de datos CASchools.
attach(CASchools) # allows to use the variables contained in CASchools directly# compute beta_1_hatbeta_1 <- sum((STR - mean(STR)) * (score - mean(score))) / sum((STR - mean(STR))^2)# compute beta_0_hatbeta_0 <- mean(score) - beta_1 * mean(STR)# print the results to the consolebeta_1#> -2.279808beta_0#> 698.9329
Llamar a attach (CASchools) nos permite dirigir una variable contenida en CASchools por su nombre: ya no es necesario utilizar el operador $ junto con el conjunto de datos: R puede evaluar el nombre de la variable directamente.
R utiliza el objeto en el entorno de usuario si este objeto comparte el nombre de la variable contenida en una base de datos adjunta. Sin embargo, es una mejor práctica usar siempre nombres distintivos para evitar tales (aparentemente) ambivalencias.
Tenga en cuenta que nos dirigimos a las variables contenidas en el conjunto de datos adjunto CASchools directamente para el resto de este capítulo.
Por supuesto, hay aún más formas manuales de realizar estas tareas. Como OLS es una de las técnicas de estimación más utilizadas, R, por supuesto, ya contiene una función incorporada llamada lm () (modelo lineal) que se puede usar para llevar a cabo análisis de regresión.
El primer argumento de la función a especificar es, similar a plot (), la fórmula de regresión con la sintaxis básica y ~ x donde y es la variable dependiente y x la variable explicativa. El argumento datos determina el conjunto de datos que se utilizará en la regresión. Ahora revisamos el ejemplo del libro donde se analiza la relación entre los resultados de las pruebas y el tamaño de las clases. El siguiente código utiliza lm () para replicar los resultados presentados en la figura 4.3 del libro.
# estimate the model and assign the result to linear_modellinear_model <- lm(score ~ STR, data = CASchools)# print the standard output of the estimated lm object to the console linear_model#> #> Call:#> lm(formula = score ~ STR, data = CASchools)#> #> Coefficients:#> (Intercept) STR #> 698.93 -2.28
Agreguemos la línea de regresión estimada a la gráfica. Esta vez también ampliamos los rangos de ambos ejes estableciendo los argumentos xlim e ylim.
# plot the dataplot(score ~ STR, data = CASchools, main = "Scatterplot of TestScore and STR", xlab = "STR (X)", ylab = "Test Score (Y)", xlim = c(10, 30), ylim = c(600, 720))# add the regression lineabline(linear_model)
¿Notaste que esta vez, no pasamos los parámetros de intercepción y pendiente a abline? Si llamas a abline() en un objeto de clase lm que solo contiene un único regresor, ¡R dibuja la línea de regresión automáticamente!