Sesión 11 (B) — Regresión simple con datos reales: ajuste y bondad de ajuste en hprice2
Índice
- Descripción de la práctica
- Actividad 1 - Reapertura de hprice2 y etiquetas
- Actividad 2 - Regresión: price sobre rooms
- Actividad 3 - Regresión: price sobre nox
- Actividad 4 - Verificación de las dos condiciones de ortogonalidad
- Actividad 5 - Bondad de ajuste: STC, SEC, SRC y \(R^2\) en ambos modelos
- Actividad 6 - Diagramas de dispersión con la recta ajustada
- Actividad 7 - Intercambiar los papeles: el \(R^2\) no distingue causa de efecto
- Actividad 8 - Síntesis comparativa
- Preguntas de interpretación para la clase
- Código completo de la práctica
- Respuestas
Descripción de la práctica
Retomamos hprice2 (ya usado en las prácticas de correlación) y sus tres variables etiquetadas: price, rooms, nox. Hoy estimamos, por primera vez con datos reales, dos regresiones lineales simples: precio en función del número de habitaciones, y precio en función de la contaminación. Las comparamos entre sí, verificamos las dos condiciones de ortogonalidad y calculamos la bondad de ajuste, conectando con las correlaciones ya calculadas en la práctica de correlación (lección 5) y con el ángulo \(\theta\) de la lección 8.
Objetivo
- Estimar dos regresiones lineales simples con datos reales, interpretando el signo y la magnitud de la pendiente sin lenguaje causal.
- Verificar, con datos reales, las dos condiciones de ortogonalidad de la lección 7.
- Calcular \(R^2\) ``a mano'' (STC/SEC/SRC) y compararlo con el que reporta Gretl y con \(\rho_{\boldsymbol{x}\boldsymbol{y}}^2\).
- Comparar la bondad de ajuste de los dos modelos y relacionarla con el ángulo \(\theta\) de la lección 8.
- Visualizar ambos ajustes mediante diagramas de dispersión con la recta ajustada.
- Intercambiar los papeles de las dos variables y comprobar que el \(R^2\) no cambia —la advertencia de la lección 8—, aunque la recta sí.
Actividad 1 - Reapertura de hprice2 y etiquetas
en línea de comandos:
open hprice2.gdt --quiet setinfo price -d "Precio mediano de la vivienda ($)" -n "Precio ($)" setinfo rooms -d "Número medio de habitaciones" -n "Habitaciones" setinfo nox -d "Concentración de óxidos de nitrógeno" -n "Contaminación (NOx)"
Actividad 2 - Regresión: price sobre rooms
en línea de comandos:
ols price const rooms
- GUI equivalente:
Modelo -> Mínimos cuadrados ordinarios, conpricecomo dependiente yconst,roomscomo regresores.
Modelo 1: MCO, usando las observaciones 1-506
Variable dependiente: price
coeficiente Desv. típica Estadístico t valor p
----------------------------------------------------------------
const -34796,2 2651,53 -13,12 4,74e-34 ***
rooms 9119,55 419,339 21,75 1,87e-74 ***
Media de la vble. dep. 22511,51 D.T. de la vble. dep. 9208,856
Suma de cuad. residuos 2,21e+10 D.T. de la regresión 6620,865
R-cuadrado 0,484110 R-cuadrado corregido 0,483086
F(1, 504) 472,9521 Valor p (de F) 1,87e-74
Log-verosimilitud -5168,759 Criterio de Akaike 10341,52
Criterio de Schwarz 10349,97 Crit. de Hannan-Quinn 10344,83
Lo que debe observar
La pendiente es \(9\,119{,}55\): en el ajuste, a una habitación más le corresponden unos \(9\,120\) dólares más de precio mediano. La constante, \(-34\,796\), no tiene lectura por sí sola (sería el precio de una vivienda con cero habitaciones, fuera del rango de los datos). Y \(R^2=0{,}484\): el ajuste explica algo menos de la mitad de la variación de price. Como en la práctica anterior, ignore de momento las columnas Desv. típica, Estadístico t y valor p.
Interpretación (con cuidado): el coeficiente de rooms se lee como ``por cada habitación adicional, el precio mediano cambia, en promedio, en esa cantidad de dólares, manteniendo el resto igual (aquí, sin ningún otro regresor)''. Evite decir que ``una habitación adicional causa'' ese cambio: como se discutió en la lección 8, la descomposición \(\mathrm{STC}=\mathrm{SEC}+\mathrm{SRC}\) es puramente algebraica y no certifica, por sí sola, ninguna relación causal ni su dirección.
Actividad 3 - Regresión: price sobre nox
en línea de comandos:
ols price const nox
Antes de mirar el resultado: ¿qué signo espera para el coeficiente de nox? Contraste su expectativa con lo obtenido.
Modelo 2: MCO, usando las observaciones 1-506
Variable dependiente: price
coeficiente Desv. típica Estadístico t valor p
----------------------------------------------------------------
const 41307,8 1816,18 22,74 2,53e-79 ***
nox -3386,85 320,362 -10,57 9,93e-24 ***
Media de la vble. dep. 22511,51 D.T. de la vble. dep. 9208,856
Suma de cuad. residuos 3,51e+10 D.T. de la regresión 8339,566
R-cuadrado 0,181508 R-cuadrado corregido 0,179884
F(1, 504) 111,7662 Valor p (de F) 9,93e-24
Log-verosimilitud -5285,537 Criterio de Akaike 10575,07
Criterio de Schwarz 10583,53 Crit. de Hannan-Quinn 10578,39
Lo que debe observar
La pendiente es negativa, \(-3\,386{,}85\): a una unidad más de contaminación le corresponden unos \(3\,400\) dólares menos de precio mediano, como cabía esperar. El \(R^2\), \(0{,}182\), es bastante menor que el de rooms: la contaminación, por sí sola, explica menos de una quinta parte de la variación de los precios. Compare ambos \(R^2\) con las correlaciones de la práctica de correlación: \(0{,}6958^2=0{,}484\) y \((-0{,}4260)^2=0{,}182\).
Actividad 4 - Verificación de las dos condiciones de ortogonalidad
Repetimos ambas regresiones, guardando en cada caso los residuos, para verificar \(\sum\hat e_i=0\) y \(\sum x_i\hat e_i=0\).
en línea de comandos:
ols price const rooms --quiet series ehat_rooms = $uhat scalar sum_e_rooms = sum(ehat_rooms) scalar sum_xe_rooms = sum(rooms*ehat_rooms) ols price const nox --quiet series ehat_nox = $uhat scalar sum_e_nox = sum(ehat_nox) scalar sum_xe_nox = sum(nox*ehat_nox) printf "Modelo price~rooms: suma(ehat) = %.8f suma(rooms*ehat) = %.8f\n", sum_e_rooms, sum_xe_rooms printf "Modelo price~nox : suma(ehat) = %.8f suma(nox*ehat) = %.8f\n", sum_e_nox, sum_xe_nox
Modelo price~rooms: suma(ehat) = -0,00000001 suma(rooms*ehat) = -0,00000019 Modelo price~nox : suma(ehat) = -0,00000001 suma(nox*ehat) = 0,00000005
(Los valores no serán cero por errores de redondeo en coma flotante, pero deben ser insignificantes.)
Actividad 5 - Bondad de ajuste: STC, SEC, SRC y \(R^2\) en ambos modelos
en línea de comandos:
ols price const rooms --quiet scalar mu_price = mean(price) scalar STC_r = sum((price-mu_price)^2) scalar SRC_r = sum($uhat^2) scalar SEC_r = STC_r - SRC_r scalar R2_r_manual = SEC_r/STC_r ols price const nox --quiet scalar STC_n = sum((price-mu_price)^2) scalar SRC_n = sum($uhat^2) scalar SEC_n = STC_n - SRC_n scalar R2_n_manual = SEC_n/STC_n printf "price~rooms: STC=%.2f SEC=%.2f SRC=%.2f R2(a mano)=%.4f\n", STC_r, SEC_r, SRC_r, R2_r_manual printf "price~nox : STC=%.2f SEC=%.2f SRC=%.2f R2(a mano)=%.4f\n", STC_n, SEC_n, SRC_n, R2_n_manual printf "\nComparacion con rho^2 (recuerde: en regresion simple R2 = rho_xy^2):\n" printf "corr(price,rooms)^2 = %.4f\n", corr(price,rooms)^2 printf "corr(price,nox)^2 = %.4f\n", corr(price,nox)^2
price~rooms: STC=42825531146,45 SEC=20732259424,69 SRC=22093271721,76 R2(a mano)=0,4841 price~nox : STC=42825531146,45 SEC=7773157316,47 SRC=35052373829,98 R2(a mano)=0,1815 Comparacion con rho^2 (recuerde: en regresion simple R2 = rho_xy^2): corr(price,rooms)^2 = 0,4841 corr(price,nox)^2 = 0,1815
El ángulo \(\theta\), en grados
El \(R^2\) que acabamos de calcular es un coseno al cuadrado (lección 8). Nada nos impide, por tanto, deshacer el coseno y ver de cuántos grados estamos hablando:
en línea de comandos:
printf "price~rooms: R2 = %.4f -> theta = %.2f grados\n", R2_r_manual, acos(sqrt(R2_r_manual))*180/$pi printf "price~nox : R2 = %.4f -> theta = %.2f grados\n", R2_n_manual, acos(sqrt(R2_n_manual))*180/$pi
price~rooms: R2 = 0,4841 -> theta = 45,91 grados price~nox : R2 = 0,1815 -> theta = 64,78 grados
Son los ángulos que forman, en \(\mathbb{R}^{506}\), el vector de datos en desviaciones y el del ajuste. Un \(R^2\) que parece modesto corresponde a un ángulo bastante abierto: conviene tener presente esta equivalencia al leer un \(R^2\), porque los dos números dicen lo mismo con escalas muy distintas.
Actividad 6 - Diagramas de dispersión con la recta ajustada
GUI: seleccione
priceyrooms(conCtrl), botón derecho,Gráfico X-Y; repita conpriceynox.o bien teclee en línea de comandos:
gnuplot price rooms gnuplot price nox
Compare cómo de ``ceñidos'' están los puntos que rodean cada recta con el \(R^2\) obtenido en la Actividad 5. Recuerde (lección 8) que \(R^2=\cos^2\theta\), con \(\theta\) el ángulo entre los vectores en desviaciones de los datos y del ajuste: cuanto más ceñida la nube a la recta, más pequeño ese ángulo.
Actividad 7 - Intercambiar los papeles: el \(R^2\) no distingue causa de efecto
La lección 8 advirtió que, si regresamos la superficie sobre el precio en lugar del precio sobre la superficie, el \(R^2\) no cambia. Comprobémoslo con price y rooms: estimamos las dos regresiones, la habitual y la ``del revés''.
en línea de comandos:
ols price const rooms --quiet scalar b_pr = $coeff(rooms) scalar r2_pr = $rsq ols rooms const price --quiet # los papeles, intercambiados scalar b_rp = $coeff(price) scalar r2_rp = $rsq printf "R2 de price~rooms = %.6f R2 de rooms~price = %.6f\n", r2_pr, r2_rp printf "pendiente de price~rooms = %.4f pendiente de rooms~price = %.8f\n", b_pr, b_rp printf "inversa de la primera pendiente = %.8f (no es la segunda)\n", 1/b_pr printf "producto de las dos pendientes = %.6f (= R2 = rho^2)\n", b_pr*b_rp
R2 de price~rooms = 0,484110 R2 de rooms~price = 0,484110 pendiente de price~rooms = 9119,5484 pendiente de rooms~price = 0,00005308 inversa de la primera pendiente = 0,00010965 (no es la segunda) producto de las dos pendientes = 0,484110 (= R2 = rho^2)
Lo que debe observar
Los dos \(R^2\) son el mismo número: en regresión simple \(R^2=\rho_{\boldsymbol x\boldsymbol y}^2\), y la correlación no sabe cuál variable hace de \(x\) y cuál de \(y\). El ajuste, en cambio, sí cambia: la pendiente de rooms~price no es la inversa de la de price~rooms (las dos rectas son distintas; solo coinciden si \(\rho=\pm1\)). El producto de las dos pendientes es \(\frac{\sigma_{\boldsymbol x\boldsymbol y}}{\sigma_{\boldsymbol x}^2}\cdot\frac{\sigma_{\boldsymbol x\boldsymbol y}}{\sigma_{\boldsymbol y}^2}=\rho_{\boldsymbol x\boldsymbol y}^2\), que es otra vez el \(R^2\). La moraleja es la de la lección 8: el \(R^2\) mide cuánto se alinean dos vectores en desviaciones, y esa alineación es simétrica; de ella no se sigue ninguna dirección causal.
Actividad 8 - Síntesis comparativa
| Modelo | \(\hat\beta_1\) | \(\hat\beta_2\) | \(R^2\) |
|---|---|---|---|
| price~rooms | |||
| price~nox |
Complete la tabla con los valores obtenidos. ¿Cuál de los dos modelos ajusta mejor, según \(R^2\)? ¿Es coherente con lo observado en los diagramas de dispersión y con las correlaciones ya calculadas en la práctica de correlación (lección 5)?
Preguntas de interpretación para la clase
- ¿Por qué no podemos afirmar, a partir del modelo price~rooms, que ``añadir una habitación causa'' un aumento de precio?
- Compare los dos modelos: ¿cuál tiene mayor \(R^2\)? ¿Qué relación tiene esto con los valores de correlación ya calculados en la práctica de correlación?
- En los diagramas de dispersión con la recta ajustada, ¿qué modelo muestra una nube de puntos más ``pegada'' a la recta? ¿Cómo se traduce esto en términos del ángulo \(\theta\) de la lección 8?
- ¿Por qué la suma de los residuos no es cero en la salida de Gretl, sino un número muy pequeño (del orden de \(10^{-8}\) o menor)?
- Si estimáramos
priceen función deroomsynoxsimultáneamente (dos regresores a la vez), ¿por qué NO cabría esperar que el \(R^2\) de ese modelo fuera simplemente la suma de los \(R^2\) de los dos modelos simples de hoy? - En la Actividad 7 las dos regresiones tienen el mismo \(R^2\) pero distinta recta. ¿Por qué las dos pendientes no son inversas una de otra? ¿Cuándo lo serían?
Para profundizar:
Código completo de la práctica
| Enlace al guión: | S11-Prct-B-hprice2-ajuste.inp |
Respuestas
- ¿Por qué no podemos afirmar causalidad a partir de price~rooms? Porque la descomposición \(\mathrm{STC}=\mathrm{SEC}+\mathrm{SRC}\) y el propio ajuste MCO son consecuencias puramente geométricas de la ortogonalidad del residuo: se cumplen igual para cualquier par de vectores \(\boldsymbol{x},\boldsymbol{y}\), tengan o no una relación causal real entre sí (recuerde, de la lección 8, el ejemplo del queso y las muertes por enredarse en sábanas). Afirmar causalidad exige una teoría económica previa que justifique la dirección de la relación, algo que la sola regresión no proporciona.
- Comparación de \(R^2\) entre los dos modelos. El modelo con mayor \(|\rho_{\boldsymbol{x}\boldsymbol{y}}|\) (en valor absoluto) entre la variable y el regresor tendrá, necesariamente, mayor \(R^2\), porque en regresión simple \(R^2=\rho_{\boldsymbol{x}\boldsymbol{y}}^2\) exactamente (lección 8). Por tanto, el orden de los \(R^2\) de hoy debe coincidir con el orden, en valor absoluto, de las correlaciones \(\rho_{\text{price,rooms}}\) y \(\rho_{\text{price,nox}}\) ya calculadas en la práctica de correlación.
- Nube más pegada a la recta y ángulo \(\theta\). El modelo con mayor \(R^2\) es el que tiene la nube de puntos más ceñida a la recta ajustada, porque \(R^2=\cos^2\theta\): cuanto menor el ángulo \(\theta\) entre los vectores en desviaciones de los datos y del ajuste, más cerca de 1 está \(\cos^2\theta\), y más ``alineados'' (en el sentido geométrico de la lección 8) están esos dos vectores —lo que visualmente se traduce en una nube más estrecha alrededor de la recta.
- Suma de residuos no cero. Por errores de redondeo en aritmética de coma flotante: los ordenadores no representan los números reales con precisión infinita, así que operaciones que algebraicamente deberían dar cero (como \(\sum\hat e_i\)) arrastran un pequeñísimo error de cálculo, típicamente del orden de \(10^{-8}\) o menor. Esto no contradice la identidad teórica \(\sum\hat e_i=0\): es la misma situación que ya se comprobó en la práctica de verificación geométrica (con datos simulados).
- \(R^2\) de un modelo con dos regresores no es la suma de los \(R^2\) simples. Porque, como se explicó al cierre de la lección 8, cuando hay más de un regresor no constante el subespacio \(\mathcal{L}(\boldsymbol{1},\boldsymbol{x}_2,\boldsymbol{x}_3)\) centrado tiene dimensión 2, no 1: los vectores en desviaciones de
roomsynoxya no están alineados en la misma recta, así que el ajuste conjunto \(\boldsymbol{\mathop{\widehat{y}}}-\boldsymbol{\mathop{\overline{y}}}\) ya no es, en general, la suma de las contribuciones ``aisladas'' de cada regresor. Además,roomsynoxpueden estar correlacionadas entre sí, de modo que parte de lo que ``explica'' cada una por separado se solapa. Este fenómeno se estudiará con detalle en la regresión múltiple, más adelante en el curso. - Dos rectas, un \(R^2\). La pendiente de
price~roomses \(\sigma_{\boldsymbol x\boldsymbol y}/\sigma_{\boldsymbol x}^2\) y la derooms~pricees \(\sigma_{\boldsymbol x\boldsymbol y}/\sigma_{\boldsymbol y}^2\): cada una proyecta un vector distinto sobre un plano distinto, y no hay razón para que una sea la inversa de la otra. Su producto vale \(\rho_{\boldsymbol x\boldsymbol y}^2\), así que solo serían inversas (\(b_{pr}\,b_{rp}=1\)) si \(\rho=\pm1\), es decir, si los puntos estuvieran exactamente sobre una recta. Como el \(R^2\) es \(\rho^2\), no cambia al intercambiar los papeles; la recta sí, porque minimiza distancias verticales, y ``vertical'' depende de qué variable pongamos en el eje de ordenadas.