Regressão Dados em Painel

Author

Silvio Aparecido da Silva

Modelo de Regressão Dados em Painel

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

  1. 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  
  1. 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()

  1. Modelo de regressão clássico
ajuste<-lm(inv~value+capital, data=Grunfeld)
summary(ajuste)

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
  1. 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)

  1. 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

12.Verificando Normalidade dos Resíduos

residuals_re <- residuals(ajuste_aleatorio)
hist(residuals_re)

library(nortest)
lillie.test(residuals_re)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  residuals_re
D = 0.12753, p-value = 2.074e-08

Como o p-valor (0.000) é muito menor do que o nível de significância típico (geralmente α=0.05), rejeitamos a hipótese nula.

Conclusão: Os resíduos do modelo não são considerados normais. Isso indica que há evidências de violação da normalidade