Analiza panelowa — FE, RE i GMM
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
- Więcej obserwacji — $N \times T$ zamiast $N$ lub $T$
- Kontrola nieobserwowalnych efektów — stałe cechy jednostek eliminujemy
- Badanie dynamiki — jak zmiana $X$ w czasie wpływa na $Y$
- 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ść
- 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
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()