Estimação MQO multivariado
Regressão Múltipla via lm()
-
Para estimar um modelo multivariado no R, podemos usar a função
lm():- O til (
~) separa a a variável dependente das variáveis independentes - As variáveis independentes precisam ser separadas por um
+ - A constante (
$\beta_0$) é incluída automaticamente pela função
lm()– para retirá-la, precisa incluir a “variável independente”0na fórmula.
- O til (
Exemplo 3.1: Determinantes da Nota Média em Curso Superior nos EUA (Wooldridge, 2006)
- Sejam as variáveis
colGPA(college GPA): a nota média em um curso superior,hsGPA(high school GPA): a nota médio do ensino médio, eACT(achievement test score): a nota de avaliação de conhecimentos para ingresso no ensino superior.
- Usando a base
gpa1do pacotewooldridge, vamos estimar o seguinte modelo:
$$ \text{colGPA} = \beta_0 + \beta_1 \text{hsGPA} + \beta_2 \text{ACT} + u $$
# Acessando a base de dados gpa1
data(gpa1, package = "wooldridge")
# Estimando o modelo
GPAres = lm(colGPA ~ hsGPA + ACT, data = gpa1)
GPAres
##
## Call:
## lm(formula = colGPA ~ hsGPA + ACT, data = gpa1)
##
## Coefficients:
## (Intercept) hsGPA ACT
## 1.286328 0.453456 0.009426
- Note que podemos ver mais detalhes da estimação usando a função
summary()no objeto resultante da funçãolm()
summary(GPAres)
##
## Call:
## lm(formula = colGPA ~ hsGPA + ACT, data = gpa1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.85442 -0.24666 -0.02614 0.28127 0.85357
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.286328 0.340822 3.774 0.000238 ***
## hsGPA 0.453456 0.095813 4.733 5.42e-06 ***
## ACT 0.009426 0.010777 0.875 0.383297
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3403 on 138 degrees of freedom
## Multiple R-squared: 0.1764, Adjusted R-squared: 0.1645
## F-statistic: 14.78 on 2 and 138 DF, p-value: 1.526e-06
MQO na forma matricial
Notações
-
Para mais detalhes sobre a forma matricial do MQO, ver Apêndice E de Wooldridge (2006)
-
Considere o modelo multivariado com $K$ regressores para a observação $i$: $$ y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + … + \beta_K x_{iK} + u_i, \qquad i=1, 2, …, N \tag{E.1} $$ em que $N$ é o número de observações.
-
Defina o vetor-coluna de parâmetros, $\boldsymbol{\beta}$, e o vetor-linha de variáveis independentes da observação $i$, $\boldsymbol{x}_i$ (minúsculo): $$ \underset{1 \times K}{\boldsymbol{x}_i} = \left[ \begin{matrix} 1 & x_{i1} & x_{i2} & \cdots & x_{iK} \end{matrix} \right] \qquad \text{e} \qquad \underset{(K+1) \times 1}{\boldsymbol{\beta}} = \left[ \begin{matrix} \beta_0 \\ \beta_1 \\ \beta_2 \\ \vdots \\ \beta_K \end{matrix} \right],$$
-
Note que o produto interno $\boldsymbol{x}_i \boldsymbol{\beta}$ é:
- Logo, a equação (3.1) pode ser reescrita, para $i=1, 2, ..., N$, como
$$ y_i = \underbrace{\beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + … + \beta_K x_{iK}}_{\boldsymbol{x}_i \boldsymbol{\beta}} + u_i = \boldsymbol{x}_i \boldsymbol{\beta} + u_i, \tag{E.2} $$
- Considere $\boldsymbol{X}$ a matriz de todas $N$ observações para as $K+1$ variáveis explicativas:
- Agora, podemos “empilhar” as equações (3.2) para todo $i=1, 2, ..., N$ e obtemos:
Estimação Analítica no R
Operações matriciais/vetoriais no R
- Primeiro, vamos ver como realizar operações matriciais/vetoriais no R:
- Transposta de uma matriz ou vetor: função
t() - Multiplicação matricial ou vetorial (produto interno): operador
%*% - Inversa de uma matriz (quadrada): função
solve()
- Transposta de uma matriz ou vetor: função
# Como exemplo, criaremos matriz A de dimensão 4x2
A = matrix(1:8, nrow=4, ncol=2)
A
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
# Transposta de A (2x4)
t(A)
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
# Produto matricial A'A (2x2)
t(A) %*% A
## [,1] [,2]
## [1,] 30 70
## [2,] 70 174
# Inversa de A'A (2x2)
solve( t(A) %*% A )
## [,1] [,2]
## [1,] 0.54375 -0.21875
## [2,] -0.21875 0.09375
Exemplo - Determinantes da Nota Média em Curso Superior nos EUA (Wooldridge, 2006)
-
Queremos estimar o modelo: $$ \text{colGPA} = \beta_0 + \beta_1 \text{hsGPA} + \beta_2 \text{ACT} + u $$
-
A partir da base de dados
gpa1, vamos criar o vetor da variável dependenteye a matrix das variáveis independentesX:
# Acessando a base de dados gpa1
data(gpa1, package = "wooldridge")
# Criando o vetor y
y = as.matrix(gpa1[,"colGPA"]) # transformando coluna de data frame em matriz
head(y)
## [,1]
## [1,] 3.0
## [2,] 3.4
## [3,] 3.0
## [4,] 3.5
## [5,] 3.6
## [6,] 3.0
# Criando a matriz de covariadas X com primeira coluna de 1's
X = cbind( const=1, gpa1[, c("hsGPA", "ACT")] ) # juntando 1's com as covariadas
X = as.matrix(X) # transformando em matriz
head(X)
## const hsGPA ACT
## 1 1 3.0 21
## 2 1 3.2 24
## 3 1 3.6 26
## 4 1 3.5 27
## 5 1 3.9 28
## 6 1 3.4 25
# Pegando valores N e K
N = nrow(gpa1)
N
## [1] 141
K = ncol(X) - 1
K
## [1] 2
1. Estimativas de MQO $\hat{\boldsymbol{\beta}}$
$$ \hat{\boldsymbol{\beta}} = \left[ \begin{matrix} \hat{\beta}_0 \\ \hat{\beta}_1 \\ \hat{\beta}_2 \\ \vdots \\ \hat{\beta}_K \end{matrix} \right] = (\boldsymbol{X}'\boldsymbol{X})^{-1} \boldsymbol{X}' \boldsymbol{y} \tag{3.2} $$No R:
bhat = solve( t(X) %*% X ) %*% t(X) %*% y
bhat
## [,1]
## const 1.286327767
## hsGPA 0.453455885
## ACT 0.009426012
2. Valores ajustados/preditos $\hat{\boldsymbol{y}}$
$$ \hat{\boldsymbol{y}} = \boldsymbol{X} \hat{\boldsymbol{\beta}} $$No R:
yhat = X %*% bhat
head(yhat)
## [,1]
## 1 2.844642
## 2 2.963611
## 3 3.163845
## 4 3.127926
## 5 3.318734
## 6 3.063728
3. Resíduos $\hat{\boldsymbol{u}}$
$$ \hat{\boldsymbol{u}} = \boldsymbol{y} - \hat{\boldsymbol{y}} \tag{3.3} $$No R:
uhat = y - yhat
head(uhat)
## [,1]
## 1 0.15535832
## 2 0.43638918
## 3 -0.16384523
## 4 0.37207430
## 5 0.28126580
## 6 -0.06372813
4. Variância do termo de erro $S^2$
$$ S^2 = \frac{\hat{\boldsymbol{u}}'\hat{\boldsymbol{u}}}{N-K-1} \tag{3.4} $$No R, como
$S^2$ é um escalar, é conveniente transformar a “matriz 1x1” em um número usando as.numeric():
S2 = as.numeric( t(uhat) %*% uhat / (N-K-1) )
S2
## [1] 0.1158148
5. Matriz de variância-covariância do estimador $\widehat{\text{Var}}(\hat{\boldsymbol{\beta}})$
$$ \widehat{\text{Var}}(\hat{\boldsymbol{\beta}}) = S^2 (\boldsymbol{X}'\boldsymbol{X})^{-1} \tag{3.5} $$No R, como
$S^2$ é um escalar, é conveniente transformar a “matriz 1x1” em um número usando as.numeric():
V_bhat = S2 * solve( t(X) %*% X )
V_bhat
## const hsGPA ACT
## const 0.116159717 -0.0226063687 -0.0015908486
## hsGPA -0.022606369 0.0091801149 -0.0003570767
## ACT -0.001590849 -0.0003570767 0.0001161478
6. Erros-padrão do estimador $\text{se}(\hat{\boldsymbol{\beta}})$
É a raiz quadrada da diagonal principal da matriz de variância-covariância do estimador
se_bhat = sqrt( diag(V_bhat) )
se_bhat
## const hsGPA ACT
## 0.34082212 0.09581292 0.01077719
Comparando estimações via lm() e analítica
- Até agora, obtivemos as estimativas $\hat{\boldsymbol{\beta}}$ e seus erros-padrão $\text{se}(\hat{\boldsymbol{\beta}})$:
cbind(bhat, se_bhat)
## se_bhat
## const 1.286327767 0.34082212
## hsGPA 0.453455885 0.09581292
## ACT 0.009426012 0.01077719
- E, portanto, ainda percisamos concluir a parte de inferência da estimação por meio do cálculo da estatística t e do p-valor:
summary(GPAres)$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.286327767 0.34082212 3.7741910 2.375872e-04
## hsGPA 0.453455885 0.09581292 4.7327219 5.421580e-06
## ACT 0.009426012 0.01077719 0.8746263 3.832969e-01
Inferência MQO multivariado
O teste t
-
Após a estimação, é importante fazer testes de hipótese na forma $$ H_0: \ \beta_j = a_j \tag{4.1} $$ tal que $a_j$ é uma constante, e $j$ é um dos $K+1$ parâmetros estimados.
-
A hipótese alternativa para teste bicaudal é dada por $$ H_1: \ \beta_j \neq a_j \tag{4.2} $$ enquanto, para teste unicaudal, é $$ H_1: \ \beta_j > a_j \qquad \text{ou} \qquad H_1: \ \beta_j < a_j \tag{4.3} $$
-
Estas hipóteses podem ser convenientemente testas pelo test t: $$ t = \frac{\hat{\beta}_j - a_j}{\text{se}(\hat{\beta}_j)} \tag{4.4} $$
-
**[II]**Frequentemente, realizamos teste bicaudal com $a_j=0$ para testar se a estimativa $\hat{\beta}_j$ é estatisticamente significante, ou seja, se a variável independente tem efeito significante sobre a variável dependente (estatisticamente diferente de zero):
-
Há três formas de avaliar essa hipótese.
-
(i) A primeira é por meio da comparação da estatística t com o valor crítico c, dado um nível de significância $\alpha$: $$ \text{Rejeitamos H}_0 \text{ se:} \qquad | t_{\hat{\beta}_j} | > c. $$
-
Normalmente, utiliza-se $\alpha = 5\%$ e, portanto, o valor crítico $c$ tende a ficar próximo de 2 para quantidades razoáveis de graus de liberdade, e se aproxima ao valor crítico de 1,96 da distribuição normal.
- (ii) Outra maneira de avaliar a hipótese nula é via p-valor, que indica o quão provável é que $\hat{\beta}_j$ não seja um valor extremo (ou seja, o quão provável é que a estimativa seja igual a $a_j = 0$).
$$ p_{\hat{\beta}_j} = 2.F_{t_{(N-K-1)}}(-|t_{\hat{\beta}_j}|), \tag{4.7} $$ em que $F_{t_{(N-K-1)}}(\cdot)$ é a fda de uma distribuição t com $(N-K-1)$ graus de liberdade.
- Portanto, rejeitamos $H_0$ quando o p-valor (a probabilidade da estimativa ser igual a zero) for menor do que um nível de significância $\alpha$:
- (iii) A terceira maneira de avaliar a hipótese nula é via cálculo do intervalo de confiança: $$ \hat{\beta}_j\ \pm\ c . \text{se}(\hat{\beta}_j) \tag{4.8} $$
- Rejeitamos a hipótese nula, neste caso, quando $a_j$ estiver fora do intervalo de confiança.
(Continuação) Exemplo - Determinantes da Nota Média em Curso Superior nos EUA (Wooldridge, 2006)
- Assuma $\alpha = 5\%$ e teste bicaudal com $a_j = 0$.
7. Estatística t
$$ t_{\hat{\beta}_j} = \frac{\hat{\beta}_j}{\text{se}(\hat{\beta}_j)} \tag{4.6} $$No R:
# Cálculo da estatística t
t_bhat = bhat / se_bhat
t_bhat
## [,1]
## const 3.7741910
## hsGPA 4.7327219
## ACT 0.8746263
8. Avaliando as hipóteses nulas
# definição do nível de significância
alpha = 0.05
c = qt(1 - alpha/2, N-K-1) # valor crítico de teste bicaudal
c
## [1] 1.977304
# (A) Comparando estatística t com o valor crítico
abs(t_bhat) > c # avaliando H0
## [,1]
## const TRUE
## hsGPA TRUE
## ACT FALSE
# (B) Comparando p-valor com o nível de significância de 5%
p_bhat = 2 * pt(-abs(t_bhat), N-K-1)
round(p_bhat, 5) # arredondando para facilitar visualização
## [,1]
## const 0.00024
## hsGPA 0.00001
## ACT 0.38330
p_bhat < 0.05 # avaliando H0
## [,1]
## const TRUE
## hsGPA TRUE
## ACT FALSE
# (C) Verificando se zero (0) está fora do intervalo de confiança
ci = cbind(bhat - c*se_bhat, bhat + c*se_bhat) # avaliando H0
ci
## [,1] [,2]
## const 0.61241898 1.96023655
## hsGPA 0.26400467 0.64290710
## ACT -0.01188376 0.03073578
Comparando estimações via lm() e analítica
- Resultados calculados analiticamente (“na mão”)
cbind(bhat, se_bhat, t_bhat, p_bhat) # coeficientes
## se_bhat
## const 1.286327767 0.34082212 3.7741910 2.375872e-04
## hsGPA 0.453455885 0.09581292 4.7327219 5.421580e-06
## ACT 0.009426012 0.01077719 0.8746263 3.832969e-01
ci # intervalos de confiança
## [,1] [,2]
## const 0.61241898 1.96023655
## hsGPA 0.26400467 0.64290710
## ACT -0.01188376 0.03073578
- Resultado via função
lm()
summary(GPAres)$coef
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.286327767 0.34082212 3.7741910 2.375872e-04
## hsGPA 0.453455885 0.09581292 4.7327219 5.421580e-06
## ACT 0.009426012 0.01077719 0.8746263 3.832969e-01
confint(GPAres)
## 2.5 % 97.5 %
## (Intercept) 0.61241898 1.96023655
## hsGPA 0.26400467 0.64290710
## ACT -0.01188376 0.03073578
Informando os Resultados das Regressões
- Seção 4.4 de Heiss (2020)
- Aqui, vamos utilizar um exemplo para mostrar como informar os resultados de diversas regressões usando a função
stargazerdo pacote de mesmo nome.
Exemplo 4.10 - A Relação Salário-Benefícios de Professores (Wooldridge, 2006)
- Vamos usar a base de dados
meap93do pacotewooldridgee queremos estimar o modelo
$$ \log{\text{salary}} = \beta_0 + \beta_1. (\text{benefits/salary}) + \text{outros_fatores} + u $$
- Primeiro, vamos carregar a base de dados e criar a variável benefits/salary (
b_s):
data(meap93, package="wooldridge") # carregando base de dados
# Definindo nova variável
meap93$b_s = meap93$benefits / meap93$salary
- Agora vamos estimar diversos modelos:
- Modelo 1: apenas
b_scomo regressor - Modelo 2: inclui as variáveis explicativas
log(enroll)elog(staff)no Modelo 1 - Modelo 3: inclui as variáveis explicativas
droprateegradrateno Modelo 2
- Modelo 1: apenas
- Depois, vamos resumir os resultados em uma única tabela usando a função
stagazer()pacotestagazertype="text"para retornar o resultado no próprio console (se omitir esse argumento, retorna o código em LaTeX)keep.stat=c("n", "rsq")para manter apenas os nº de observações e os R$^2$star.cutoffs=c(.05, .01, .001)níveis de significância de 5%, 1% e 0,1%
# Estimando os três modelos
model1 = lm(log(salary) ~ b_s, meap93)
model2 = lm(log(salary) ~ b_s + log(enroll) + log(staff), meap93)
model3 = lm(log(salary) ~ b_s + log(enroll) + log(staff) + droprate + gradrate, meap93)
# Resumindo em uma tabela
library(stargazer)
##
## Please cite as:
## Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
## R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
stargazer(list(model1, model2, model3), type="text", keep.stat=c("n", "rsq"),
star.cutoffs=c(.05, .01, .001))
##
## ============================================
## Dependent variable:
## -------------------------------
## log(salary)
## (1) (2) (3)
## --------------------------------------------
## b_s -0.825*** -0.605*** -0.589***
## (0.200) (0.165) (0.165)
##
## log(enroll) 0.087*** 0.088***
## (0.007) (0.007)
##
## log(staff) -0.222*** -0.218***
## (0.050) (0.050)
##
## droprate -0.0003
## (0.002)
##
## gradrate 0.001
## (0.001)
##
## Constant 10.523*** 10.844*** 10.738***
## (0.042) (0.252) (0.258)
##
## --------------------------------------------
## Observations 408 408 408
## R2 0.040 0.353 0.361
## ============================================
## Note: *p<0.05; **p<0.01; ***p<0.001
- É comum que os resultados econométricos venham acompanhados de asteriscos (
*), pois estes indicam que as estimativas são significantes a um certo nível de significância - Quanto maior o nível de significância, mais asteriscos são inseridos e estes facilitam a interpretação das estimativas estatisticamente diferentes de zero.
Regressores Qualitativos
- Muitas variáveis de interesse são qualitativas, ao invés de quantitativas.
- Isso inclui variáveis como sexo, raça, status de trabalho, estado civil, escolha de marca, etc.
Variáveis Dummy
- Seção 7.1 de Heiss (2020)
- Se um dado qualitativo está armazenado na base como uma variável qualitativa (ou seja, seus valores são 0’s ou 1’s), então ele pode ser inserido imediatamente numa regressão linear.
- Se uma variável dummy for usada num modelo, seu coeficiente representa a diferença do intercepto entre os grupos (Wooldridge, 2006, Seção 7.2)
Exemplo 7.5 - Equação do Log do Salário-Hora (Wooldridge, 2006)
- Vamos usar a base de dados
wage1do pacotewooldridge - Vamos estimar o modelo:
\begin{align} \text{wage} = &\beta_0 + \beta_1 \text{female} + \beta_2 \text{educ} + \beta_3 \text{exper} + \beta_4 \text{exper}^2 +\\ &\beta_5 \text{tenure} + \beta_6 \text{tenure}^2 + u \tag{7.6} \end{align} em que:
wage: salário médio por horafemale: dummy em que (1) mulher e (0) homemeduc: anos de educaçãoexper: anos de experiência (expersq= anos ao quadrado)tenure: anos de trabalho no empregador atual (tenursq= anos ao quadrado)
# Carregando a base de dados necessária
data(wage1, package="wooldridge")
# Estimando o modelo
reg_7.1 = lm(wage ~ female + educ + exper + expersq + tenure + tenursq, data=wage1)
round( summary(reg_7.1)$coef, 4 )
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.1097 0.7107 -2.9687 0.0031
## female -1.7832 0.2572 -6.9327 0.0000
## educ 0.5263 0.0485 10.8412 0.0000
## exper 0.1878 0.0357 5.2557 0.0000
## expersq -0.0038 0.0008 -4.9267 0.0000
## tenure 0.2117 0.0492 4.3050 0.0000
## tenursq -0.0029 0.0017 -1.7473 0.0812
- Nota-se que as mulheres (
female = 1) recebem em média $1,78/hora a menos, em relação aos homens (female = 0). - Essa diferença é estatisticamente significane (p-valor de
femaleé menor do que 5%)
Variáveis com múltiplas categorias
- Seção 7.3 de Heiss (2020)
- Quando temos uma variável categórica com mais de 2 categorias, não é possível simplesmente usá-la na regressão como se fosse uma dummy.
- É necessário criar uma dummy para cada categoria
- Quando for feita a estimação do modelo, é necessário deixar uma destas categorias de fora para evitar problema de multicolinearidade perfeita.
- Conhecendo todas as dummies menos uma, dá para saber o valor esta última dummy
- Se todas outras dummies forem iguais a 0, a última dummy é igual a 1
- Se houver outra dummy igual a 1, então última dummy é igual a 0
- Além disso, a categoria deixada de fora acaba sendo usada referência quando são estimados os parâmetros.
Exemplo: Efeito do aumento do salário-mínimo sobre o emprego (Card e Krueger, 1994)
- Em 1992, o estado de New Jersey (NJ) aumentou o salário mínimo
- Para avaliar se o aumento do salário mínimo teria impacto na quantidade de trabalhadores empregados, usou como comparação o estado vizinho de Pennsylvania (PA), considerado parecido com NJ.
- Vamos estimar o seguinte modelo:
$$` \text{diff_fte} = \beta_0 + \beta_1 \text{nj} + \beta_2 \text{chain} + \beta_3 \text{hrsopen} + u $$ em que:
diff_emptot: diferença de nº de empregados entre fev/1992 e nov/1992nj: dummy em que (1) New Jersey - NJ, e (0) Pennsylvania - PAchain: rede de fast food: (1) Burger King (bk), (2) KFC (kfc), (3) Roy’s (roys), e (4) Wendy’s (wendys)hrsopen: horas de funcionamento por dia
card1994 = read.csv("https://fhnishida.netlify.app/project/rec2301/card1994.csv")
head(card1994) # olhando as 6 primeiras linhas
## sheet nj chain hrsopen diff_fte
## 1 46 0 1 16.5 -16.50
## 2 49 0 2 13.0 -2.25
## 3 56 0 4 12.0 -14.00
## 4 61 0 4 12.0 11.50
## 5 445 0 1 18.0 -41.50
## 6 451 0 1 24.0 13.00
- Note que a variável categórica
chainpossui números ao invés dos nomes das redes de fast food. - Isto é comum nas bases de dados, já que números consomem menos espaço de armazenamento.
- Caso você rode a estimação com a variável
chaindesta maneira, o modelo considerará que é uma variável contínua e prejudicando a sua análise:
lm(diff_fte ~ nj + hrsopen + chain, data=card1994)
##
## Call:
## lm(formula = diff_fte ~ nj + hrsopen + chain, data = card1994)
##
## Coefficients:
## (Intercept) nj hrsopen chain
## 0.40284 4.61869 -0.28458 -0.06462
- Note que a interpretação é que a mudança de
bk(1) parakfc(2) [ou dekfc(2) pararoys(3), ou deroys(3) parawendys(4)] diminuiu a variação do nº trabalhadores – o que não faz sentido! - Portanto, precisamos criar as dummies das variáveis categóricas:
# Criando dummies para cada variável
card1994$bk = ifelse(card1994$chain==1, 1, 0)
card1994$kfc = ifelse(card1994$chain==2, 1, 0)
card1994$roys = ifelse(card1994$chain==3, 1, 0)
card1994$wendys = ifelse(card1994$chain==4, 1, 0)
# Visualizando as primeras linhas
head(card1994)
## sheet nj chain hrsopen diff_fte bk kfc roys wendys
## 1 46 0 1 16.5 -16.50 1 0 0 0
## 2 49 0 2 13.0 -2.25 0 1 0 0
## 3 56 0 4 12.0 -14.00 0 0 0 1
## 4 61 0 4 12.0 11.50 0 0 0 1
## 5 445 0 1 18.0 -41.50 1 0 0 0
## 6 451 0 1 24.0 13.00 1 0 0 0
- Também é possível criar dummies mais facilmente usando o pacote
fastDummies - Observe que, usando apenas três colunas das redes de fast food, é possível saber o valor da 4ª coluna, pois cada observação/loja só pode ser de uma dessas 4 redes de fast food e, portanto, há apenas um
1em cada linha. - Portanto, caso coloquemos as 4 dummies quando formos rodar a regressão, haverá um problema de multicolinearidade perfeita:
lm(diff_fte ~ nj + hrsopen + bk + kfc + roys + wendys, data=card1994)
##
## Call:
## lm(formula = diff_fte ~ nj + hrsopen + bk + kfc + roys + wendys,
## data = card1994)
##
## Coefficients:
## (Intercept) nj hrsopen bk kfc roys
## 2.097621 4.859363 -0.388792 -0.005512 -1.997213 -1.010903
## wendys
## NA
- Por padrão, o R já retira uma das categorias para servir como referência.
- Aqui, a categoria
wendysserve como referência às estimativas das demais dummies- Em relação a
wendys, o nº de empregados de:bkteve uma variação de empregados muito parecida (apenas 0,005 menor)roysteve uma diminuição (menos 1 empregado)kfcteve uma maior diminuição (menos 2 empregados)
- Em relação a
- Note que poderíamos usar como referência outra rede de fast food, deixando sua dummy de fora da regressão.
- Vamos deixar de fora a dummy do
roys:
lm(diff_fte ~ nj + hrsopen + bk + kfc + wendys, data=card1994)
##
## Call:
## lm(formula = diff_fte ~ nj + hrsopen + bk + kfc + wendys, data = card1994)
##
## Coefficients:
## (Intercept) nj hrsopen bk kfc wendys
## 1.0867 4.8594 -0.3888 1.0054 -0.9863 1.0109
- Note agora que os parâmetros estão em relação à `roys``:
- estimativa de
kfcque tinha ficado -2, agora está “menos” negativo (-1) - estimativas de
bke dewendyspossuem estimativas positivas (lembre-se que, em relação awendys, a estimativa deroysfoi negativo na regressão anterior)
- estimativa de
-
No R, na verdade, não é necessário criar dummies de uma variável categórica para rodar uma regressão, caso ela esteja como texto ou como factor
-
Criando variável da classe texto:
card1994$chain_txt = as.character(card1994$chain) # criando variável texto
head(card1994$chain_txt) # Visualizado os primeiros valores
## [1] "1" "2" "4" "4" "1" "1"
# Estimando do modelo
lm(diff_fte ~ nj + hrsopen + chain_txt, data=card1994)
##
## Call:
## lm(formula = diff_fte ~ nj + hrsopen + chain_txt, data = card1994)
##
## Coefficients:
## (Intercept) nj hrsopen chain_txt2 chain_txt3 chain_txt4
## 2.092109 4.859363 -0.388792 -1.991701 -1.005391 0.005512
- Observe que a função
lm()retira a categoria que aparece primeiro no vetor de texto ("1") - Usando como variável texto, não é possível selecionar facilmente qual categoria vai ser retirada da regressão
- Para isto, podemos usar a classe de objeto
factor:
card1994$chain_fct = factor(card1994$chain) # criando variável factor
levels(card1994$chain_fct) # verificando os níveis (categorias) da variável factor
## [1] "1" "2" "3" "4"
# Estimando do modelo
lm(diff_fte ~ nj + hrsopen + chain_fct, data=card1994)
##
## Call:
## lm(formula = diff_fte ~ nj + hrsopen + chain_fct, data = card1994)
##
## Coefficients:
## (Intercept) nj hrsopen chain_fct2 chain_fct3 chain_fct4
## 2.092109 4.859363 -0.388792 -1.991701 -1.005391 0.005512
- Note que a função
lm()retira o primeiro nível da regressão (não necessariamente o que aparece primeiro na base de dados) - Podemos trocar a referência usando a função
relevel()em uma variável factor
card1994$chain_fct = relevel(card1994$chain_fct, ref="3") # referência roys
levels(card1994$chain_fct) # verificando os níveis da variável factor
## [1] "3" "1" "2" "4"
# Estimando do modelo
lm(diff_fte ~ nj + hrsopen + chain_fct, data=card1994)
##
## Call:
## lm(formula = diff_fte ~ nj + hrsopen + chain_fct, data = card1994)
##
## Coefficients:
## (Intercept) nj hrsopen chain_fct1 chain_fct2 chain_fct4
## 1.0867 4.8594 -0.3888 1.0054 -0.9863 1.0109
- Observe que o primeiro nível foi alterado para
"3"e, portanto, essa categoria foi retirada na regressão
Transformando variáveis contínuas em categorias
- Seção 7.4 de Heiss (2020)
- Usando a função
cut(), podemos “dividir” um vetor de números em intervalos, a partir de pontos de corte
# Definindo pontos de corte
cutpts = c(0, 3, 6, 10)
# Classificando o vetor 1:10 a partir dos pontos de corte
cut(1:10, cutpts)
## [1] (0,3] (0,3] (0,3] (3,6] (3,6] (3,6] (6,10] (6,10] (6,10] (6,10]
## Levels: (0,3] (3,6] (6,10]
Exemplo 7.8 - Efeitos da Classificação das Faculdade de Direito sobre Salários Iniciais (Wooldridge, 2006)
- Queremos verificar o quanto as universidades top 10 (
top10), e as ranqueadas entre 11 e 25 (r11_25), entre 26 e 40 (r26_40), entre 41 e 60 (r41_60), e entre 61 e 100 (r61_100), impactam o log do salário (log(salary)) em relação às demais universidades (r101_175). - Utilizaremos como variáveis de controle:
LSAT,GPA,llibvolelcost
data(lawsch85, package="wooldridge") # carregando base de dados necessária
# Definindo pontos de corte
cutpts = c(0, 10, 25, 40, 60, 100, 175)
# Criando variável com a classificação
lawsch85$rankcat = cut(lawsch85$rank, cutpts)
# Visualizando os 6 primeiros valores de rankcat
head(lawsch85$rankcat)
## [1] (100,175] (100,175] (25,40] (40,60] (60,100] (60,100]
## Levels: (0,10] (10,25] (25,40] (40,60] (60,100] (100,175]
# Escolhendo a categoria de referência (acima de 100 até 175)
lawsch85$rankcat = relevel(lawsch85$rankcat, '(100,175]')
# Estimando o modelo
res = lm(log(salary) ~ rankcat + LSAT + GPA + llibvol + lcost, data=lawsch85)
round( summary(res)$coef, 5 )
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.16530 0.41142 22.27699 0.00000
## rankcat(0,10] 0.69957 0.05349 13.07797 0.00000
## rankcat(10,25] 0.59354 0.03944 15.04926 0.00000
## rankcat(25,40] 0.37508 0.03408 11.00536 0.00000
## rankcat(40,60] 0.26282 0.02796 9.39913 0.00000
## rankcat(60,100] 0.13159 0.02104 6.25396 0.00000
## LSAT 0.00569 0.00306 1.85793 0.06551
## GPA 0.01373 0.07419 0.18500 0.85353
## llibvol 0.03636 0.02602 1.39765 0.16467
## lcost 0.00084 0.02514 0.03347 0.97336
- Note que, em relação às universidades em piores colocações (
(100,175]), as melhores ranqueadas provêem salários de 13,16% a 69,96% superiores
Interações Envolvendo Variáveis Dummy
Interações entre variáveis dummy
- Subseção 6.1.6 de Heiss (2020)
- Seção 7. de Wooldridge (2006)
- Adicionando um termo de interação entre duas dummies, é possível obter estimativas distintas de uma dummy (mudança no intercepto) para cada um das 2 categorias da outra dummy (0 e 1).
(Continuação) Exemplo 7.5 - Equação do Log do Salário-Hora (Wooldridge, 2006)
-
Retornemos à base de dados
wage1do pacotewooldridge -
Agora, vamos incluir a variável dummy
married -
O modelo a ser estimado é:
\begin{align} \log(\text{wage}) = &\beta_0 + \beta_1 \text{female} + \beta_2 \text{married} + \beta_3 \text{educ} +\\ &\beta_4 \text{exper} + \beta_5 \text{exper}^2 + \beta_6 \text{tenure} + \beta_7 \text{tenure}^2 + u \end{align} em que:
wage: salário médio por horafemale: dummy em que (1) mulher e (0) homemmarried: dummy em que (1) casado e (0) solteiroeduc: anos de educaçãoexper: anos de experiência (expersq= anos ao quadrado)tenure: anos de trabalho no empregador atual (tenursq= anos ao quadrado)
# Carregando a base de dados necessária
data(wage1, package="wooldridge")
# Estimando o modelo
reg_7.11 = lm(lwage ~ female + married + educ + exper + expersq + tenure + tenursq, data=wage1)
round( summary(reg_7.11)$coef, 4 )
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.4178 0.0989 4.2257 0.0000
## female -0.2902 0.0361 -8.0356 0.0000
## married 0.0529 0.0408 1.2985 0.1947
## educ 0.0792 0.0068 11.6399 0.0000
## exper 0.0270 0.0053 5.0609 0.0000
## expersq -0.0005 0.0001 -4.8135 0.0000
## tenure 0.0313 0.0068 4.5700 0.0000
## tenursq -0.0006 0.0002 -2.4475 0.0147
-
Por essa regressão, nota-se que casar-se tem efeito estatisticamente não significante e positivo de 5,29% sobre o salário.
-
O fato deste efeito não ser significante pode estar relacionado aos efeitos distintos dos casamentos sobre os homens, que têm seus salários elevados, e as mulheres, que têm seus salários diminuídos.
-
Para avaliar diferentes efeitos distintos do casamento considerando o sexo do indivíduo, podemos interagir (multiplicar) as variáveis
marriedefemaleusando:lwage ~ female + married + married:female(o:cria apenas a interação), oulwage ~ female * married(a “multiplicação” cria as dummies e a interação)
-
O modelo a ser estimado agora é: \begin{align} \log(\text{wage}) = &\beta_0 + \beta_1 \text{female} + \beta_2 \text{married} + \delta_2 \text{female*married} + \beta_3 \text{educ} + \\ &\beta_4 \text{exper} + \beta_5 \text{exper}^2 + \beta_6 \text{tenure} + \beta_7 \text{tenure}^2 + u \end{align}
# Estimando o modelo - forma (a)
reg_7.14a = lm(lwage ~ female + married + female:married + educ + exper + expersq + tenure + tenursq,
data=wage1)
round( summary(reg_7.14a)$coef, 4 )
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.3214 0.1000 3.2135 0.0014
## female -0.1104 0.0557 -1.9797 0.0483
## married 0.2127 0.0554 3.8419 0.0001
## educ 0.0789 0.0067 11.7873 0.0000
## exper 0.0268 0.0052 5.1118 0.0000
## expersq -0.0005 0.0001 -4.8471 0.0000
## tenure 0.0291 0.0068 4.3016 0.0000
## tenursq -0.0005 0.0002 -2.3056 0.0215
## female:married -0.3006 0.0718 -4.1885 0.0000
# Estimando o modelo - forma (b)
reg_7.14b = lm(lwage ~ female * married + educ + exper + expersq + tenure + tenursq,
data=wage1)
round( summary(reg_7.14b)$coef, 4 )
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.3214 0.1000 3.2135 0.0014
## female -0.1104 0.0557 -1.9797 0.0483
## married 0.2127 0.0554 3.8419 0.0001
## educ 0.0789 0.0067 11.7873 0.0000
## exper 0.0268 0.0052 5.1118 0.0000
## expersq -0.0005 0.0001 -4.8471 0.0000
## tenure 0.0291 0.0068 4.3016 0.0000
## tenursq -0.0005 0.0002 -2.3056 0.0215
## female:married -0.3006 0.0718 -4.1885 0.0000
- Observe que, agora, o parâmetro de casado refere-se apenas aos homens (
married) é positivo e significante de 21,27%. - Já, sobre as mulheres, o casamento tem o efeito de $\beta_2 + \delta_2$, ou seja, é igual a -8,79% (= 0,2127 - 0,3006)
- Uma hipótese importante é a H$_0:\ \delta_2 = 0$ para verificar se o retorno por mudança do estado civil (intercepto) é diferente entre mulheres e homens.
- No output da regressão, podemos ver que o parâmetros da interação (
female:married) é significante (p-valor bem baixo), logo, o efeito do casamento sobre a mulher é estatisticamente diferente do efeito sobre o homem.
Considerando inclinações diferentes
- Seção 7.4 de Wooldridge (2006)
- Seção 7.5 de Heiss (2020)
- Adicionando um termo de interação entre uma variável contínua e uma dummy, é possível obter estimativas distintas de da variável numérica (mudança na inclinação) para cada um das 2 categorias da dummy (0 e 1).
Exemplo 7.10 - Equação do Log do Salário-Hora (Wooldridge, 2006)
- Retornemos à base de dados
wage1do pacotewooldridge - Suspeita-se que as mulheres, além de terem um intercepto distinto em relação aos homens, também tem menores retornos de salário para cada ano de educação a mais.
- Então, incluiremos no modelo a interação entre a dummy
femalee os anos de educação (educ):
\begin{align} \log(\text{wage}) = &\beta_0 + \beta_1 \text{female} + \beta_2 \text{educ} + \delta_2 \text{female*educ} \\ &\beta_3 \text{exper} + \beta_4 \text{exper}^2 + \beta_5 \text{tenure} + \beta_6 \text{tenure}^2 + u \end{align} em que:
wage: salário médio por horafemale: dummy em que (1) mulher e (0) homemeduc: anos de educaçãofemale*educ: interação entre a dummyfemalee anos de educação (educ)exper: anos de experiência (expersq= anos ao quadrado)tenure: anos de trabalho no empregador atual (tenursq= anos ao quadrado)
# Carregando a base de dados necessária
data(wage1, package="wooldridge")
# Estimando o modelo
reg_7.17 = lm(lwage ~ female + educ + female:educ + exper + expersq + tenure + tenursq,
data=wage1)
round( summary(reg_7.17)$coef, 4 )
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.3888 0.1187 3.2759 0.0011
## female -0.2268 0.1675 -1.3536 0.1764
## educ 0.0824 0.0085 9.7249 0.0000
## exper 0.0293 0.0050 5.8860 0.0000
## expersq -0.0006 0.0001 -5.3978 0.0000
## tenure 0.0319 0.0069 4.6470 0.0000
## tenursq -0.0006 0.0002 -2.5089 0.0124
## female:educ -0.0056 0.0131 -0.4260 0.6703
- Uma hipótese importante é a H$_0:\ \delta_2 = 0$ para verificar se o retorno a cada ano de educação (inclinação) é diferente entre mulheres e homens.
- Pela estimação, nota-se que o incremento no salário das mulheres para cada ano a mais de educação é 0,56% menor em relação aos homens:
- Homens aumentam 8,24% (
educ) o salário para cada ano de educação - Mulheres aumentam 7,58% (= 0,0824 - 0,0056) o salário para cada ano de educação
- Homens aumentam 8,24% (
- No entanto, essa diferença é estatisticamente não-significante a 5% de significância.