Monitoria 4 de Econometria I - Inferência Estatística
Conceitos importantes de Inferência Estatística
- Definição 1: Forma Geral da Estatística t
-
Lembre-se que uma estatística \(t\) tem a forma
\[ t = \frac{\text{valor estimado} - \text{valor hipotetico}}{\text{erro padrao do estimador}} \]
- Definição 2: Testando hipóteses sobre \(\beta_1\)
-
Para testar a hipótese \(H_0: \beta_1 = \beta_{1,0}\) , precisamos realizar os seguintes passos:
- Calcule o erro padrão de \(\hat{\beta}_1\), \(\text{EP}(\hat{\beta}_1)\)
\[ \text{EP}(\hat{\beta}_1) = \sqrt{ \widehat{Var(\hat{\beta}_1})}, \\ \text{EP}(\hat{\beta}_1) = \frac{1}{n} \times \frac{\frac{1}{n-2} \sum_{i=1}^n (X_i - \overline{X})^2 \hat {u_i}^2 }{ \left[ \frac{1}{n} \sum_{i=1}^n (X_i - \overline{X})^2 \right]^2} \]
Em notação matricial, a matriz de variância e covariância é dada por
\[ \text{Var} (\hat{\beta}) = \sigma^2(X'X)^{-1} \]
onde a diagonal principal da matriz possui os estimadores de variância
- Calcule a estatística \(t\)
\[ t = \frac{\hat{\beta}_1 - \beta_{1,0}}{ \text{EP}(\hat{\beta}_1) }. \]
- Dada uma alternativa bilateral (\(H_1:\beta_1 \neq \beta_{1,0}\)) rejeitamos no nível de \(5\%\) se \(|t^{calc}| > 1,96\) ou, equivalentemente, se o \(p-valor\) for inferior a \(0,05\). Lembre-se da definição do \(p-valor\):
\[ \begin{align} p \text{-valor} =& \, \text{Pr}_{H_0} \left[ \left| \frac{ \hat{\beta}_1 - \beta_{1,0} }{ \text{EP}(\hat{\beta}_1) } \right| > \left| \frac{ \hat{\beta}_1^{calc} - \beta_{1,0} }{ \text{EP}(\hat{\beta}_1) } \right| \right] \\ =& \, \text{Pr}_{H_0} (|t| > |t^{calc}|) \\ \approx& \, 2 \cdot \Phi(-|t^{calc} |) \end{align} \]
A última transformação se deve à aproximação normal para amostras grandes.
Teste de hipóteses para Regressão Simples
Considere o modelo que estimamos na Monitoria 1:
\[ \widehat{TestScore} \ = \underset{(9.47)}{698.9} - \underset{(0.49)}{2.28} \times prop\_aluno\_prof \ , \ R^2=0.051 \ , \ SER=18.6. \]
Os resultados podem ser obtidos através dos comandos:
# load the AER package
library(AER)
# load the data set
data(CASchools)
CASchools = CASchools %>%
mutate(prop_aluno_prof = students/teachers,
score = (read + math)/2)
# estimate the model
linear_model <- lm(score ~ prop_aluno_prof, data = CASchools)
summary(linear_model)##
## Call:
## lm(formula = score ~ prop_aluno_prof, data = CASchools)
##
## Residuals:
## Min 1Q Median 3Q Max
## -47.727 -14.251 0.483 12.822 48.540
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 698.9329 9.4675 73.825 < 2e-16 ***
## prop_aluno_prof -2.2798 0.4798 -4.751 2.78e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 18.58 on 418 degrees of freedom
## Multiple R-squared: 0.05124, Adjusted R-squared: 0.04897
## F-statistic: 22.58 on 1 and 418 DF, p-value: 2.783e-06
Para testar uma hipótese relativa ao parâmetro de inclinação (o coeficiente em \(prop\_aluno\_prof\) ), precisamos de \(\text{EP}(\hat{\beta}_1)\), o erro padrao do respectivo estimador pontual. Como é comum na literatura, os erros padrao são apresentados entre parênteses abaixo das estimativas pontuais.
A definição 2 mostra que é bastante complicado calcular o erro padrao
e, portanto, a estatística \(t\)
manualmente. A pergunta que você deveria estar se perguntando agora é:
podemos obter esses valores com o mínimo esforço usando R? Sim, nós
podemos. Vamos primeiro usar summary() para obter um resumo
dos coeficientes estimados em linear_model.
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 698.932949 9.4674911 73.824516 6.569846e-242
## prop_aluno_prof -2.279808 0.4798255 -4.751327 2.783308e-06
A segunda coluna dos coeficientes relatórios resumidos \(SE(\hat\beta_0)\) e \(SE(\hat\beta_1)\). Além disso, na terceira colunat value, encontramos estatística \(t\) e \(t^{calc}\) adequadas para testes das hipóteses separadas \(H_0: \beta_0=0\) e \(H_0: \beta_1=0\). Além disso, a saída nos fornece os \(p-valor\) correspondentes a ambos os testes em relação às alternativas bilaterais \(H_1:\beta_0\neq0\) respectivamente \(H_1:\beta_1\neq0\) na quarta coluna da tabela.
Vamos dar uma olhada mais de perto no teste de
\[H_0: \beta_1=0 \ \ \ vs. \ \ \ H_1: \beta_1 \neq 0\]
Nós temos
\[ t^{calc} = \frac{-2,279808 - 0}{0,4798255} \approx - 4,75.\]
O que isso nos diz sobre a importância do coeficiente estimado? Rejeitamos a hipótese nula ao nível de significância de \(5\%\) , uma vez que \(|t^{calc}| > 1,96\). Ou seja, a estatística de teste observada cai na região de rejeição como \(p\text{-valor} = 2.78\cdot 10^{-6} < 0.05\) . Concluímos que o coeficiente é significativamente diferente de zero. Em outras palavras, rejeitamos a hipótese de que o tamanho da turma não tem influência nas notas dos alunos nos testes no nível \(5\%\).
Observe que embora a diferença seja insignificante no presente caso,
como veremos mais tarde, summary() não realiza a
aproximação normal, mas calcula valores \(p\) usando a distribuição \(t\) . Geralmente, os graus de liberdade da
distribuição \(t\) assumida são
determinados da seguinte maneira:
\[\text{DF} = n - k - 1\]
onde \(n\) é o número de observações utilizadas para estimar o modelo e \(k\) é o número de regressores, excluindo o intercepto. No nosso caso, temos \(n=420\) observações e o único regressor é prop_aluno_prof então \(k=1\) . A maneira mais simples de determinar os graus de liberdade do modelo é
## [1] 418
Portanto, para a distribuição amostral assumida de \(\hat\beta_1\) temos
\[ \hat\beta_1 \sim t_{418} \]de modo que o \(p\text{-valor}\) para um teste de significância bilateral possa ser obtido executando o seguinte código:
## [1] 2.78331e-06
Através do seguinte código podemos calcular
O resultado está muito próximo do valor fornecido por
summary(). No entanto, como \(n\) é suficientemente grande, também se
poderia usar a densidade normal padrao para calcular o \(p\text{-valor}\):
## [1] 2.02086e-06
A diferença é realmente insignificante. Essas descobertas nos dizem que, se \(H_0: \beta_1 = 0\) for verdadeiro e repetirmos todo o processo de coleta de observações e estimativa do modelo, observando um \(\hat\beta_1 \geq |-2.28|\) é muito improvável!
Usando R podemos visualizar como tal afirmação é feita ao usar a aproximação normal. Não deixe que o seguinte trecho de código o detenha: o código é um pouco mais longo que os exemplos usuais e parece desagradável, mas há muita repetição, pois tons de cores e anotações são adicionados em ambas as extremidades da distribuição normal. Recomendamos executar o código passo a passo para ver como o gráfico é aumentado com as anotações.
# Plot the standard normal on the support [-6,6]
t <- seq(-6, 6, 0.01)
plot(x = t,
y = dnorm(t, 0, 1),
type = "l",
col = "steelblue",
lwd = 2,
yaxs = "i",
axes = F,
ylab = "",
main = expression("Calculating the p-value of a Two-sided Test when"
~ t^act ~ "=-4.75"),
cex.lab = 0.7,
cex.main = 1)
tact <- -4.75
axis(1, at = c(0, -1.96, 1.96, -tact, tact), cex.axis = 0.7)
# Shade the critical regions using polygon():
# critical region in left tail
polygon(x = c(-6, seq(-6, -1.96, 0.01), -1.96),
y = c(0, dnorm(seq(-6, -1.96, 0.01)), 0),
col = 'orange')
# critical region in right tail
polygon(x = c(1.96, seq(1.96, 6, 0.01), 6),
y = c(0, dnorm(seq(1.96, 6, 0.01)), 0),
col = 'orange')
# Add arrows and texts indicating critical regions and the p-value
arrows(-3.5, 0.2, -2.5, 0.02, length = 0.1)
arrows(3.5, 0.2, 2.5, 0.02, length = 0.1)
arrows(-5, 0.16, -4.75, 0, length = 0.1)
arrows(5, 0.16, 4.75, 0, length = 0.1)
text(-3.5, 0.22,
labels = expression("0.025"~"="~over(alpha, 2)),
cex = 0.7)
text(3.5, 0.22,
labels = expression("0.025"~"="~over(alpha, 2)),
cex = 0.7)
text(-5, 0.18,
labels = expression(paste("-|",t[act],"|")),
cex = 0.7)
text(5, 0.18,
labels = expression(paste("|",t[act],"|")),
cex = 0.7)
# Add ticks indicating critical values at the 0.05-level, t^act and -t^act
rug(c(-1.96, 1.96), ticksize = 0.145, lwd = 2, col = "darkred")
rug(c(-tact, tact), ticksize = -0.0451, lwd = 2, col = "darkgreen")Intervalo de Confiança para os coeficientes da regressão
Como já sabemos, as estimativas dos coeficientes de regressão \(\beta_0\) e \(\beta_1\) estão sujeitas à incerteza amostral, ver Capítulo 4 . Portanto, nunca estimaremos exatamente o verdadeiro valor desses parâmetros a partir de dados amostrais em uma aplicação empírica. No entanto, podemos conprop_aluno_profuir intervalos de confiança para o parâmetro intercepto e inclinação.
Um intervalo de confiança de \(95\%\) para \(\beta_i\) tem duas definições equivalentes:
O intervalo é o conjunto de valores para os quais um teste de hipótese ao nível de \(5\%\) não pode ser rejeitado.
O intervalo tem uma probabilidade de \(95\%\) de conter o valor verdadeiro de \(\beta_i\) . Portanto, em \(95%\) de todas as amostras que puderam ser extraídas, o intervalo de confiança cobrirá o valor verdadeiro de \(\beta_i\) .
- Dizemos também que o intervalo tem um nível de confiança de \(95\%\) . A ideia do intervalo de confiança está resumida na Definição 4.
-
Definição 4: Intervalo de confiança para \(\beta_i\)
Imagine que você pudesse extrair todas as amostras aleatórias possíveis de um determinadotamanho. O
intervalo que contém o valor verdadeiro $\beta_i$ em $95\%$ de todas as amostras é dado pela expressão
$$\text{CI}_{0,95}^{\beta_i} = \left[ \hat{\beta}_i - 1,96 \times SE(\hat{\beta}_i) \, , \, \hat{\beta} _i + 1,96 \times SE(\hat{\beta}_i) \right].$$
Equivalentemente, este intervalo pode ser visto como o conjunto de hipóteses nulas para as quais um teste de hipótese bilateral de \(5\%\) não rejeita.
Para obter uma melhor compreensão dos intervalos de confiança, conduzimos outro estudo de simulação. Por enquanto, suponha que temos a seguinte amostra de \(n=100\) observações sobre uma única variável \(Y\) onde
\[Y_i \overset{iid}{\sim} \mathcal{N}(5,25), \ i = 1, \dots, 100.\]
# set seed for reproducibility
set.seed(4)
# generate and plot the sample data
Y <- rnorm(n = 100,
mean = 5,
sd = 5)
plot(Y,
pch = 19,
col = "steelblue")Assumimos que os dados são gerados pelo modelo
\[Y_i = \mu + \epsilon_i\]
onde \(\mu\) é uma constante desconhecida e sabemos que
\[\epsilon_i \overset{iid}{\sim} \mathcal{N}(0,25)\]
Neste modelo, o estimador OLS para \(\mu\) é dado por
\[\hat\mu = \overline{Y} = \frac{1}{n} \sum_{i=1}^n Y_i\],
ou seja, a média amostral de \(Y_i\) . Sustenta ainda que
\[SE(\hat\mu) = \frac{\sigma\_{\epsilon}}{\sqrt{n}} = \frac{5}{\sqrt{100}}\]
Um intervalo de confiança de \(95\%\) para amostras grandes para \(\mu\) é então dado por
\[ \begin{equation} CI^{\mu}_{0,95} = \left[\hat\mu - 1,96 \times \frac{5}{\sqrt{100}} \, \hat\mu + 1,96 \times \frac{5}{\sqrt{100}} \right]. \end{equation} \]
É bastante fácil calcular esse intervalo no R manualmente. O trecho de código a seguir gera um vetor nomeado contendo os limites do intervalo:
## CIlower CIupper
## [1,] 4.502625 6.462625
Sabendo que \(\mu = 5\) vemos que, para nossos dados de exemplo, o intervalo de confiançac obre o verdadeiro valor.
Ao contrário dos exemplos do mundo real, podemos usar R para obter uma melhor compreensão dos intervalos de confiança, amostrando dados repetidamente, estimando \(\mu\) e calculando o intervalo de confiança para \(\mu\).
O procedimento é o seguinte:
- Inicializamos os vetores inferior e superior nos quais os limites do intervalo simulado devem ser salvos. Queremos simular \(10.000\) intervalos para que ambos os vetores sejam definidos para ter esse comprimento.
- Usamos um loop
for()para amostrar \(100\) observações do \(\mathcal{N}(5,25)\) distribuição e cálculo \(\hat\mu\) bem como os limites do intervalo de confiança em cada iteração do loop. - Por fim, juntamos inferior e superior em uma matriz.
# set seed
set.seed(1)
# initialize vectors of lower and upper interval boundaries
lower <- numeric(10000)
upper <- numeric(10000)
# loop sampling / estimation / CI
for(i in 1:10000) {
Y <- rnorm(100, mean = 5, sd = 5)
lower[i] <- mean(Y) - 1.96 * 5 / 10
upper[i] <- mean(Y) + 1.96 * 5 / 10
}
# join vectors of interval bounds in a matrix
CIs <- cbind(lower, upper)De acordo com o conceito-chave 5.3, esperamos que a fração dos \(10.000\) intervalos simulados salvos nos ICs da matriz que contêm o valor verdadeiro \(\mu=5\) seja aproximadamente \(95\%\). Podemos verificar isso facilmente usando operadores lógicos.
## [1] 0.9487
A simulação mostra que a fração de intervalos que cobrem \(\mu=5\), ou seja, aqueles intervalos para os quais \(H_0: \mu = 5\) não pode ser rejeitado, está próxima do valor teórico de \(95\%\) .
Vamos desenhar um gráfico dos primeiros \(100\) intervalos de confiança simulados e indicar aqueles que não cobrem o verdadeiro valor de \(\mu\). Fazemos isso por meio de linhas horizontais que representam os intervalos de confiança uns sobre os outros.
# identify intervals not covering mu
# (4 intervals out of 100)
ID <- which(!(CIs[1:100, 1] <= 5 & 5 <= CIs[1:100, 2]))
# initialize the plot
plot(0,
xlim = c(3, 7),
ylim = c(1, 100),
ylab = "Sample",
xlab = expression(mu),
main = "Confidence Intervals")
# set up color vector
colors <- rep(gray(0.6), 100)
colors[ID] <- "red"
# draw reference line at mu=5
abline(v = 5, lty = 2)
# add horizontal bars representing the CIs
for(j in 1:100) {
lines(c(CIs[j, 1], CIs[j, 2]),
c(j, j),
col = colors[j],
lwd = 2)
}Para as primeiras 100 amostras, a hipótese nula verdadeira é rejeitada em quatro casos, portanto esses intervalos não cobrem \(\mu=5\). Indicamos os intervalos que levam à rejeição do vermelho nulo.
Voltemos agora ao exemplo dos resultados dos testes e do tamanho das
turmas. O modelo de regressão do Capítulo 4 é armazenado em
linear_model. Uma maneira fácil de obter intervalos de
confiança de \(95%\) para \(\beta_0\) e \(\beta_1\), os coeficientes de (intercept) e
\(prop\_aluno\_prof\), é usar a função
confint(). Só precisamos fornecer um objeto de modelo
ajustado como entrada para esta função. O nível de confiança é definido
como \(95\%\) por padrao, mas pode ser
modificado definindo o argumento level, consulte
?confint.
## 2.5 % 97.5 %
## (Intercept) 680.32312 717.542775
## prop_aluno_prof -3.22298 -1.336636
Vamos verificar se o cálculo é feito como esperamos para \(\beta_1\), o coeficiente de
prop_aluno_prof.
# compute 95% confidence interval for coefficients in 'linear_model' by hand
lm_sum <- summary(linear_model)
c("lower" = lm_sum$coef[2,1] - qt(0.975, df = lm_sum$df[2]) * lm_sum$coef[2, 2],
"upper" = lm_sum$coef[2,1] + qt(0.975, df = lm_sum$df[2]) * lm_sum$coef[2, 2])## lower upper
## -3.222980 -1.336636
Os limites superior e inferior coincidem. Usamos o quantil \(0,975\) da distribuição \(t_{418}\) para obter o resultado exato
relatado por confint. Obviamente este intervalo não contém
o valor zero o que, como já vimos na seção anterior, leva à rejeição da
hipótese nula \(\beta_{1,0} = 0\).
Teste de hipóteses para Regressão Múltipla
Discutiremos primeiro como calcular erros padrao, testar hipóteses e construir intervalos de confiança para um único coeficiente de regressão \(\beta_j\) em um modelo de regressão múltipla.
- Definição 3: Teste de hipótese \(\beta_j = \beta_{j,0}\) contra a alternativa \(\beta_j \neq \beta{j,0}\)
-
1. Calcule o erro padrao de \(\hat{\beta_j}\)
2. Calcule a estatística \(t , t^{calc} = \frac{\hat{\beta}_j - \beta_{j,0}} {SE(\hat{\beta_j})}\)
3. Calcule o \(p\text{-valor}\), \(p\text{-valor} = 2 \Phi(-|t^{calc}|)\)
onde \(t^{calc}\) é o valor da estatística \(t\) realmente calculada. Rejeite a hipótese no nível de significância \(5\%\) se o $p\text{-valor}$ for menor que $0,05$ ou, equivalentemente, se \(|t^{calc}| > 1,96\). O erro padrao e (normalmente) a estatística $t$ e o $p$ correspondente para teste $_j = 0$ são calculados automaticamente por funções R adequadas, por exemplo, por `summary`.
Testar uma única hipótese sobre a significância de um coeficiente no modelo de regressão múltipla procede de forma semelhante ao processo no modelo de regressão simples.
Você pode ver isso facilmente inspecionando o resumo dos coeficientes do modelo de regressão
\[TestScore = \beta_0 + \beta_1 \times prop\_aluno\_prof +\beta_2 \times ingles + u\]
model <- lm(score ~ prop_aluno_prof + english, data = CASchools)
coeftest(model, vcov. = vcovHC, type = "HC1")##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 686.032245 8.728225 78.5993 < 2e-16 ***
## prop_aluno_prof -1.101296 0.432847 -2.5443 0.01131 *
## english -0.649777 0.031032 -20.9391 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Você pode verificar se essas quantidades são calculadas como no modelo de regressão simples calculando manualmente as estatísticas \(t\) ou os \(p\text{-valor}\) usando a saída fornecida acima e usando R como calculadora.
Por exemplo, usando a definição do \(p\text{-valor}\) para um teste bilateral
conforme dado na Definição 4, podemos confirmar o \(p\text{-valor}\) para um teste da hipótese
de que o coeficiente \(\beta_1\), o
coeficiente de size, seja aproximadamente zero.
# compute two-sided p-value
2 * (1 - pt(abs(coeftest(model, vcov. = vcovHC, type = "HC1")[2, 3]),
df = model$df.residual))## [1] 0.01130921
O cálculo dos intervalos de confiança para coeficientes individuais
no modelo de regressão múltipla prossegue como no modelo de regressão
simples usando a função confint().
## 2.5 % 97.5 %
## (Intercept) 671.4640580 700.6004311
## prop_aluno_prof -1.8487969 -0.3537944
## english -0.7271113 -0.5724424
Para obter intervalos de confiança em outro nível, digamos \(90\%\) , basta definir o nível do argumento
em nossa chamada de confint() de acordo.
## 5 % 95 %
## (Intercept) 673.8145793 698.2499098
## prop_aluno_prof -1.7281904 -0.4744009
## english -0.7146336 -0.5849200
Outro aumento do modelo
Qual é o efeito médio sobre os resultados dos testes da redução da proporção aluno-professor quando as despesas por aluno e a percentagem de alunos que aprendem ingles são mantidos constantes?
Aumentemos o nosso modelo com um regressor adicional que é uma medida
da despesa por aluno. Usando ?CASchools, descobrimos que
CASchoolscontém a despesa variável, que fornece despesas
por aluno.
Nosso modelo agora é
\[TestScore = \beta_0 + \beta_1 \times prop\_aluno\_prof + \beta_2 \times ingles + \beta_3 \times despesas + u\]
com o valor total das despesas por aluno no distrito (milhares de dólares).
Vamos agora estimar o modelo:
# scale expenditure to thousands of dollars
CASchools$expenditure <- CASchools$expenditure/1000
# estimate the model
model <- lm(score ~ prop_aluno_prof + english + expenditure, data = CASchools)
coeftest(model)##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 649.577947 15.205717 42.7193 < 2.2e-16 ***
## prop_aluno_prof -0.286399 0.480523 -0.5960 0.551489
## english -0.656023 0.039106 -16.7756 < 2.2e-16 ***
## expenditure 3.867901 1.412122 2.7391 0.006426 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
O efeito estimado de uma mudança de uma unidade na proporção aluno-professor nas pontuações dos testes com despesas e a proporção de alunos que aprendem ingles mantida constante é \(-0,29\), o que é bastante pequeno. Além do mais, o coeficiente em \(prop\_aluno\_prof\) não é mais significativamente diferente de zero, mesmo em \(10\%\) já que \(p\text{-value}=0.55\).
Você consegue encontrar uma interpretação para essas descobertas? A
insignificância de \(\hat\beta_1\) pode
ser devido a um erro padrao maior de \(\hat{\beta}_1\) resultante da adição de
despesas ao modelo para que possamos estimar o coeficiente em (tamanho)
com menos precisão. Isto ilustra a questão dos regressores fortemente
correlacionados (multicolinearidade imperfeita). A correlação entre
\(prop\_aluno\_prof\) e \(despesas\) pode ser calculada usando
cor().
# compute the sample correlation between 'prop_aluno_prof' and 'expenditure'
cor(CASchools$prop_aluno_prof, CASchools$expenditure)## [1] -0.6199822
Testando diferentes hipóteses nulas
O linearHypothesis nos permite testar outras hipóteses
que não \(\beta_j=0\). Por exemplo,
podemos testar a hipótese nula \(\beta_3 =
4\)
## Linear hypothesis test
##
## Hypothesis:
## expenditure = 4
##
## Model 1: restricted model
## Model 2: score ~ prop_aluno_prof + english + expenditure
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 417 85701
## 2 416 85700 1 1.8028 0.0088 0.9255
Como se pode ver, não rejeitamos a hipótese nula. Portanto, não podemos considerar que o estimador de despesa é diferente de 4 ao nível de significância de \(5\%\)
Teste de hipóteses conjuntas usando a estatística F
O modelo estimado é
\[ \widehat{TestScore} = \underset{(15,21)}{649,58} -\underset{(0,48)}{0,29} \times prop_aluno_prof - \underset{(0,04)}{0,66} \times ingles + \underset{ (1,41)}{3,87} \times despesas. \]
Agora, podemos rejeitar a hipótese de que o coeficiente de tamanho e o coeficiente de despesa são zero? Para responder a isto, temos que recorrer a testes de hipóteses conjuntas. Uma hipótese conjunta impõe restrições aos coeficientes de regressão múltiplos. Isso é diferente de conduzir testes \(t\) individuais, onde uma restrição é imposta a um único coeficiente.
A Estatística-\(F\) é dada por
\[ F = \frac{(SSR_{\text{restrito}} - SSR_{\text{irrestrito}})/q}{SSR_{\text{irrestrito}} / (nk-1)} \]
sendo \(SSR_{restrito}\) a soma dos quadrados dos resíduos da regressão restrita, ou seja, a regressão onde impomos a restrição. \(SSR_{irrestrito}\) é a soma dos resíduos quadrados do modelo completo, q é o número de restrições sob o nulo e \(k\) é o número de regressores na regressão irrestrita.
É fácil realizar testes \(F\) no R.
Podemos usar a função linearHypothesis() contida no pacote
car.
# estimate the multiple regression model
model <- lm(score ~ prop_aluno_prof + english + expenditure, data = CASchools)
# execute the function on the model object and provide both linear reprop_aluno_profictions
# to be tested as prop_aluno_profings
linearHypothesis(model, c("prop_aluno_prof=0", "expenditure=0"))## Linear hypothesis test
##
## Hypothesis:
## prop_aluno_prof = 0
## expenditure = 0
##
## Model 1: restricted model
## Model 2: score ~ prop_aluno_prof + english + expenditure
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 418 89000
## 2 416 85700 2 3300.3 8.0101 0.000386 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A saída revela que a estatística F para este teste de hipótese conjunta é cerca de \(8.01\) e o valor p correspondente é \(0.0004\). Assim, podemos rejeitar a hipótese nula de que ambos os coeficientes são zero em qualquer nível de significância comumente utilizado na prática.
A saída padrao de um resumo do modelo também relata uma estatística \(F\) e o \(p\)-valor correspondente. A hipótese nula pertencente a este teste \(F\) é que todos os coeficientes populacionais no modelo, exceto o intercepto, são zero, então as hipóteses são
\[H_0: \beta_1=0, \ \beta_2 =0, \ \beta_3 =0 \quad \text{vs.} \quad H_1: \beta_j \neq 0 \ \text{para pelo menos um} \ j=1,2,3.\]
Isso também é chamado de estatística de regressão geral \(F\) e a hipótese nula é obviamente diferente do teste se apenas \(\beta_1\) e \(\beta_3\) forem zero.
Verificamos agora se a estatística \(F\) pertencente ao \(p\) listado no resumo do modelo coincide
com o resultado relatado por linearHypothesis().
# execute the function on the model object and provide the reprop_aluno_profictions
# to be tested as a character vector
linearHypothesis(model, c("prop_aluno_prof=0", "english=0", "expenditure=0"))## Linear hypothesis test
##
## Hypothesis:
## prop_aluno_prof = 0
## english = 0
## expenditure = 0
##
## Model 1: restricted model
## Model 2: score ~ prop_aluno_prof + english + expenditure
##
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 419 152110
## 2 416 85700 3 66410 107.45 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## value numdf dendf
## 107.4547 3.0000 416.0000
O valor de entrada é a estatística geral \(F\) e é igual ao resultado de
linearHypothesis(). O teste \(F\) rejeita a hipótese nula de que o modelo
não tem poder para explicar os resultados dos testes.
Conjuntos de confiança para coeficientes múltiplos
Com base na estatística \(F\) que encontramos anteriormente, podemos especificar conjuntos de confiança. Os conjuntos de confiança são análogos aos intervalos de confiança para coeficientes únicos. Como tal, os conjuntos de confiança consistem em combinações de coeficientes que contêm a verdadeira combinação de coeficientes em, digamos, \(95\%\) de todos os casos se pudéssemos extrair amostras aleatórias repetidamente, tal como no caso univariado. Dito de outra forma, um conjunto de confiança é o conjunto de todas as combinações de coeficientes para as quais não podemos rejeitar a hipótese nula conjunta correspondente testada usando um teste \(F\).
O conjunto de confiança para dois coeficientes é uma elipse centrada
em torno do ponto definido por ambas as estimativas de coeficientes.
Novamente, existe uma maneira muito conveniente de traçar o conjunto de
confiança para dois coeficientes de objetos de modelo, ou seja, a função
trustEllipse() do pacote car.
Agora traçamos a elipse de confiança \(95\%\) para os coeficientes de \(prop\_aluno\_prof\) e \(despesas\) da regressão realizada acima. Ao
especificar o argumento adicional fill , o conjunto de
confiança é colorido.
# draw the 95% confidence set for coefficients on prop_aluno_prof and expenditure
confidenceEllipse(model,
fill = T,
lwd = 0,
which.coef = c("prop_aluno_prof", "expenditure"),
main = "95% Confidence Set",
ylab="Coefficients of Expenditure",
xlab="Coefficients of prop_aluno_prof")Vemos que a elipse está centrada em \((-0.29, 3.87)\), o par de coeficientes estimados em \(prop\_aluno\_prof\) e \(despesas\) . Além do mais, \((0,0)\) não é elemento do conjunto de confiança \(95\%\) para que possamos rejeitar \(H_0: \beta_1 = 0, \ \beta_3 = 0\).
Especificação do Modelo para Regressão Múltipla
- Definição 4: Viés de Variável Omitida
-
O viés de variável omitida é o viés no estimador OLS que surge quando os regressores se correlacionam com uma variável omitida. Para que surja viés de variável omitida, duas coisas devem ser verdadeiras:
Pelo menos um dos regressores incluídos deve estar correlacionado com a variável omitida.
A variável omitida deve ser um determinante da variável dependente $S$.
Discutiremos agora um exemplo onde enfrentamos um potencial viés de variável omitida em um modelo de regressão múltipla:
Considere novamente a equação de regressão estimada
\[ \widehat{TestScore} = \underset{(8.7)}{686.0} - \underset{(0.43)}{1.10} \times prop\_aluno\_prof - \underset{(0.031)}{0.650} \times ingles. \]
Estamos interessados em estimar o efeito causal do tamanho da turma na pontuação do teste. Pode haver um viés devido à omissão de “oportunidades de aprendizagem externas” da nossa regressão, uma vez que tal medida poderia ser um determinante dos resultados dos testes dos alunos e também poderia ser correlacionada com ambos os regressores já incluídos no modelo.
“Oportunidades de aprendizagem externas” são um conceito complicado e difícil de quantificar. Em vez disso, um substituto que podemos considerar é o contexto económico dos alunos, que provavelmente está fortemente relacionado com oportunidades de aprendizagem externas: pense em pais ricos que são capazes de fornecer tempo e/ou dinheiro para aulas particulares dos seus filhos. Assim, aumentamos o modelo com a variável merenda , a percentagem de alunos que se qualificam para merenda escolar gratuita ou subsidiada devido aos rendimentos familiares abaixo de um determinado limite, e reestimamos o modelo.
# estimate the model and print the summary to console
model <- lm(score ~ prop_aluno_prof + english + lunch, data = CASchools)
coeftest(model, vcov. = vcovHC, type = "HC1")##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 700.149957 5.568453 125.7351 < 2.2e-16 ***
## prop_aluno_prof -0.998309 0.270080 -3.6963 0.0002480 ***
## english -0.121573 0.032832 -3.7029 0.0002418 ***
## lunch -0.547345 0.024107 -22.7046 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Assim, a linha de regressão estimada é
\[ \begin{align*} \widehat{TestScore} = & \underset{(5,56)}{700,15} - \underset{(0,27)}{1,00} \times prop\_aluno\_prof - \underset{(0,03)}{0,12} \times ingles \\ &- \underset{(0,02 )}{0,55} \times almoço \end{align*} \]
Não observamos mudanças substanciais na conclusão sobre o efeito do prop_aluno_prof no \(TestScore\): o coeficiente no \(prop\_aluno\_prof\) muda para apenas \(0.1\) e mantém sua significância.
Embora a diferença nos coeficientes estimados não seja grande neste caso, é útil manter o almoço para tornar mais credível a suposição de independência média condicional.
Especificação de modelo na teoria e na prática
Lista algumas armadilhas comuns ao usar \(R^2\) e \(\bar{R}^2\) para avaliar a capacidade preditiva de modelos de regressão.
Medidas de Ajuste \(R^2\) e \(\bar{R}^2\): o que eles dizem - e o que não dizem
O \(R^2\) e (e o \(\bar{R}^2\), que será explorado futuramente) informam se os regressores são bons para explicar a variação da variável independente na amostra. Se \(R^2\) (ou \(\bar{R}^2\) ) for quase \(1\), então os regressores produzem uma boa previsão da variável dependente naquela amostra, no sentido de que a variância dos resíduos de MQO é pequena em comparação com a variância de a variável dependente. Se \(R^2\) (ou \(\bar{R}^2\)) for quase \(0\) , o oposto é verdadeiro.
O \(R^2\) e \(\bar{R}^2\) não informam se:
- Uma variável incluída é estatisticamente significativa.
- Os regressores são a verdadeira causa dos movimentos na variável dependente.
- Há viés de variável omitida.
- Você escolheu o conjunto de regressores mais apropriado.
Por exemplo, pense em regredir o TestScore no \(PLS\), que mede o espaço de estacionamento
disponível em mil pés quadrados. É provável que você observe um
coeficiente significativo de magnitude razoável e valores moderados a
altos para \(R^2\) e \(\bar{R}^2\). A razão para isso é que o
espaço do estacionamento está correlacionado com muitos determinantes da
pontuação do teste, como localização, tamanho da turma, dotação
financeira e assim por diante. Embora não tenhamos observações sobre o
PLS, podemos usar R para gerar alguns dados relativamente realistas.
# set seed for reproducibility
set.seed(1)
# generate observations for parking lot space
CASchools$PLS <- c(22 * CASchools$income
- 15 * CASchools$prop_aluno_prof
+ 0.2 * CASchools$expenditure
+ rnorm(nrow(CASchools), sd = 80) + 3000)##
## Call:
## lm(formula = score ~ PLS, data = CASchools)
##
## Residuals:
## Min 1Q Median 3Q Max
## -42.372 -9.742 0.592 10.481 36.867
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.575e+02 1.171e+01 39.07 <2e-16 ***
## PLS 6.453e-02 3.836e-03 16.82 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 14.73 on 418 degrees of freedom
## Multiple R-squared: 0.4037, Adjusted R-squared: 0.4022
## F-statistic: 283 on 1 and 418 DF, p-value: < 2.2e-16
O \(PLS\) é gerado como uma função linear de \(despesas\), \(receitas\), \(prop\_aluno\_prof\) e uma perturbação aleatória. Portanto, os dados sugerem que existe alguma relação positiva entre o espaço do estacionamento e a pontuação do teste. Na verdade, ao estimar o modelo
\[ \begin{align} TestScore = \beta_0 + \beta_1 \times PLS + u \end{align} \]
usando lm() descobrimos que o coeficiente no \(PLS\) é positivo e significativamente
diferente de zero. Além disso, \(R^2\)
e \(\bar{R}^2\) são cerca de \(0,3\), o que é muito mais do que
aproximadamente \(0,05\) observado ao
regredir as pontuações dos testes apenas no tamanho das turmas. Isto
sugere que o aumento do espaço de estacionamento aumenta os resultados
dos testes de uma escola e que o modelo se sai ainda melhor na
explicação da heterogeneidade na variável dependente do que um modelo
com \(prop\_aluno\_prof\) como único
regressor.
Tendo em mente como o \(PLS\) é construído, isso não é nenhuma surpresa. É evidente que o alto \(R^2\) não pode ser usado para concluir que a relação estimada entre a vaga de estacionamento e os resultados dos testes é causal: o \(R^2\) (relativamente) alto é devido à correlação entre o \(PLS\) e outros determinantes e/ou variáveis de controle. Aumentar o espaço de estacionamento não é uma medida adequada para gerar mais sucesso na aprendizagem!
Análise do conjunto de dados de pontuação de teste
É importante incluir variáveis de controle em modelos de regressão se for plausível que haja fatores omitidos. Em nosso exemplo de resultados de testes, queremos estimar o efeito causal de uma mudança na proporção aluno-professor sobre os resultados dos testes. Fornecemos agora um exemplo de como usar a regressão múltipla para aliviar o viés de variáveis omitidas e demonstrar como relatar resultados usando R .
Até agora consideramos duas variáveis que controlam as características não observáveis dos alunos que se correlacionam com a proporção aluno-professor e que se presume terem um impacto nas pontuações dos testes:
\(ingles\): a porcentagem de alunos aprendendo ingles
\(almoço\): a proporção de alunos que se qualificam para um almoço subsidiado ou mesmo grátis na escola
Outra nova variável fornecida pelo CASchools é o \(calworks\), a porcentagem de alunos que se
qualificam para o programa de assistência à renda CalWorks. Os
estudantes elegíveis para o CalWorks vivem em famílias com um rendimento
total inferior ao limiar do programa de merenda subsidiada, pelo que
ambas as variáveis são indicadores da percentagem de crianças
economicamente desfavorecidas. Ambos os indicadores estão altamente
correlacionados:
## [1] 0.7394218
Não há uma maneira inequívoca de proceder ao decidir qual variável usar. Em qualquer caso, pode não ser uma boa ideia utilizar ambas as variáveis como regressores, tendo em conta a colinearidade. Portanto, também consideramos especificações de modelos alternativos.pode não ser uma boa ideiautilizar ambas as variáveis como regressores tendo em vista a colinearidade. Portanto, também consideramos especificações de modelos alternativos.
Para começar, traçamos as características dos alunos em relação às pontuações dos testes.
# set up arrangement of plots
m <- rbind(c(1, 2), c(3, 0))
graphics::layout(mat = m)
# scatterplots
plot(score ~ english,
data = CASchools,
col = "steelblue",
pch = 20,
xlim = c(0, 100),
cex.main = 0.7,
xlab="English",
ylab="Score",
main = "Percentage of English language learners")
plot(score ~ lunch,
data = CASchools,
col = "steelblue",
pch = 20,
cex.main = 0.7,
xlab="Lunch",
ylab="Score",
main = "Percentage qualifying for reduced price lunch")
plot(score ~ calworks,
data = CASchools,
col = "steelblue",
pch = 20,
xlim = c(0, 100),
cex.main = 0.7,
xlab="CalWorks",
ylab="Score",
main = "Percentage qualifying for income assistance")Dividimos a área de plotagem usando layout(). A matriz
\(m\) especifica a localização das
parcelas, ver ?layout.
Vemos que todos os relacionamentos são negativos. Aqui estão os coeficientes de correlação.
# estimate correlation between student characteristics and test scores
cor(CASchools$score, CASchools$english)## [1] -0.6441238
## [1] -0.868772
## [1] -0.6268533
Consideraremos cinco equações de modelo diferentes:
\[ \begin{align*} (I) \quad TestScore=& \, \, \beta_0 + \beta_1 \times prop\_aluno\_prof+ u, \\ (II) \quad TestScore=& \, \beta_0 + \beta_1 \times prop\_aluno\_prof+ \beta_2 \times ingles + u, \\ (III) \quad TestScore=& \, \beta_0 + \beta_1 \times prop\_aluno\_prof+ \beta_2 \times ingles + \beta_3 \times almoço + u, \\ (IV) \quad TestScore= & \, \beta_0 + \beta_1 \times prop\_aluno\_prof+ \beta_2 \times ingles + \beta_4 \times calworks + u, \\ (V) \quad TestScore=& \, \beta_0 + \beta_1 \times prop\_aluno\_prof + \beta_2 \times ingles + \beta_3 \times almoço + \\ & \beta_4 \times calworks + u \end{align*} \]
A melhor maneira de comunicar os resultados da regressão é em uma
tabela. O pacote stargazer é muito conveniente para esse
propósito. Ele fornece uma função que gera tabelas HTML e LaTeX com
aparência profissional que atendem aos padrões científicos. Basta
fornecer um ou vários objetos da classe lm. O resto é feito
pela função stargazer().
# load the stargazer library
library(stargazer)
# estimate different model specifications
spec1 <- lm(score ~ prop_aluno_prof, data = CASchools)
spec2 <- lm(score ~ prop_aluno_prof + english, data = CASchools)
spec3 <- lm(score ~ prop_aluno_prof + english + lunch, data = CASchools)
spec4 <- lm(score ~ prop_aluno_prof + english + calworks, data = CASchools)
spec5 <- lm(score ~ prop_aluno_prof + english + lunch + calworks, data = CASchools)
# generate a LaTeX table using stargazer
stargazer(spec1, spec2, spec3, spec4, spec5,
digits = 3,
header = F,
column.labels = c("(I)", "(II)", "(III)", "(IV)", "(V)"),
type = "html")| Dependent variable: | |||||
| score | |||||
| (I) | (II) | (III) | (IV) | (V) | |
| (1) | (2) | (3) | (4) | (5) | |
| prop_aluno_prof | -2.280*** | -1.101*** | -0.998*** | -1.308*** | -1.014*** |
| (0.480) | (0.380) | (0.239) | (0.307) | (0.240) | |
| english | -0.650*** | -0.122*** | -0.488*** | -0.130*** | |
| (0.039) | (0.032) | (0.033) | (0.034) | ||
| lunch | -0.547*** | -0.529*** | |||
| (0.022) | (0.032) | ||||
| calworks | -0.790*** | -0.048 | |||
| (0.053) | (0.061) | ||||
| Constant | 698.933*** | 686.032*** | 700.150*** | 697.999*** | 700.392*** |
| (9.467) | (7.411) | (4.686) | (6.024) | (4.698) | |
| Observations | 420 | 420 | 420 | 420 | 420 |
| R2 | 0.051 | 0.426 | 0.775 | 0.629 | 0.775 |
| Adjusted R2 | 0.049 | 0.424 | 0.773 | 0.626 | 0.773 |
| Residual Std. Error | 18.581 (df = 418) | 14.464 (df = 417) | 9.080 (df = 416) | 11.654 (df = 416) | 9.084 (df = 415) |
| F Statistic | 22.575*** (df = 1; 418) | 155.014*** (df = 2; 417) | 476.306*** (df = 3; 416) | 234.638*** (df = 3; 416) | 357.054*** (df = 4; 415) |
| Note: | p<0.1; p<0.05; p<0.01 | ||||
Demonstração do Teorema FWL
O Teorema de Frisch-Waugh-Lovell (FWL; após a prova inicial de Frisch e Waugh (1933), e posterior generalização por Lovell (1963)) afirma que:
O coeficiente de regressão de qualquer preditor em um modelo multivariado é equivalente ao coeficiente de regressão estimado a partir de um modelo bivariado no qual o resultado residualizado é regredido no componente residualizado do preditor; onde os resíduos são retirados de modelos que regridem o resultado e o preditor em todos os outros preditores na regressão multivariada (separadamente).
Mais formalmente, suponha que temos um modelo de regressão multivariada com \(k\) preditores:
\[ \begin{equation} \hat{y} = \hat{\beta}_{1}x_{1} + ... \hat{\beta}_{k}x_{k} + \epsilon. \end{equation} \]
FWL afirma que cada \(\hat{\beta}_{j}\) na equação é igual a \(\hat{\beta}^{*}_{j}\), o resíduo \(\epsilon = \epsilon^{*}\) em:
\[\begin{equation} \epsilon^{y} = \hat{\beta}^{*}_{j}\epsilon^{x_j} + \epsilon^{*} \end{equation}\]
onde:
\[\begin{aligned} \epsilon^y & = y - \sum_{k \neq j}\hat{\beta}^{y}_{k}x_{k} \\ \epsilon^{ x_{j}} &= x_j - \sum_{k \neq j}\hat{\beta}^{x_{j}}_{k}x_{k}. \end{aligned}\]
onde \(\hat{\beta}^{y}_k\) e \(\hat{\beta}^{x_j}_k\) são os coeficientes de regressão de dois modelos de regressão separados do resultado (omitindo \(x_j\)) e \(x_j\) respectivamente.
Em outras palavras, o FWL afirma que o coeficiente de cada preditor em uma regressão multivariada explica que a variância de \(y\) não é explicado pelo relacionamento dos outros preditores \(k-1\) com o resultado e nem com seu relacionamento com esse preditor, ou seja, o efeito independente de \(x_j\).
## Partial regressions
# Residual of y regressed on x1
y_res <- lm(score ~ prop_aluno_prof, CASchools)$residuals
# Residual of x2 regressed on x1
x_res <- lm(english ~ prop_aluno_prof, CASchools)$residuals
resids <- data.frame(CASchools$score, y_res, x_res)
## Compare the beta values for x2
# Multivariate regression:
summary(lm(score~prop_aluno_prof+english, CASchools))##
## Call:
## lm(formula = score ~ prop_aluno_prof + english, data = CASchools)
##
## Residuals:
## Min 1Q Median 3Q Max
## -48.845 -10.240 -0.308 9.815 43.461
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 686.03224 7.41131 92.566 < 2e-16 ***
## prop_aluno_prof -1.10130 0.38028 -2.896 0.00398 **
## english -0.64978 0.03934 -16.516 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 14.46 on 417 degrees of freedom
## Multiple R-squared: 0.4264, Adjusted R-squared: 0.4237
## F-statistic: 155 on 2 and 417 DF, p-value: < 2.2e-16
Regressão parcial
##
## Call:
## lm(formula = y_res ~ x_res, data = resids)
##
## Residuals:
## Min 1Q Median 3Q Max
## -48.845 -10.240 -0.308 9.815 43.461
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.133e-14 7.049e-01 0.00 1
## x_res -6.498e-01 3.930e-02 -16.54 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 14.45 on 418 degrees of freedom
## Multiple R-squared: 0.3955, Adjusted R-squared: 0.394
## F-statistic: 273.4 on 1 and 418 DF, p-value: < 2.2e-16
Nota: Esta não é uma demonstração exata porque há graus de liberdade de erro. Os graus de liberdade de regressão multivariada (corretos) são calculados como \(N−3\), já que existem três variáveis. Na regressão parcial os graus de liberdade são \(N−2\). Este último cálculo não leva em conta a perda adicional de liberdade como resultado da eliminação parcial \(X1\).
##
## Call:
## lm(formula = y_res ~ x_res, data = resids)
##
## Residuals:
## Min 1Q Median 3Q Max
## -48.845 -10.240 -0.308 9.815 43.461
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.133e-14 7.049e-01 0.00 1
## x_res -6.498e-01 3.930e-02 -16.54 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 14.45 on 418 degrees of freedom
## Multiple R-squared: 0.3955, Adjusted R-squared: 0.394
## F-statistic: 273.4 on 1 and 418 DF, p-value: < 2.2e-16