Heterocedasticidad
10.6.1 🎯 Objetivo del capítulo {-}
Presentar qué es la heterocedasticidad, por qué importa, cómo detectarla (gráficos y contrastes formales) y cómo corregirla (GLS/WLS/MCF y errores estándar robustos), con ejemplos en Stata, R y Python.
TL;DR
- Homocedasticidad: \(\mathbb{V}(\varepsilon_i\mid X)=\sigma^2\) constante.
- Heterocedasticidad: \(\mathbb{V}(\varepsilon_i\mid X)=\sigma_i^2\) varía entre observaciones.
- MCO sigue siendo insesgado y consistente, pero no es eficiente y la varianza clásica es incorrecta \(\Rightarrow\) pruebas t/F inválidas.
- Detección: residuos vs. ajustados, White, Breusch–Pagan/Cook–Weisberg, Goldfeld–Quandt.
- Correcciones: GLS/WLS/MCF (si conocemos/modelamos \(\Omega\)), o errores estándar robustos (White/Huber) si no.
10.7 1. Introducción {-}
El supuesto clásico de homocedasticidad establece que todos los errores del modelo lineal tienen varianza constante: \[ \mathbb{V}(\varepsilon_i\mid X)=\sigma^2,\qquad i=1,\dots,n. \]
Cuando este supuesto falla, hablamos de heterocedasticidad. En ese caso:
- \(\hat\beta_{\text{MCO}}\) sigue siendo insesgada y consistente.
- \(\hat\beta_{\text{MCO}}\) no es eficiente (no es MELI/BLUE).
- La varianza clásica \(\widehat{\mathbb{V}}(\hat\beta)=\hat\sigma^2 (X'X)^{-1}\) es incorrecta \(\Rightarrow\) t y F clásicos no son válidos.
10.7.1 📐 Intuición geométrica {-}
En un gráfico de residuos \(\hat\varepsilon_i\) vs. valores ajustados \(\hat y_i\), la heterocedasticidad suele verse como un abanico (la dispersión crece o decrece con \(\hat y\)) o como bandas donde la variabilidad cambia con alguna covariable (por ejemplo, con el ingreso).
2. Ejemplos motivadores
Ejemplo 1: Consumo e ingreso.
\(y_i\) = consumo del hogar \(i\), \(X_i\) = ingreso. Hogares de bajos ingresos consumen casi todo (poca variación); hogares de altos ingresos difieren mucho en consumo (mucha variación).
\[
y_i=\beta_1+\beta_2 X_i+\varepsilon_i,\quad \mathbb{V}(\varepsilon_i\mid X)=\sigma^2(X_i)\ \text{creciente en }X_i.
\]
Ejemplo 2: Datos per cápita.
Si agregamos \(n_i\) unidades y promediamos: \(\bar y_i=\tfrac{1}{n_i}\sum_{j=1}^{n_i}y_{ij}\), entonces
\[
\mathbb{V}(\bar\varepsilon_i)=\frac{\sigma^2}{n_i}.
\]
La varianza depende de \(n_i\) \(\Rightarrow\) heterocedasticidad “por construcción”.
3. Heterocedasticidad pura vs. impura
3.1 Pura
La varianza realmente cambia por unidad: \[ \mathbb{E}(\varepsilon_i^2)=\sigma_i^2,\qquad \mathbb{V}(\varepsilon)=\Omega=\mathrm{diag}(\sigma_1^2,\ldots,\sigma_n^2). \]
3.2 Impura
Aparece por omisión de variables u otros errores de especificación. Si el verdadero modelo es \[ y_i=\beta_1+\beta_2 X_{2i}+\beta_3 X_{3i}+\varepsilon_i,\quad \varepsilon_i\sim (0,\sigma^2), \] y estimamos \(y_i=\beta_1+\beta_2 X_{2i}+u_i\), entonces \(u_i=\beta_3 X_{3i}+\varepsilon_i\) y \[ \mathbb{V}(u_i)=\beta_3^2\,\mathbb{V}(X_{3i})+\sigma^2, \] que suele variar con \(X_{3i}\) \(\Rightarrow\) heterocedasticidad “impura”.
10.8 4. Consecuencias teóricas {-}
Theorem 10.2 Teorema (Varianza de MCO con heterocedasticidad).
Sea \(y=X\beta+\varepsilon\) con \(\mathbb{E}(\varepsilon\mid X)=0\) y \(\mathbb{V}(\varepsilon\mid X)=\Omega\) (simétrica, definida positiva). Entonces
\[
\mathbb{V}(\hat\beta_{\text{MCO}}\mid X)=(X'X)^{-1}X'\,\Omega\,X\,(X'X)^{-1}.
\]
La estimación clásica \(\hat\sigma^2(X'X)^{-1}\) es inconsistente salvo que \(\Omega=\sigma^2 I\).
Proof. Demostración (borrador).
\(\hat\beta=(X'X)^{-1}X'y=\beta+(X'X)^{-1}X'\varepsilon\).
Dado \(X\), \(\mathbb{E}(\hat\beta)=\beta\) y
\[
\mathbb{V}(\hat\beta\mid X)=(X'X)^{-1}X'\,\mathbb{V}(\varepsilon\mid X)\,X\,(X'X)^{-1}=(X'X)^{-1}X'\,\Omega\,X\,(X'X)^{-1}.
\]
Si \(\Omega\neq \sigma^2 I\), reemplazarla por \(\hat\sigma^2 I\) no converge al valor verdadero. \(\square\)
Asintótica “sándwich”. Si \(n^{-1}X'X\to_p Q\succ 0\) y \(n^{-1}X'\Omega X\to_p S\), entonces \[ \sqrt{n}(\hat\beta-\beta)\ \overset{d}{\longrightarrow}\ \mathcal{N}\!\left(0,\ Q^{-1}SQ^{-1}\right). \] Un estimador consistente de \(Q^{-1}SQ^{-1}\) es la familia HC: \[ \widehat{\mathbb{V}}_{HC0}(\hat\beta)=(X'X)^{-1}\Big(\sum_{i=1}^n x_i x_i' \hat\varepsilon_i^{2}\Big)(X'X)^{-1}. \] Variantes: HC1 (factor \(n/(n-k)\)), HC2 (divide por \(1-h_{ii}\)), HC3 (divide por \((1-h_{ii})^2\)).
10.9 5. Detección de heterocedasticidad {-}
10.9.1 5.1 Diagnóstico visual {-}
# R: residuo vs ajustado
m <- lm(y ~ x1 + x2 + I(x2^2), data = datos)
plot(fitted(m), resid(m), xlab = "Ajustados", ylab = "Residuos")
abline(h = 0, lty = 2)5.2 Contraste de White (1980)
Hipótesis [ H_0: (_i2)=2 H_1: (_i^2)=_i^2.]
Procedimiento (idea): Regrésese (^2) sobre regresores, sus cuadrados y cruces; compute (W=nR22) (asintótico).
Stata
R
# Aproximación a White vía bptest con ajustados y su cuadrado
library(lmtest)
m <- lm(y ~ x1 + x2, data = datos)
bptest(m, ~ fitted(m) + I(fitted(m)^2))Python
from statsmodels.stats.diagnostic import het_white
white = het_white(m.resid, m.model.exog) # (LM, pLM, F, pF)Pro/Con: No requiere saber qué variable genera la hetero; puede ser pesado en muestras pequeñas.
5.3 Breusch–Pagan / Cook–Weisberg
Asume ((_i)=^2 h(z_i)) lineal en (z).
Stata
reg y x1 x2
hettest // por defecto contra ajustados (Cook–Weisberg)
hettest x1 x2, iid // BP clásico con z = (x1, x2)R
Python
5.4 Goldfeld–Quandt
Útil si sospechas que la varianza crece con una covariable (Z). Ordena por (Z), parte la muestra, omite el tercio central y compara varianzas (estadístico F).
Stata
* Implementación manual si no cuentas con gqtest user-written
sort Z
* (particionar, omitir tercio central, estimar en extremos y comparar RSS/df)R
6. Soluciones
10.9.2 6.1 GLS (Mínimos Cuadrados Generalizados) {-}
Si conoces (), [ _{GLS}=(X’{-1}X){-1}X’^{-1}y,] es eficiente. Poco usual en práctica porque () rara vez es conocida.
10.9.3 6.2 WLS (Mínimos Cuadrados Ponderados) {-}
Si ((_i)=_i^2) y conoces/estimas (_i^2), pondera por (w_i=1/_i^2): [ {}{i=1}^n w_i (y_i-x_i’)^2.]
Stata
R
Python
6.3 FGLS/MCF (GLS factible)
Modela (_i^2) con una regresión auxiliar sobre (z_i), extrae (_i^2) y aplica WLS. Consistente y asintóticamente eficiente si modelas bien (). Requiere muestras moderadas/grandes.
Stata (esqueleto)
10.9.4 6.4 Errores estándar robustos (White/Huber) {-}
Mantiene (_{}), pero corrige la matriz de varianzas: [ *{HC}()=(X’X){-1}(n x_i x_i’ _i2)(X’X){-1}.]
Stata
R
library(sandwich); library(lmtest)
m <- lm(y ~ x1 + x2, data = datos)
coeftest(m, vcov = vcovHC(m, type = "HC1"))Python
Cuándo usar qué:
- Si conoces/puedes modelar bien () () WLS/FGLS.
- Si no, y solo quieres inferencia válida () robustos HC (opción por defecto).
10.10 7. Ejemplo reproducible (simulación) {-}
Stata
clear all
set seed 123
set obs 200
gen x = rnormal()
gen u = rnormal() * abs(x) // varianza crece con |x|
gen y = 1 + 2*x + u
reg y x
hettest
reg y x, robust
* FGLS simple
predict e, resid
gen e2 = e^2
reg e2 x
predict s2, xb
replace s2 = exp(s2) // asegura positividad si modelaste en log
reg y x [aw = 1/s2]R
set.seed(123)
n <- 200
x <- rnorm(n)
u <- rnorm(n) * abs(x)
y <- 1 + 2*x + u
datos <- data.frame(y, x)
m <- lm(y ~ x, datos)
library(lmtest); library(sandwich)
bptest(m)
coeftest(m, vcov = vcovHC(m, type = "HC1"))
# FGLS básico
ehat2 <- resid(m)^2
m_aux <- lm(log(ehat2 + 1e-6) ~ x, datos) # en log para positividad
s2hat <- exp(fitted(m_aux))
m_wls <- lm(y ~ x, datos, weights = 1/s2hat)
summary(m); summary(m_wls)Python (statsmodels)
import numpy as np, pandas as pd, statsmodels.api as sm
from statsmodels.stats.diagnostic import het_breuschpagan
np.random.seed(123)
n = 200
x = np.random.normal(size=n)
u = np.random.normal(size=n) * np.abs(x)
y = 1 + 2*x + u
df = pd.DataFrame({'y': y, 'x': x})
X = sm.add_constant(df['x'])
ols = sm.OLS(df['y'], X).fit()
print(het_breuschpagan(ols.resid, ols.model.exog))
print(ols.get_robustcov_results(cov_type='HC1').summary())
# FGLS
eh2 = ols.resid**2
aux = sm.OLS(np.log(eh2 + 1e-6), X).fit()
s2hat = np.exp(aux.fittedvalues)
wls = sm.WLS(df['y'], X, weights = 1/s2hat).fit()
print(wls.summary())10.11 8. Visualizaciones (diagnóstico) {-}
# Residuo vs Ajustados y vs x
par(mfrow = c(1,2))
plot(fitted(m), resid(m), xlab = "Ajustados", ylab = "Residuos"); abline(h = 0, lty = 2)
plot(x, resid(m), xlab = "x", ylab = "Residuos"); abline(h = 0, lty = 2)9. Tabla resumen de contrastes
Tabla 1. Resumen de pruebas de heterocedasticidad
| Prueba | Supuesto clave | Idea | Pros | Contras |
|---|---|---|---|---|
| White | Ninguno específico | Aux con términos cuadráticos y cruces | Muy general | Puede ser pesado en (n) pequeño |
| Breusch–Pagan | Varianza lineal en (z) | LM sobre (^2) vs (z) | Simple, parametrizable | Sensible a mala especificación |
| Cook–Weisberg | Especial de BP con (y) | Usa ajustados como (z) | Muy usado por defecto | Depende de (y) |
| Goldfeld–Quandt | 1 variable responsable | Comparar varianzas por tramos ordenados | Intuitivo si 1 driver claro | Menos general |
Nota: Con no normalidad, prefiera versiones robustas (p. ej., Koenker para BP) o diagnóstico visual + HC.
10. Conclusiones clave
- La heterocedasticidad no sesga MCO, pero rompe la inferencia clásica.
- Diagnosticar: siempre mire gráficos y use BP/White.
- Corregir: si puede modelar () () FGLS/WLS; si no () errores robustos.
- En aplicaciones empíricas, reportar siempre robustos (HC) es buena práctica mínima.
10.12 11. Taller práctico (hands-on) {-}
Simule y compare (entregable corto):
- Simule (y=1+2x+u) con ((ux)=x^2).
- Estime MCO clásico y reporte t.
- Repita con robustos HC y con WLS usando (w_i=1/x_i^2).
- Compare magnitud de (), EE y p-valores.
- Comente cuál estrategia usaría y por qué.
Entregue código en Stata o R o Python + 1 gráfico residuos vs ajustados.
10.13 12. Apéndice: comandos rápidos por software {-}
Stata
reg y x1 x2, robust // EE robustos
hettest x1 x2, iid // BP
imtest, white // White general
reg y x1 x2 [aw = w] // WLS con pesos wR
m <- lm(y ~ x1 + x2, data = datos)
library(lmtest); library(sandwich)
coeftest(m, vcov = vcovHC(m, "HC1"))
bptest(m); bptest(m, ~ x1 + x2)
lm(y ~ x1 + x2, weights = w, data = datos) # WLSPython
m = sm.OLS(y, X).fit()
m.get_robustcov_results(cov_type='HC1')
het_breuschpagan(m.resid, m.model.exog)
sm.WLS(y, X, weights = w).fit()📘 Preguntas de repaso
- Defina heterocedasticidad y explique por qué invalida las pruebas t y F clásicas.
- Muestre (pasos clave) que \(\mathbb{V}(\hat{\beta}\mid X)=(X'X)^{-1}X'\Omega X (X'X)^{-1}\) bajo heterocedasticidad.
- Compare White y Breusch–Pagan: ¿cuándo preferir uno u otro? ¿Qué significa “prueba constructiva”?
- Plantee un caso aplicado donde Goldfeld–Quandt sea especialmente útil. ¿Cómo elegirías el “tercio” a omitir?
- Explique diferencias prácticas entre WLS, FGLS y HC (White). ¿Cuándo usaría cada uno?
- En datos per cápita, ¿por qué la heterocedasticidad aparece “por construcción”? Proponga un esquema de WLS apropiado.
- Simule un caso en el que \(\hat{\beta}\) sea similar entre MCO y WLS, pero los EE cambien de manera sustancial. Interprete.