Abstract
This is an undergrad student level exercise for class use.This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
License: CC BY-SA 4.0
Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: especificação: salários de advogados - Wooldridge(exemplo 7.8). Campo Grande-MS, Brasil: RStudio/Rpubs, 2020. Disponível em https://rpubs.com/amrofi/wooldridge_ex7_8_spec.
Wooldridge Source: Collected by Kelly Barnett, an MSU economics student, for use in a term project. The data come from two sources: The Official Guide to U.S. Law Schools, 1986, Law School Admission Services, and The Gourman Report: A Ranking of Graduate and Professional Programs in American and International Universities, 1995, Washington, D.C. Data loads lazily.
O dataset do Wooldridge contém dados sobre a mediana dos salarios iniciais dos formados em Direito. Uma variável explicativa é a classificação da faculdade cursada.O grupo base é das faculdades com rank maior que 100
O script foi adaptado de https://www.r-econometrics.com/reproduction/wooldridge/wooldridge07/.
A data.frame with 156 observations on 21 variables:
rank: law school ranking
salary: median starting salary
cost: law school cost
LSAT: median LSAT score
GPA: median college GPA
libvol: no. volumes in lib., 1000s
faculty: no. of faculty
age: age of law sch., years
clsize: size of entering class
north: =1 if law sch in north
south: =1 if law sch in south
east: =1 if law sch in east
west: =1 if law sch in west
lsalary: log(salary)
studfac: student-faculty ratio
top10: =1 if ranked in top 10
r11_25: =1 if ranked 11-25
r26_40: =1 if ranked 26-40
r41_60: =1 if ranked 41-60
llibvol: log(libvol)
lcost: log(cost)
library(wooldridge)
data("lawsch85")
Vamos gerar dummies (não era necessário, pois já estavam no dataset) para os rankings das faculdades. Criamos abaixo para ver como ficam, pois o dataset contém uma variável rank para os salarios (salary). O leitor pode investigar a forma como criamos dummies usando a variável rank e critérios de classes.
lawsch85$top10 <- as.numeric(lawsch85$rank <= 10)
lawsch85$r11.25 <- as.numeric(lawsch85$rank >= 11 & lawsch85$rank <= 25)
lawsch85$r26.40 <- as.numeric(lawsch85$rank >= 26 & lawsch85$rank <= 40)
lawsch85$r41.60 <- as.numeric(lawsch85$rank >= 41 & lawsch85$rank <= 60)
lawsch85$r61.100 <- as.numeric(lawsch85$rank >= 61 & lawsch85$rank <= 100)
As dummies foram criadas e já incorporadas ao dataset lawsch85
. Podemos conferir, olhando pelo pacote knitr
e função kable
.
library(knitr)
kable(lawsch85[1:15,c(16:19,22:25)],caption="Dummies do dataset: recorte de 15 linhas")
top10 | r11_25 | r26_40 | r41_60 | r11.25 | r26.40 | r41.60 | r61.100 |
---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
Com essas variáveis, criamos um modelo inicial (mod1) do tipo log-log:
\[ \operatorname{log(salary)} = \alpha + \beta_{1}(\operatorname{log(rank)}) + \beta_{2}(\operatorname{log(LSAT)}) + \beta_{3}(\operatorname{log(GPA)}) + \beta_{4}(\operatorname{log(libvol)}) + \beta_{5}(\operatorname{log(cost)}) + \epsilon \] Depois um (mod2) linear:
\[ \operatorname{(salary)} = \alpha + \beta_{1}(\operatorname{rank}) + \beta_{2}(\operatorname{LSAT}) + \beta_{3}(\operatorname{GPA}) + \beta_{4}(\operatorname{libvol}) + \beta_{5}(\operatorname{cost}) + \epsilon \] e um modelo log-log (mod3) com as dummies:
\[ \begin{array}{l} \operatorname{log(salary)} = \alpha + \beta_{1}(\operatorname{top10}) + \beta_{2}(\operatorname{r11\_25}) + \beta_{3}(\operatorname{r26\_40}) +\\ \beta_{4}(\operatorname{r41\_60}) + \beta_{5}(\operatorname{r61.100}) + \beta_{6}(\operatorname{log(LSAT)}) + \beta_{7}(\operatorname{log(GPA)}) +\\ \beta_{8}(\operatorname{log(libvol)}) + \beta_{9}(\operatorname{log(cost)}) + \epsilon \end{array} \]
Portanto, os modelos são estimados e os resultados estão abaixo.
mod1 <- lm(log(salary) ~ log(rank) + log(LSAT) + log(GPA)
+ log(libvol) + log(cost), data = lawsch85)
mod2 <- lm((salary) ~ (rank) + (LSAT) + (GPA)
+ (libvol) + (cost), data = lawsch85)
mod3 <- lm(log(salary) ~ top10 + r11_25 + r26_40 + r41_60 + r61.100
+ log(LSAT) + log(GPA) + log(libvol) + log(cost), data = lawsch85)
mod1$AIC <- AIC(mod1)
mod2$AIC <- AIC(mod2)
mod3$AIC <- AIC(mod3)
mod1$BIC <- BIC(mod1)
mod2$BIC <- BIC(mod2)
mod3$BIC <- BIC(mod3)
library(stargazer)
star.1 <- stargazer(mod1, mod2, mod3,
title="Título: Resultados das Regressões",
align=TRUE,
type = "text",
keep.stat=c("aic","bic","rsq", "adj.rsq","n")
)
##
## Título: Resultados das Regressões
## =========================================================
## Dependent variable:
## -------------------------------------
## log(salary) (salary) log(salary)
## (1) (2) (3)
## ---------------------------------------------------------
## log(rank) -0.227***
## (0.019)
##
## top10 0.700***
## (0.053)
##
## r11_25 0.593***
## (0.039)
##
## r26_40 0.374***
## (0.034)
##
## r41_60 0.262***
## (0.028)
##
## r61.100 0.131***
## (0.021)
##
## log(LSAT) 0.726 0.885*
## (0.559) (0.472)
##
## log(GPA) 0.191 0.057
## (0.282) (0.239)
##
## log(libvol) 0.017 0.036
## (0.033) (0.026)
##
## log(cost) 0.008 0.001
## (0.029) (0.025)
##
## rank -115.815***
## (16.153)
##
## LSAT 155.286
## (192.598)
##
## GPA 14,500.240***
## (4,357.070)
##
## libvol 12.956***
## (3.261)
##
## cost 0.366**
## (0.146)
##
## Constant 7.383*** -33,124.550 5.562**
## (2.577) (25,210.760) (2.141)
##
## ---------------------------------------------------------
## Observations 136 136 136
## R2 0.870 0.806 0.911
## Adjusted R2 0.865 0.798 0.905
## Akaike Inf. Crit. -227.844 2,737.692 -271.086
## Bayesian Inf. Crit. -207.455 2,758.080 -239.046
## =========================================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Podemos observar que os modelos com logs apresentam maiores R² ajustados mas apenas o rank como variável significativa, ou as dummies associadas aos ranks. Já o modelo linear aparece com menor R² ajustado mas com a maior parte das variáveis significativas estatisticamente. O leitor fica então com a impressão de que existem problemas de especificação. A melhor estratégia é observar todos os pressupostos clássicos e suas possíveis violações. Neste momento do curso, faremos apenas uma investigação do Ramsey RESET test e algum teste de omissão de variáveis.
A análise de correlação permitirá ter uma ideia inicial de possível multicolinearidade. Olharei apenas um subset para as variáveis dos modelos.
# install.packages('corrplot')
library(corrplot)
dados<-lawsch85[,c('rank','LSAT','GPA','libvol','cost')]
corel <- cor(dados,method = "spearman",use = "complete.obs")
corrplot(corel, method = "number")
Podemos observar que GPA e LSAT tem uma correlação importante, de 0.78. Isso poderá causar não significância de parâmetros.
Esses testes fazem uma estatística para avaliar um modelo restrito contra o modelo irrestrito. No presente caso, faremos apenas para o modelo log-log (mod3
) com respeito às variáveis GPA
, libvol
e cost
. O pacote car
possui a função linearHypothesis
que já fará o teste de restrição automaticamente (um teste F com H0 de que as variáveis testadas possuem parâmetros nulos). A rejeição de H0 implica na ideia de que as variáveis são importantes para o modelo, mesmo com parâmetros não significativos em mod3
.
library(car)
# F test: APENAS ESPECIFICO AS QUE TERAO TESTE DE OMISSAO
myH0 <- c("log(GPA)","log(libvol)","log(cost)")
linearHypothesis(mod3, myH0)
Neste caso, o F=0.66 e a probabilidade associada de 0.57 indica a não rejeição de que os parâmetros destas variáveis (“log(GPA)”,“log(libvol)”,“log(cost)”) são nulos.
Outra forma de escrever o mesmo teste seria fazendo:
linearHypothesis(mod3, c("log(GPA)=0","log(libvol)=0","log(cost)=0"))
Portanto, uma alternativa seria retirar essas variáveis do mod3
. Antes, realizaremos um teste de Ramsey, o teste de erro de especificação da regressão (RESET).
O teste RESET prevê a ideia de que adicionando termos da variável dependente ajustada ao quadrado, ao cubo e à quarta potências, seria o equivalente a testar o poder explicativo de variáveis explicativas quadráticas, cubicas e mesmo termos cruzados de X de forma que, para a H0 de que os termos de potências têm parâmetros nulos, ou que os termos \(Z_i \alpha_i\) tem \(\alpha_i=0\), a rejeição de H0 implica em existência de erros de especificação. Será um teste do tipo F. Faremos usando o pacote lmtest
e sua função resettest
, para cada um dos três modelos.
library(lmtest)
lmtest::resettest(mod1,power = 2:4,type = "fitted")
##
## RESET test
##
## data: mod1
## RESET = 29.637, df1 = 3, df2 = 127, p-value = 1.36e-14
lmtest::resettest(mod2,power = 2:4,type = "fitted")
##
## RESET test
##
## data: mod2
## RESET = 51, df1 = 3, df2 = 127, p-value < 2.2e-16
lmtest::resettest(mod3,power = 2:4,type = "fitted")
##
## RESET test
##
## data: mod3
## RESET = 3.0517, df1 = 3, df2 = 123, p-value = 0.03113
Nos três casos, a probabilidade menor que 1% para mod1 e mod2 e menor que 5% para mod3 indicam a existência de erros de especificação.
O pesquisador deve tomar cuidado, pois as vezes o teste RESET pode revelar que tem algo mais ocorrendo. Por exemplo, refaremos os testes para potências 2 e 3 apenas.
library(lmtest)
lmtest::resettest(mod1,power = 2:3,type = "fitted")
##
## RESET test
##
## data: mod1
## RESET = 42.71, df1 = 2, df2 = 128, p-value = 6.171e-15
lmtest::resettest(mod2,power = 2:3,type = "fitted")
##
## RESET test
##
## data: mod2
## RESET = 55.605, df1 = 2, df2 = 128, p-value < 2.2e-16
lmtest::resettest(mod3,power = 2:3,type = "fitted")
##
## RESET test
##
## data: mod3
## RESET = 0.30745, df1 = 2, df2 = 124, p-value = 0.7359
Neste caso, o modelo 3 “passou” no teste, não acusando erro de especificação. É importante observar que alguns softwares fazem por padrão apenas com essas potências, como é o caso do pacote lmtest
, por entender ser suficiente com 2 e 3 potências. Veja abaixo pelo “default”, ou seja, sem colocar a opção power
.
library(lmtest)
lmtest::resettest(mod1,type = "fitted")
##
## RESET test
##
## data: mod1
## RESET = 42.71, df1 = 2, df2 = 128, p-value = 6.171e-15
lmtest::resettest(mod2,type = "fitted")
##
## RESET test
##
## data: mod2
## RESET = 55.605, df1 = 2, df2 = 128, p-value < 2.2e-16
lmtest::resettest(mod3,type = "fitted")
##
## RESET test
##
## data: mod3
## RESET = 0.30745, df1 = 2, df2 = 124, p-value = 0.7359
HEISS, Florian. Using R for Introductory Econometrics. 2.ed. Florian Heiss, 2020. Recurso online. Disponível em: http://www.urfie.net/.
SHEA, Justin M. wooldridge: vignette. 2020. Disponível em: https://justinmshea.github.io/wooldridge/articles/Introductory-Econometrics-Examples.html.
SHEA, Justin M. wooldridge: 111 Data Sets from “Introductory Econometrics: A Modern Approach, 6e” by Jeffrey M. Wooldridge. R package version 1.3.1. 2018. Disponível em: https://CRAN.R-project.org/package=wooldridge.
WOOLDRIDGE, J.M. Introdução à Econometria: uma abordagem moderna. São Paulo: Pioneira Thomson Learning, 2006.(tradução da segunda edição americana).
WOOLDRIDGE, Jeffrey M. Introductory econometrics: A modern approach. Nelson Education, 2016.