Intro à Regressão Linear

Linear Regression R Python rstats

Uma breve introdução à Análise de Regressão Linear: interpretação e implementação no R (e no Python).

Carlos Trucíos https://ctruciosm.github.io
02-25-2021

Introdução

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.

Estimação por MQO

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.

OLS regression line example

Figure 1: OLS regression line example

Implementação no R

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

Interpretação

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.

library(dplyr)
hprice1 %>% select(price, bdrms, lotsize, sqrft, colonial) %>% glimpse()
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\)

Conclusões

Bonus

Implementação em Python

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:                Sáb, 24 Jul 2021   Prob (F-statistic):           1.45e-19
Time:                        10:24:23   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.

  1. A ideia básica deste método é encontrar os valores \(\hat{\beta}\)’s que minimizam a soma de quadrados dos residuos.↩︎

  2. 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\)↩︎

  3. 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.↩︎

  4. Geralmente, preferimos o \(R^2_{Adjusted}\) ao \(R^2\)↩︎

  5. \(2.076e-03*481 = 0.998556 \approx 1\)↩︎

  6. \(0.1242*8 = 0.9936 \approx 1\)↩︎

  7. Wooldridge, J. M. (2016). Introdução à Econometria: Uma abordagem moderna. Cengage.↩︎

Citation

For attribution, please cite this work as

Trucíos (2021, Feb. 25). Carlos Trucíos: Intro à Regressão Linear. Retrieved from https://ctruciosm.github.io/posts/2021-02-25-intro-regressao-linear/

BibTeX citation

@misc{trucíos2021intro,
  author = {Trucíos, Carlos},
  title = {Carlos Trucíos: Intro à Regressão Linear},
  url = {https://ctruciosm.github.io/posts/2021-02-25-intro-regressao-linear/},
  year = {2021}
}