Analiza panelowa — FE, RE i GMM

Streszczenie

Dane panelowe: efekty stałe, efekty losowe, test Hausmana, instrumenty i GMM — podstawy analizy wielowymiarowej

Definicja danych panelowych

Dane panelowe łączą wymiar przekrojowy i czasowy:

$$y_{it}, \quad i = 1, \ldots, N, \quad t = 1, \ldots, T$$

gdzie $i$ = jednostka (kraj, firma, osoba), $t$ = okres czasu.

Przykłady:

  • 50 krajów obserwowanych przez 20 lat
  • 1000 firm obserwowanych kwartalnie przez 5 lat
  • Panel BHPS — 5000 gospodarstw domowych co roku

Zalety danych panelowych

  1. Więcej obserwacji — $N \times T$ zamiast $N$ lub $T$
  2. Kontrola nieobserwowalnych efektów — stałe cechy jednostek eliminujemy
  3. Badanie dynamiki — jak zmiana $X$ w czasie wpływa na $Y$
  4. Identyfikacja przyczynowości — naturalne eksperymenty wewnątrz jednostek

Model podstawowy

$$y_{it} = \alpha_i + \mathbf{x}_{it}^T \boldsymbol{\beta} + \varepsilon_{it}$$

gdzie $\alpha_i$ — efekt indywidualny (specyficzne dla jednostki, nieobserwowalne).

Przykład: zdolności pracownika wpływają na zarobki, ale nie obserwujemy ich bezpośrednio.

Problem z MNK na pooled data

Jeśli po prostu wrzucamy wszystkie obserwacje do jednej regresji (pooled OLS), $\alpha_i$ wpada do błędu:

$$y_{it} = \mathbf{x}_{it}^T \boldsymbol{\beta} + (\alpha_i + \varepsilon_{it})$$

Jeśli $\alpha_i$ jest skorelowany z $\mathbf{x}_{it}$ → obciążenie MNK (endogenność efektów indywidualnych).

Estymator efektów stałych (FE — Fixed Effects)

Kluczowa idea: odejmujemy średnią dla każdej jednostki, eliminując $\alpha_i$:

$$\tilde{y}_{it} = y_{it} - \bar{y}_i, \quad \tilde{x}_{it} = x_{it} - \bar{x}_i$$$$\tilde{y}_{it} = \tilde{x}_{it}^T \boldsymbol{\beta} + \tilde{\varepsilon}_{it}$$

$\alpha_i$ znika! Regresja na demeaned danych daje estymatorem “within”.

Interpretacja FE

FE identyfikuje efekt ze zmian w czasie wewnątrz jednostki — ignoruje różnice między jednostkami.

“Czy zwiększenie wydatków na edukację w danym kraju w danym roku wiąże się z wyższym PKB?”

Zastosowanie modelu FE

Gdy $\alpha_i$ jest skorelowany z $x_{it}$ (np. zdolności pracownika korelują z wykształceniem).

Wada: Nie możemy estymować efektów zmiennych niezmiennych w czasie (np. płeć, rasa, region).

Estymator efektów losowych (RE — Random Effects)

Alternatywa: zakładamy, że $\alpha_i$ są losowe i nieskorelowane z $x_{it}$:

$$\alpha_i \sim IID(0, \sigma_\alpha^2)$$

Wtedy $\alpha_i$ staje się częścią złożonego błędu: $u_{it} = \alpha_i + \varepsilon_{it}$.

RE estymuje GLS uwzględniając autokorelację wewnątrz jednostki:

$$\hat{y}_{it} = \mathbf{x}_{it}^T \boldsymbol{\beta} + \alpha_i \text{ (uwzględnione przez GLS)}$$

Zalety RE

  • Efektywniejszy niż FE (gdy założenia spełnione)
  • Można estymować zmienne niezmienne w czasie (płeć, region)

Problem RE

Jeśli $\alpha_i$ koreluje z $x_{it}$ → RE jest obciążone. Dlatego stosujemy test Hausmana.

Test Hausmana: FE vs. RE

Hipoteza zerowa: $\alpha_i$ jest nieskorelowany z $x_{it}$ → RE jest spójny i efektywny

Hipoteza alternatywna: $\alpha_i$ koreluje z $x_{it}$ → RE jest obciążone, FE konieczne

Statystyka Hausmana:

$$H = (\hat{\boldsymbol{\beta}}_{FE} - \hat{\boldsymbol{\beta}}_{RE})^T \left[\widehat{Var}(\hat{\boldsymbol{\beta}}_{FE}) - \widehat{Var}(\hat{\boldsymbol{\beta}}_{RE})\right]^{-1} (\hat{\boldsymbol{\beta}}_{FE} - \hat{\boldsymbol{\beta}}_{RE}) \sim \chi^2_k$$
phtest(model_fe, model_re)
# Jeśli p < 0.05 → FE (odrzucamy RE)
# Jeśli p > 0.05 → RE (nie ma dowodów przeciw)

Efekty czasowe

Dodajemy zmienne czasowe (dummy dla każdego okresu) do kontrolowania szoków wspólnych:

$$y_{it} = \alpha_i + \lambda_t + \mathbf{x}_{it}^T \boldsymbol{\beta} + \varepsilon_{it}$$

Np. kryzys finansowy 2008 wpłynął na wszystkie kraje jednocześnie — $\lambda_{2008}$ to wychwytuje.

# Two-way FE (efekty jednostek i czasu)
model_2way <- plm(wage ~ educ + exper, data = panel,
                  model = "within", effect = "twoways")

Błędy standardowe w panelu

Obserwacje tej samej jednostki w różnych latach są skorelowane → standardowe SE są błędne.

Clustered SE (po jednostkach):

coeftest(model_fe, vcov = vcovHC(model_fe, cluster = "group"))

Jeśli mamy podejrzenie korelacji też między jednostkami w tym samym roku (np. wspólne szoki) → clustered SE po czasie lub dwuwymiarowe clustered SE.

Dynamiczne modele panelowe

Gdy chcemy uwzględnić opóźnioną zmienną zależną:

$$y_{it} = \rho y_{i,t-1} + \mathbf{x}_{it}^T \boldsymbol{\beta} + \alpha_i + \varepsilon_{it}$$

Problem: $y_{i,t-1}$ jest skorelowane z $\alpha_i$ → FE jest obciążone (szczególnie dla małego $T$).

GMM Arellano-Bond

Używamy opóźnień jako instrumentów. Estimator Arellano-Bond:

library(pgmm)
model_gmm <- pgmm(wage ~ lag(wage, 1) + educ | lag(wage, 2:4),
                  data = panel, effect = "twoways",
                  model = "twosteps")
summary(model_gmm, robust = TRUE)

Instrumenty: $y_{i,t-2}, y_{i,t-3}, \ldots$ dla pierwszej różnicy równania.

Test Sargan/Hansen — test nadidentyfikacji (czy instrumenty są prawidłowe).

Zrównoważony vs. niezrównoważony panel

Zrównoważony: każda jednostka obserwowana w każdym roku ($N \times T$ obserwacji)

Niezrównoważony: brakujące obserwacje dla niektórych jednostek/lat

# Czy panel jest zrównoważony?
is.pbalanced(panel)

# Attrition bias: czy wypadanie jest losowe?
# Jeśli bogatsze firmy częściej wypadają → selekcja

Następnie: Zmienne instrumentalne i endogenność

📚 Zasoby do nauki
  • Podręcznik: Wooldridge, Econometric Analysis of Cross Section and Panel Data
  • Podręcznik: Baltagi, Econometric Analysis of Panel Data
  • R pakiet: plm, lfe
  • YouTube: Nick Huntington-Klein — Panel Data
💻 Kod źródłowy

R:

library(plm)

# Dane panelowe (id=jednostka, year=czas)
panel <- pdata.frame(dane, index = c("id", "year"))

# Model efektów stałych (FE)
model_fe <- plm(wage ~ educ + exper, data = panel,
                model = "within")
summary(model_fe)

# Model efektów losowych (RE)
model_re <- plm(wage ~ educ + exper, data = panel,
                model = "random")

# Test Hausmana: FE vs. RE
phtest(model_fe, model_re)

# Odporne błędy standardowe
coeftest(model_fe, vcov = vcovHC(model_fe, cluster = "group"))

Python:

from linearmodels import PanelOLS, RandomEffects

# Dane panelowe — MultiIndex (entity, time)
df = df.set_index(['id', 'year'])

# FE
model_fe = PanelOLS.from_formula('wage ~ educ + exper + EntityEffects',
                                  data=df).fit(cov_type='clustered',
                                                cluster_entity=True)
print(model_fe.summary)

# RE
model_re = RandomEffects.from_formula('wage ~ educ + exper', data=df).fit()