A análise de dados em painel combina informações de corte transversal e séries temporais, permitindo explorar variações entre indivíduos ao longo do tempo. Este tutorial cobre os principais modelos para análise de dados em painel, suas especificidades, como escolher o modelo mais adequado, e técnicas para validar as estimativas.
Os modelos abordados incluem:
- Modelo Pooled OLS (dados empilhados): Assume que não há diferenças entre indivíduos.
- Modelo de Efeitos Fixos (FE): Captura variações intra-individuais, controlando para características invariantes.
- Modelo de Efeitos Aleatórios (RE): Assume que as diferenças entre indivíduos são parte do termo de erro.
Exemplo - Grunfeld
Painel de 10 empresas de 1935-1954 (20 anos);
VAR. DEPENDENTE: nível de investimento (“invest”)
VAR. EXPLICATIVAS: valor de mercado (“value”); valor do estoque de capital (“capital”)
Abrindo os dados
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 4.0.2 ✔ tibble 3.2.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.2.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(plm) # Pacote para rodar modelo de dados e painel
Anexando pacote: 'plm'
Os seguintes objetos são mascarados por 'package:dplyr':
between, lag, lead
data(Grunfeld)summary(Grunfeld)
firm year inv value
Min. : 1.0 Min. :1935 Min. : 0.93 Min. : 58.12
1st Qu.: 3.0 1st Qu.:1940 1st Qu.: 33.56 1st Qu.: 199.97
Median : 5.5 Median :1944 Median : 57.48 Median : 517.95
Mean : 5.5 Mean :1944 Mean : 145.96 Mean :1081.68
3rd Qu.: 8.0 3rd Qu.:1949 3rd Qu.: 138.04 3rd Qu.:1679.85
Max. :10.0 Max. :1954 Max. :1486.70 Max. :6241.70
capital
Min. : 0.80
1st Qu.: 79.17
Median : 205.60
Mean : 276.02
3rd Qu.: 358.10
Max. :2226.30
Gráfico de series temporais - variável dependente (inv) vs empresa
ggplot(Grunfeld, aes(x = year, y = inv, group = firm, color = firm)) +geom_line() +labs(title ="Evolução de investimento por empresa", x ="Ano", y ="Investimento") +theme_minimal()
Call:
lm(formula = inv ~ value + capital, data = Grunfeld)
Residuals:
Min 1Q Median 3Q Max
-291.68 -30.01 5.30 34.83 369.45
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -42.714369 9.511676 -4.491 1.21e-05 ***
value 0.115562 0.005836 19.803 < 2e-16 ***
capital 0.230678 0.025476 9.055 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 94.41 on 197 degrees of freedom
Multiple R-squared: 0.8124, Adjusted R-squared: 0.8105
F-statistic: 426.6 on 2 and 197 DF, p-value: < 2.2e-16
Modelo de dados em painel
dados_painel <-pdata.frame(Grunfeld, index =c("firm", "year"))
5.Modelo de Dados Empilhados (Pooled OLS)
ajuste_pooled <-plm(inv~value+capital, data = dados_painel , model ="pooling")summary(ajuste_pooled)
Pooling Model
Call:
plm(formula = inv ~ value + capital, data = dados_painel, model = "pooling")
Balanced Panel: n = 10, T = 20, N = 200
Residuals:
Min. 1st Qu. Median 3rd Qu. Max.
-291.6757 -30.0137 5.3033 34.8293 369.4464
Coefficients:
Estimate Std. Error t-value Pr(>|t|)
(Intercept) -42.7143694 9.5116760 -4.4907 1.207e-05 ***
value 0.1155622 0.0058357 19.8026 < 2.2e-16 ***
capital 0.2306785 0.0254758 9.0548 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Total Sum of Squares: 9359900
Residual Sum of Squares: 1755900
R-Squared: 0.81241
Adj. R-Squared: 0.8105
F-statistic: 426.576 on 2 and 197 DF, p-value: < 2.22e-16
6.Modelo de Efeitos Fixos (FE)
ajuste_fixo <-plm(inv~value+capital, data = dados_painel, model ="within")summary(ajuste_fixo)
Oneway (individual) effect Within Model
Call:
plm(formula = inv ~ value + capital, data = dados_painel, model = "within")
Balanced Panel: n = 10, T = 20, N = 200
Residuals:
Min. 1st Qu. Median 3rd Qu. Max.
-184.00857 -17.64316 0.56337 19.19222 250.70974
Coefficients:
Estimate Std. Error t-value Pr(>|t|)
value 0.110124 0.011857 9.2879 < 2.2e-16 ***
capital 0.310065 0.017355 17.8666 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Total Sum of Squares: 2244400
Residual Sum of Squares: 523480
R-Squared: 0.76676
Adj. R-Squared: 0.75311
F-statistic: 309.014 on 2 and 188 DF, p-value: < 2.22e-16
7.Modelo de Efeitos Aleatórios (RE)
ajuste_aleatorio <-plm(inv~value+capital, data = dados_painel, model ="random")summary(ajuste_aleatorio)
Oneway (individual) effect Random Effect Model
(Swamy-Arora's transformation)
Call:
plm(formula = inv ~ value + capital, data = dados_painel, model = "random")
Balanced Panel: n = 10, T = 20, N = 200
Effects:
var std.dev share
idiosyncratic 2784.46 52.77 0.282
individual 7089.80 84.20 0.718
theta: 0.8612
Residuals:
Min. 1st Qu. Median 3rd Qu. Max.
-177.6063 -19.7350 4.6851 19.5105 252.8743
Coefficients:
Estimate Std. Error z-value Pr(>|z|)
(Intercept) -57.834415 28.898935 -2.0013 0.04536 *
value 0.109781 0.010493 10.4627 < 2e-16 ***
capital 0.308113 0.017180 17.9339 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Total Sum of Squares: 2381400
Residual Sum of Squares: 548900
R-Squared: 0.7695
Adj. R-Squared: 0.76716
Chisq: 657.674 on 2 DF, p-value: < 2.22e-16
Comparação entre os Modelos
8.Teste F (Chow) (Efeitos Fixos vs. Pooled)
Hipóteses do teste:
Hipótese nula (H₀): Não há efeitos individuais significativos, ou seja, as diferenças entre os indivíduos não afetam a variável dependente (y).(Pooled é suficiente).
Hipótese alternativa (H₁): Existem efeitos individuais significativos, ou seja, as diferenças entre os indivíduos influenciam a variável dependente (y).
pFtest(ajuste_fixo, ajuste_pooled)
F test for individual effects
data: inv ~ value + capital
F = 49.177, df1 = 9, df2 = 188, p-value < 2.2e-16
alternative hypothesis: significant effects
P-valor < 0.05 logo rejeita H0, o melhor modelo é o modelo fixo
9.Teste de Hausman (Efeitos Fixos vs. Efeitos Aleatórios)
O Teste de Hausman é utilizado para decidir entre os modelos de efeitos fixos (FE) e efeitos aleatórios (RE) em uma análise de dados em painel. Ele verifica se as estimativas dos coeficientes do modelo de efeitos aleatórios são consistentes em relação ao modelo de efeitos fixos.
Hipóteses do teste:
Hipótese nula (H₀): O modelo de efeitos aleatórios (RE) é consistente e, portanto, apropriado.
Hipótese alternativa (H₁): O modelo de efeitos aleatórios (RE) é inconsistente, indicando que o modelo de efeitos fixos (FE) é mais apropriado.
phtest(ajuste_fixo, ajuste_aleatorio)
Hausman Test
data: inv ~ value + capital
chisq = 2.3304, df = 2, p-value = 0.3119
alternative hypothesis: one model is inconsistent
Decisão:
p < 0.05: Rejeita H0. Use Efeitos Fixos (o modelo RE é enviesado).
p > 0.05: Não rejeita H0. Use Efeitos Aleatórios (é mais eficiente e não há evidência de viés).
Neste caso não rejeita H0 o melhor modelo é o modelo de efeito aleatório
Diagnósticos dos Modelos
10.Verificando Autocorrelação
pbgtest(ajuste_aleatorio)
Breusch-Godfrey/Wooldridge test for serial correlation in panel models
data: inv ~ value + capital
chisq = 69.95, df = 20, p-value = 1.856e-07
alternative hypothesis: serial correlation in idiosyncratic errors
O p-valor < 0.05 sugere que rejeitamos a hipótese nula.
Isso significa que há evidências estatísticas de correlação serial nos erros idiossincráticos.
11.Verificando Heterocedasticidade
library(lmtest)
Carregando pacotes exigidos: zoo
Anexando pacote: 'zoo'
Os seguintes objetos são mascarados por 'package:base':
as.Date, as.Date.numeric
bptest(ajuste_aleatorio)
studentized Breusch-Pagan test
data: ajuste_aleatorio
BP = 55.247, df = 2, p-value = 1.008e-12
O p-valor baixo (0.000) indica que rejeitamos a hipótese nula.
Isso significa que há evidências estatísticas de heterocedasticidade nos resíduos do modelo de efeitos aleatórios