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)
# Python (statsmodels)
import statsmodels.api as sm
import matplotlib.pyplot as plt
X = sm.add_constant(df[['x1','x2']])
m = sm.OLS(df['y'], X).fit()
plt.scatter(m.fittedvalues, m.resid, s=10)
plt.axhline(0, linestyle='--')
plt.xlabel('Ajustados'); plt.ylabel('Residuos'); plt.show()
# R Markdown: incluir imagen ya generada
knitr::include_graphics("figs/hetero_fan.png")

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

reg y x1 x2
estat imtest, white   // White general

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

library(lmtest)
bptest(m)               # usa fitted(m) como z
bptest(m, ~ x1 + x2)    # especifica z

Python

from statsmodels.stats.diagnostic import het_breuschpagan
bp = het_breuschpagan(m.resid, m.model.exog)  # (LM, pLM, F, pF)

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

library(lmtest)
gqtest(m, order.by = ~ Z, data = datos, fraction = 1/3)

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

reg y x1 x2 [aw = 1/sigma2_hat]

R

lm(y ~ x1 + x2, data = datos, weights = 1/sigma2_hat)

Python

wls = sm.WLS(df['y'], X, weights = 1/sigma2_hat).fit()

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)

reg y x1 x2
predict e, resid
gen e2 = e^2
reg e2 z1 z2 z3
predict sigma2_hat, xb
replace sigma2_hat = exp(sigma2_hat)   // asegura positividad si se modeló en log
reg y x1 x2 [aw = 1/sigma2_hat]

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

reg y x1 x2, robust    // ≈ HC1

R

library(sandwich); library(lmtest)
m <- lm(y ~ x1 + x2, data = datos)
coeftest(m, vcov = vcovHC(m, type = "HC1"))

Python

m_rob = m.get_robustcov_results(cov_type = 'HC1')
print(m_rob.summary())

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)
# Incluir imágenes externas
knitr::include_graphics(c("figs/resid_fitted.png","figs/resid_x.png"))

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):

  1. Simule (y=1+2x+u) con ((ux)=x^2).
  2. Estime MCO clásico y reporte t.
  3. Repita con robustos HC y con WLS usando (w_i=1/x_i^2).
  4. Compare magnitud de (), EE y p-valores.
  5. 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 w

R

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)   # WLS

Python

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

  1. Defina heterocedasticidad y explique por qué invalida las pruebas t y F clásicas.
  2. Muestre (pasos clave) que \(\mathbb{V}(\hat{\beta}\mid X)=(X'X)^{-1}X'\Omega X (X'X)^{-1}\) bajo heterocedasticidad.
  3. Compare White y Breusch–Pagan: ¿cuándo preferir uno u otro? ¿Qué significa “prueba constructiva”?
  4. Plantee un caso aplicado donde Goldfeld–Quandt sea especialmente útil. ¿Cómo elegirías el “tercio” a omitir?
  5. Explique diferencias prácticas entre WLS, FGLS y HC (White). ¿Cuándo usaría cada uno?
  6. En datos per cápita, ¿por qué la heterocedasticidad aparece “por construcción”? Proponga un esquema de WLS apropiado.
  7. Simule un caso en el que \(\hat{\beta}\) sea similar entre MCO y WLS, pero los EE cambien de manera sustancial. Interprete.