Uma breve introdução à Análise de Regressão Linear: interpretação e implementação no R (e no Python).
Uma das técnicas mais conhecidas e difundidas no mundo de statistical/machine learning é a Análise de Regressão Linear (ARL). Ela é útil quando estamos interessados em explicar/predizer a variável dependente \(y\) utilizando um conjunto de \(k\) variaveis explicativas \(x_1, \ldots, x_k\).
Basicamente, utilizamos as \(k\) variáveis explicativas para entender o comportamento de \(y\) e, num contexto de regressão linear, assumimos que a relação entre \(y\) e as \(x\)’s é dada por uma função linear da forma:
\[y = \underbrace{\beta_0 + \beta_1 x_1 + \ldots + \beta_k x_k}_{f(x_1, \ldots, x_k)} + u,\] em que \(u\) é o termo de erro.
Na prática, nunca conhecemos \(\beta = [\beta_0, \beta_1, \ldots, \beta_k]'\) e temos que estima esses valores utilizando os dados. Existem diferentes métodos de estimação, sendo o método de mínimos quadraros ordinários (MQO) um dos mais comumente utilizados1.
O estimador de MQO é dado por \[\hat{\beta} = (X'X)^{-1}X'Y,\] e sua respectiva matriz de covariância (condicional em \(X\)) é dada por \[V(\hat{\beta}|X) = \sigma^2(X'X)^{-1}\] em que \(Y = [y_1, \ldots, y_n]'\) e \(X = \begin{bmatrix} 1 & x_{1,1} & \cdots & x_{1,k} \\ \vdots & \vdots & \cdots & \vdots \\ 1 & x_{n,1} & \cdots & x_{n,k} \end{bmatrix}\)
O Teorema de Gaus–Markov estabelece que, sob algumas hipóteses (conhecidas como as hipóteses de Gauss-Markov), \(\hat{\beta}\) é o melhor estimador linear não viesado (BLUE em inglês: Best Linear Unbiased Estimator), ou seja, para qualquer outro estimador linear2 \(\tilde{\beta}\), \[V(\tilde{\beta}|X) \geq V(\hat{\beta}|X).\]
A Figura 1 mostra um exemplo de uma reta de regressão \(\hat{y} = \hat{\beta}_0 + \hat{\beta}_1 x\) obtida pelo método de MQO.
Realizar uma regressão linear no R não é difícil, para ver como faze-lo utilizaremos o conjunto de dados hprice1 disponível no pacote wooldridge do R.
Se assumirmos que o modelo populacional é da forma \[price = \beta_0 + \beta_1 bdrms + \beta_2 lotsize + \beta_3 sqrft + \beta_4 colonial + u,\] utilizamos o seguintes comandos
library(wooldridge)
modelo = lm(price~bdrms+lotsize+sqrft+colonial, data = hprice1)
modelo
Call:
lm(formula = price ~ bdrms + lotsize + sqrft + colonial, data = hprice1)
Coefficients:
(Intercept) bdrms lotsize sqrft colonial
-24.126528 11.004292 0.002076 0.124237 13.715542
O output anterior apenas mostra os \(\hat{\beta}\)’s, um output mais completo, que inclui o desvio padrão dos \(\hat{\beta}\)’s, o teste T, teste F, \(R^2\) e p-valores pode ser facilmente obtido utilizando a função summary( ).
summary(modelo)
Call:
lm(formula = price ~ bdrms + lotsize + sqrft + colonial, data = hprice1)
Residuals:
Min 1Q Median 3Q Max
-122.268 -38.271 -6.545 28.210 218.040
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.413e+01 2.960e+01 -0.815 0.41741
bdrms 1.100e+01 9.515e+00 1.156 0.25080
lotsize 2.076e-03 6.427e-04 3.230 0.00177 **
sqrft 1.242e-01 1.334e-02 9.314 1.53e-14 ***
colonial 1.372e+01 1.464e+01 0.937 0.35146
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 59.88 on 83 degrees of freedom
Multiple R-squared: 0.6758, Adjusted R-squared: 0.6602
F-statistic: 43.25 on 4 and 83 DF, p-value: < 2.2e-16
Antes de interpretar os resultados é importante e necessário conhecer os dados e saber quais as unidades de medida das nossas variáveis3.
Para darmos uma olhada nos dados utilizaremos as funções select( ) e glimpse( ) do pacote dplyr.
Rows: 88
Columns: 5
$ price <dbl> 300.000, 370.000, 191.000, 195.000, 373.000, 466.27…
$ bdrms <int> 4, 3, 3, 3, 4, 5, 3, 3, 3, 3, 4, 5, 3, 3, 3, 4, 4, …
$ lotsize <dbl> 6126, 9903, 5200, 4600, 6095, 8566, 9000, 6210, 600…
$ sqrft <int> 2438, 2076, 1374, 1448, 2514, 2754, 2067, 1731, 176…
$ colonial <int> 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, …
A descrição das variáveis é apresentada a seguir e ela pode ser obtida utilizando diretamente os comandos help(hprice1) ou ?hprice1.
Variável | Descrição |
---|---|
price | preço da casa (em milhares de dólares) |
bdrms | número de quartos |
lotsize | tamanho do lote da casa (em pés\(^2\)) |
sqrft | tamanho da casa (em pés\(^2\)) |
colonial | Dummy (=1 se a casa for de estilo colonial) |
Conhecendo melhor os dados, vamos então interpretar os resultados:
Finalmente, summary( ) também fornece informação para testar conjuntamente \[H_0: \beta_{bdrms}=0,\beta_{lotsize}=0,\beta_{sqrft}=0,\beta_{colonial}=0\] vs. \[H_1: H_0 \text{ is not true. }\] Utilizando o teste F, rejeitamos \(H_0\) (p-valor \(\approx\) 0, F-statistics = 43.25)
Obviamente, nossa interpretação foi realizada assumindo que as hipóteses do modelo linear clássico são satisfeitas. Se as hipóteses não são satisfeitas, precisamos melhoras/corrigir nosso modelo e apenas interpretar os resultados quando as hipóteses do modelo linear clássico forem verificadas.
No livro do Wooldridge7 encontramos uma interessante discussão sobre como interpretar os \(\beta\)’s quando utilizamos ou não transformações logaritmicas. A seguinte Tabela apresenta um resumo dessa discussão e fornece uma guia para melhor interpretarmos os resultados
Variável dependente | Variável independente | Interpretação do \(\beta\) |
---|---|---|
\(y\) | \(x\) | \(\Delta y = \beta \Delta x\) |
\(y\) | \(\log(x)\) | \(\Delta y = \big(\beta/100 \big) \% \Delta x\) |
\(\log(y)\) | \(x\) | \(\% \Delta y = 100\beta \Delta x\) |
\(\log(y)\) | \(\log(x)\) | \(\% \Delta y = \beta \% \Delta x\) |
import statsmodels.api as sm
import pandas as pd
from patsy import dmatrices
url = "https://raw.githubusercontent.com/ctruciosm/statblog/master/datasets/hprice1.csv"
hprice1 = pd.read_csv(url)
y, X = dmatrices('price ~ bdrms + lotsize + sqrft + colonial',
data = hprice1, return_type = 'dataframe')
# Definir o modelo
modelo = sm.OLS(y, X)
# Ajustar (fit) o modelo
modelo_fit = modelo.fit()
# Resultados completos do modelo
print(modelo_fit.summary())
OLS Regression Results
==============================================================================
Dep. Variable: price R-squared: 0.676
Model: OLS Adj. R-squared: 0.660
Method: Least Squares F-statistic: 43.25
Date: Dom, 14 Mar 2021 Prob (F-statistic): 1.45e-19
Time: 14:08:06 Log-Likelihood: -482.41
No. Observations: 88 AIC: 974.8
Df Residuals: 83 BIC: 987.2
Df Model: 4
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept -24.1265 29.603 -0.815 0.417 -83.007 34.754
bdrms 11.0043 9.515 1.156 0.251 -7.921 29.930
lotsize 0.0021 0.001 3.230 0.002 0.001 0.003
sqrft 0.1242 0.013 9.314 0.000 0.098 0.151
colonial 13.7155 14.637 0.937 0.351 -15.397 42.828
==============================================================================
Omnibus: 24.904 Durbin-Watson: 2.117
Prob(Omnibus): 0.000 Jarque-Bera (JB): 45.677
Skew: 1.091 Prob(JB): 1.21e-10
Kurtosis: 5.774 Cond. No. 6.43e+04
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 6.43e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
A ideia básica deste método é encontrar os valores \(\hat{\beta}\)’s que minimizam a soma de quadrados dos residuos.↩︎
Um estimador linear é um estimador da forma \(\tilde{\beta} = A'Y\) em que a matrix \(A\) é uma matriz de dimensão \(n \times k+1\) função de \(X\)↩︎
Na prática, antes de ajustar a reta de regressão é feita uma análise exploratória de dados (EDA em inglês). Nessa EDA já conheceremos melhor as variáveis com as que estamos trabalhando, bem como as unidades de medida.↩︎
Geralmente, preferimos o \(R^2_{Adjusted}\) ao \(R^2\)↩︎
\(2.076e-03*481 = 0.998556 \approx 1\)↩︎
\(0.1242*8 = 0.9936 \approx 1\)↩︎
Wooldridge, J. M. (2016). Introdução à Econometria: Uma abordagem moderna. Cengage.↩︎
For attribution, please cite this work as
Trucíos (2021, Feb. 25). Statistical Data Science: Intro à Regressão Linear. Retrieved from https://ctruciosm.github.io/statblog/posts/2021-02-25-intro-regressao-linear/
BibTeX citation
@misc{trucíos2021intro, author = {Trucíos, Carlos}, title = {Statistical Data Science: Intro à Regressão Linear}, url = {https://ctruciosm.github.io/statblog/posts/2021-02-25-intro-regressao-linear/}, year = {2021} }