Saltar al contenido

# metodos-de-econometria-aplicada-con-python

Métodos de Econometría Aplicada con Python

Volver a la portada del curso
Lectura (Markdown)

Análisis de Datos Panel

Sección 5 · Técnicas Avanzadas de Econometría

Análisis de datos panel

Con MCO y todos los controles disponibles, la elasticidad precio de Café Altura quedó en −0.446. Los diagnósticos ya avisaban que algo faltaba: Durbin-Watson de 0.508 y un error estándar por cluster cinco veces mayor que el clásico. Lo que falta es la calidad de cada ubicación, que no está en los datos. Los datos panel permiten eliminarla sin medirla. En esta lección ves cómo, con las cifras del panel simulado de 40 tiendas por 104 semanas. El notebook panel-efectos-fijos contiene todo el código.

1. La estructura: entidad por tiempo

Un panel observa las mismas unidades (entidades) en varios periodos. El modelo con heterogeneidad no observada es:

$$\log v_{it} = \beta \log p_{it} + x_{it}'\gamma + \alpha_i + u_{it}$$

donde $i$ es la tienda, $t$ la semana y $\alpha_i$ todo lo que distingue a la tienda y no cambia en el tiempo: ubicación, vista a la calle, ambiente, clientela. Si $\alpha_i$ está correlacionado con el precio (y aquí lo está: las tiendas buenas cobran más), cualquier estimador que lo deje en el error está sesgado.

2. Cuatro estimadores, cuatro respuestas

Con linearmodels y las mismas variables (precio, promo, temperatura y log de publicidad), con errores por cluster de tienda:

EstimadorQué comparaElasticidad (e.e.)
Pooled OLStodas las filas juntas+0.286 (0.222)
Betweensolo medias por tienda+1.433 (0.311)
Efectos aleatorios (RE)mezcla ponderada−1.289 (0.020)
Efectos fijos (FE)cada tienda consigo misma−1.300 (0.022)

El estimador between usa solo la variación entre tiendas, la más contaminada por la ubicación, y da +1.433. Efectos fijos usa solo la variación dentro de cada tienda y da −1.300, con intervalo al 95 % de [−1.344, −1.257]. Los datos son simulados con elasticidad verdadera −1.3: FE la recupera. La demanda es elástica, no inelástica como sugería M3.

3. La transformación within

Efectos fijos resta a cada variable su media por tienda:

$$\log v_{it} - \overline{\log v}_i = \beta\,(\log p_{it} - \overline{\log p}_i) + (u_{it} - \bar u_i)$$

Como $\alpha_i$ es constante, $\alpha_i - \bar\alpha_i = 0$: desaparece. Haciendo el demeaning a mano solo con el precio se obtiene −1.325. Estimar MCO con 40 dummies de tienda (LSDV) da exactamente −1.300 con 44 parámetros. Ambos caminos son el mismo estimador; PanelOLS es más eficiente y calcula bien los grados de libertad.

import numpy as np
from linearmodels import PanelOLS

p = generar_panel().set_index(["tienda", "semana"])
p["log_pub"] = np.log1p(p.publicidad_miles)
fe = PanelOLS.from_formula(
    "log_ventas ~ log_precio + promo + temperatura + log_pub"
    " + EntityEffects", p,
).fit(cov_type="clustered", cluster_entity=True)
print(fe.params.round(3))
print(round(fe.rsquared_within, 3))  # 0.679

Los demás coeficientes también se acercan a los verdaderos: promo 0.131, temperatura −0.017, log de publicidad 0.081. El $R^2$ within es 0.679. La prueba F de que todos los $\alpha_i$ son iguales (poolability) da 610.7 con p ≈ 0: los efectos de tienda existen.

4. ¿Efectos fijos o aleatorios? Mundlak

RE supone que $\alpha_i$ no está correlacionado con las variables explicativas. La prueba clásica para decidir es Hausman, pero aquí su estadístico sale negativo (la diferencia de matrices de varianza no es definida positiva), algo que ocurre en muestras finitas. La alternativa robusta es el enfoque de Mundlak: agregar a la regresión las medias por tienda de cada variable. Si esas medias importan, $\alpha_i$ está correlacionado con ellas.

El coeficiente de la media de log_precio es 2.733 (p ≈ 1e-34) y el Wald conjunto da 298.3: efectos correlacionados, se elige FE. ¿Por qué RE da casi lo mismo (−1.289)? Su parámetro theta es 0.946: con 104 semanas por tienda, RE resta el 94.6 % de la media y se comporta casi como FE. Con paneles cortos la diferencia sería grande.

5. Lo que efectos fijos no puede estimar

Una variable que no cambia dentro de la tienda, como competidores o ingreso_zona, se vuelve cero tras el demeaning. Si la incluyes junto con EntityEffects, PanelOLS lanza AbsorbingEffectError: el efecto fijo absorbió la variable. Es el precio de la técnica: controlas todo lo constante, pero no puedes medir el efecto de nada constante. Los efectos estimados sí se pueden inspeccionar: varían 291 % entre la tienda extrema superior y la inferior, y se correlacionan 0.835 con el precio medio de cada tienda, la confirmación numérica del sesgo.

6. Errores por cluster y efectos de tiempo

Aun con efectos fijos, los errores de una misma tienda siguen correlacionados entre semanas. Por eso se usa cov_type="clustered", cluster_entity=True. Si temas choques comunes a todas las tiendas en una semana (un puente, una helada), agrega TimeEffects: aquí la elasticidad sigue en −1.300 y el $R^2$ within baja a 0.674.

Trampas comunes

  • Usar between o pooled para efectos causales cuando hay heterogeneidad correlacionada: el signo puede invertirse.
  • Olvidar el cluster. Los errores clásicos subestiman la incertidumbre con decenas de observaciones por entidad.
  • Esperar coeficientes de variables fijas. Si necesitas el efecto de la ciudad, FE no es la herramienta.
  • Poca variación dentro. Si el precio casi no cambia en cada tienda, FE da estimaciones imprecisas.

La regla para tu propio análisis: si las entidades difieren en algo que no mides y que afecta a la vez a $x$ y a $y$, compara cada entidad consigo misma.

Recursos