Análise de Regressão é uma técnica estatística usada para: Estimar a relação entre Y (variável resposta) e X (variável explicativa), Predizer valores de Y a partir de X, Avaliar a força e direção da relação entre as variáveis.

O modelo básico é:

\(Y = \beta_0 + \beta_1 X + \varepsilon\)

Onde:

\(\beta_0\) - coeficiente linear (intercepto)

\(\beta_1\) - coeficiente angular (inclinação)

\(\varepsilon\) - termo de erro

Na forma matricial : \(\mathbf{y} = \mathbf{X} \boldsymbol{\beta} + \mathbf{e}\)

Onde:

y - vetor de variáveis dependentes

X - matriz de variáveis independentes

β - vetor de coeficientes

e - vetor de termos de erro

Pacotes básicos de para análise de regressão in R

O pacote stats é essencial para uma análise de regressão, ele apresenta as seguintes funções:

lm() Regressão linear

glm() Modelos lineares generalizados

anova() Análise de variância

nls() Mínimos quadrados não-lineares

O pacote stats já vem instalado no R. Outros pacotes precisam ser instalados com a função install.packages() e quando usados, precisam ser carregados com a função library ().

Outros pacotes mais comum são broom, car e Mass. Estes precisam de instalação, (não estão instalados por padrão). Para instalar usamos a função install. packages() seguida do nome do pacote entre aspas

exemplo: install.packages(c(“broom”, “car”, “lme4”, “glmnet”, “mgcv”))

regressão linear simples

vamos fazer uma análise de regressão simples com os dados do R, mtcars

mtcars é um conjunto de dados embutido no R, derivado da revista Motor Trend US (1974). Ele contém características de 32 modelos de carros, incluindo desempenho, consumo e especificações do motor.

Para rodar uma regressão no R é preciso visualizar e entender os dados,

deve-se descobrir o propósito do estudo e mais sobre como os dados foram coletados. (Faraway,2005).

Com a função head (), names() e view() podemos visualizar os primeiros dados, o nome das variáveis e visualizar em forma de tabela.

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

names(mtcars)
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"

com a função str() conseguimos uma visualizar a estrutura do conjuto de dados como tipo de variáveis, observções e formato.

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

A função summary() mostra um resumo estatatístico dos dados como máximos , mínimos médias, quantis, media e medianas

summary(mtcars)
##       mpg             cyl             disp             hp       
##  Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
##  1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
##  Median :19.20   Median :6.000   Median :196.3   Median :123.0  
##  Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
##  3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
##  Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
##       drat             wt             qsec             vs        
##  Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
##  1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
##  Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
##  Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
##  3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
##  Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
##        am              gear            carb      
##  Min.   :0.0000   Min.   :3.000   Min.   :1.000  
##  1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
##  Median :0.0000   Median :4.000   Median :2.000  
##  Mean   :0.4062   Mean   :3.688   Mean   :2.812  
##  3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :1.0000   Max.   :5.000   Max.   :8.000

Depois de carregar, explorar e compreender os dados, podemos finalmente ajustar o modelo de regressão linear.

Aplicando aos dados do mtcars

com uma análise de regressão simples de duas variáveis, Vamos analisar como o peso do carro (wt) em 1000 lbs, influencia o consumo (mpg) em milhas por galão.

Moelo Teórico

\[ Y = \beta_0 + \beta_1 X + \varepsilon \\\]

Nosso modelo de análise

\[ \text{mpg} = \beta_0 + \beta_1 \cdot \text{wt} + \varepsilon \]

Onde:

$$ \[\begin{align*} Y &= \text{mpg (milhas por galão)} \\ X &= \text{wt (peso em 1000 lbs)} \\ \beta_0 &= \text{intercepto} \\ \beta_1 &= \text{coeficiente angular} \\ \varepsilon &= \text{termo de erro} \end{align*}\]$$

Podemos fazer uma visualização prévia criando um dataframe para as duas variáveis

dados<- mtcars
tabela_Peso_X_Consumo<- data.frame(Peso = dados$wt,
                    Consumo = dados$mpg)
tabela_Peso_X_Consumo
##     Peso Consumo
## 1  2.620    21.0
## 2  2.875    21.0
## 3  2.320    22.8
## 4  3.215    21.4
## 5  3.440    18.7
## 6  3.460    18.1
## 7  3.570    14.3
## 8  3.190    24.4
## 9  3.150    22.8
## 10 3.440    19.2
## 11 3.440    17.8
## 12 4.070    16.4
## 13 3.730    17.3
## 14 3.780    15.2
## 15 5.250    10.4
## 16 5.424    10.4
## 17 5.345    14.7
## 18 2.200    32.4
## 19 1.615    30.4
## 20 1.835    33.9
## 21 2.465    21.5
## 22 3.520    15.5
## 23 3.435    15.2
## 24 3.840    13.3
## 25 3.845    19.2
## 26 1.935    27.3
## 27 2.140    26.0
## 28 1.513    30.4
## 29 3.170    15.8
## 30 2.770    19.7
## 31 3.570    15.0
## 32 2.780    21.4

A partir da visualização podemos entender como as variáveis estão relacionadas, com um gráfico de dispersão.

plot(dados$wt, dados$mpg, main= "Relação entre Peso e Consumo de Combustível",
     xlab = "peso", ylab = "consumo")

Podemos observar uma relação entre o peso e o consumo e fazer suposições sobre o comportamento dos dados. O modelo de regressão linear pode confirmar ou não nossas suposições.

No R, isso é feito com a função lm(), que significa linear model.

Sintaxe: lm(formula, data = conjunto_de_dados)

formula: representa a relação entre Y e X

a fórmula sempre segue o padrão

Y ~ X lê-se como: “Y é explicado por X”.

data: diz ao R de onde são tiradas as variáveis.

Rodar o modelo

dados<- mtcars
modelo<- lm(mpg~wt, data = dados)
modelo
## 
## Call:
## lm(formula = mpg ~ wt, data = dados)
## 
## Coefficients:
## (Intercept)           wt  
##      37.285       -5.344

interpretando os resultados

intercept: representa o β₀, o valor de y quando β1 é zero. No modelo o β₀ foi de 37.285.

β₁: representa a inclinação, ou para cada aumento no peso, o carro pede cerca de 5.344 mpg. Não referimos as unidades.

podemos fazer uma suposição e formular hipóteses de que há uma relação negativa entre o peso e consumo. A confimração ou não dependerá dos testes estatísticos.

Nosso modelo de regressão ficaria:

\[ \text{mpg} = 37.285 - 5.344 \cdot \text{wt} + \varepsilon \] # análise de variância

Procedimento para comparar tratamentos

a ANOVA (Análise de Variância) decompõe a variabilidade total do Y (no caso, mpg) em dois componentes:

Variação explicada pelo modelo (devida à variável wt)

Variação não explicada (erro, resíduos)

ainda traz análise que permite testar se o modelo como um todo é estatisticamente significativo.

anova(modelo)
## Analysis of Variance Table
## 
## Response: mpg
##           Df Sum Sq Mean Sq F value    Pr(>F)    
## wt         1 847.73  847.73  91.375 1.294e-10 ***
## Residuals 30 278.32    9.28                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

estatística F do teste de significância global da regressão. \[F = \frac{\text{Variação Explicada}}{\text{Variação Não Explicada}} \]

Quanto maior o F, maior a capacidade explicativa do modelo.

91.375 é um valor extremamente alto.

Pr(>F) = 1.294e-10 Esse é o p-valor do teste F global, que testa:

\[ \begin{cases} H_0: \beta_1 = 0 \quad \text{(wt não explica mpg)} \\ H_1: \beta_1 \neq 0 \end{cases} \]

A análise de variância indicou que o modelo linear simples que relaciona mpg e wt é altamente significativo (F = 91.38; p < 0.001). A soma de quadrados explicada pelo peso (847.73) representa a maior parte da variabilidade total de mpg, indicando que o peso do veículo é um forte preditor do consumo. Dessa forma, rejeita-se a hipótese nula de que β₁ = 0, concluindo que wt exerce influência estatisticamente significativa sobre mpg.

Regressão múltipla

Para uma análise de regressão múltipla, vamos adicionar mais duaas duas variáveis explicativas ao modelo de consumo mpg.

Vamos manter:

mpg : variável resposta (Y)

E usar como explicativas: wt : peso; hp : potência e cyl : número de cilindros

Ajustar um modelo como :

\[ \text{mpg} = \beta_0 + \beta_1 \cdot \text{wt} + \beta_2 \cdot \text{hp} + \beta_3 \cdot \text{cyl} + \varepsilon \]

names(mtcars)
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"

Vamos entender como essas variáveis influenciam o consumo.

basta acrescentar o sina de adião (+) e o nome da váriável no modelo

dados <- mtcars

modelo_multiplo <- lm(mpg ~ wt + hp + cyl, data = dados)
modelo_multiplo
## 
## Call:
## lm(formula = mpg ~ wt + hp + cyl, data = dados)
## 
## Coefficients:
## (Intercept)           wt           hp          cyl  
##    38.75179     -3.16697     -0.01804     -0.94162

Interpretação:

Intercepto (β₀ = 38.751)

Valor estimado de mpg quando wt = hp = cyl = 0 (interpretação teórica).

wt (β₁ = -3.167) Mantendo hp e cyl constantes, cada aumento de 1.000 lbs reduz em 3.17 mpg.

hp (β₂ = -0.032) Cada aumento de 1 hp diminui o consumo em 0.032 mpg, mantendo as outras variáveis fixas.

cyl (β₃ = -1.226) Cada cilindro adicional reduz o mpg em cerca de 1.23 mpg, tudo mais constante.

\[ \text{mpg} = 38.751 - 3.167 \cdot \text{wt} - 0.0321 \cdot \text{hp} - 1.226 \cdot \text{cyl} + \varepsilon \]

anova(modelo_multiplo)
## Analysis of Variance Table
## 
## Response: mpg
##           Df Sum Sq Mean Sq  F value    Pr(>F)    
## wt         1 847.73  847.73 134.3916 3.349e-12 ***
## hp         1  83.27   83.27  13.2016  0.001112 ** 
## cyl        1  18.43   18.43   2.9213  0.098480 .  
## Residuals 28 176.62    6.31                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Da tabela ANOVA, obtém-se o Quadrado Médio (Mean Sq) Residual, que é uma estimativa para a variância dos erros (σ^2), ou seja, s^2 = 6.31

Com a função summary() podemos obter um resumo estattístico do novo modelo

summary(modelo_multiplo)
## 
## Call:
## lm(formula = mpg ~ wt + hp + cyl, data = dados)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.9290 -1.5598 -0.5311  1.1850  5.8986 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 38.75179    1.78686  21.687  < 2e-16 ***
## wt          -3.16697    0.74058  -4.276 0.000199 ***
## hp          -0.01804    0.01188  -1.519 0.140015    
## cyl         -0.94162    0.55092  -1.709 0.098480 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.512 on 28 degrees of freedom
## Multiple R-squared:  0.8431, Adjusted R-squared:  0.8263 
## F-statistic: 50.17 on 3 and 28 DF,  p-value: 2.184e-11

para anaçisar se uma ou mais variáveis são significativas no no modelo, fazemos o teste t

Cada teste t é individual para cada coeficiente da regressão múltipla.

serve parta testar se

,

\[ H_0: \beta_i = 0 \quad \text{vs} \quad H_1: \beta_i \neq 0 \] com a fórmula:

\[ t = \frac{\hat{\beta}_i}{\text{EP}(\hat{\beta}_i)} \] ## Interpretação dos testes t no modelo de regressão múltipla

Intercept

t = 21.687, p < 2e-16 → extremamente significativo

O intercepto é estatisticamente diferente de zero.

wt (peso)

t = -4.276, p = 0.000199 → altamente significativo (***)

O peso do carro tem forte efeito negativo sobre mpg.

hp (potência)

t = -1.519, p = 0.14 → não significativo

Após ajustar o peso e o número de cilindros, a potência não apresenta efeito significativo sobre mpg.

cyl (número de cilindros)

t = -1.709, p = 0.098 → marginalmente significativo (.)

Efeito negativo, mas fraco; p > 0.05 → evidência insuficiente para significancia segura.

Fazer predição com o modelo :

Depois de ajustar um modelo de regressão, ele pode ser usado para prever valores de Y para novos valores de X, estimar intervalos de confiança e estimar intervalos de previsão. Função predict (),

Sintaxe:

predict(modelo, newdata, interval = “confidence”, level = 0.95)

newdata: um data frame contendo valores da variável para prever

interval: tipo de intervalo: “confidence” ou “prediction”

level: nível de confiança (padrão 0.95)

modelo <- lm(mpg ~ wt, data = mtcars)

novo <-data.frame(wt=3) # inserindo o peso de 3 lb


predict(modelo, newdata = novo)
##        1 
## 21.25171

Dependendo da quantidade de valores que desejamos predizer, podemos criar um vetor de núneroscom a função c()

Predizer <- data.frame(
  wt = c(2.5, 3.0, 3.5, 4.0)  # Pesos, veor de valores com c()
)

predicoes <- predict(modelo, newdata = Predizer)
predicoes
##        1        2        3        4 
## 23.92395 21.25171 18.57948 15.90724

Predição para o modelo de regressão múltipla: novos valores para as variáveis

Predicao <- data.frame(
  wt = c(2.0, 3.5, 4.0),
  hp = c(90, 150, 200),
  cyl = c(4, 6, 8)
)

predict(modelo_multiplo, newdata = Predicao)
##        1        2        3 
## 27.02794 19.31197 14.94334

Predições com intervalo de confiança = “confidence”

predict(modelo_multiplo, newdata = Predicao, interval = "confidence")
##        fit      lwr      upr
## 1 27.02794 25.47971 28.57618
## 2 19.31197 18.22297 20.40096
## 3 14.94334 13.63215 16.25453

Esse valores significam

fit: Valor previsto

lw:limite inferior

upr: limite superior

Depois de estimar um modelo de regressão, a próxima etapa importante é avaliar a qualidade estatística do modelo e a significância das variáveis. Isso é feito por meio de testes de hipótese, que indicam se os coeficientes realmente têm efeito sobre a variável resposta.

Testes de normalidade, homocedasticidade e autocorrelação — pacote lmtest

Na regressão linear clássica, as suposições do modelo são essenciais para que

os coeficientes estimados sejam não viesados, as inferências (teste t, F, intervalos de confiança) sejam válidas. As principais suposições são:

Normalidade dos resíduos

Homocedasticidade - variância constante dos erros:

Independência / autocorrelação - erros não correlacionados:

Se essas suposições forem violadas, os resultados de t, F e intervalos podem não ser confiáveis.

O pacote lmtest é muito usado para testes em análise de regressão.

algumas funções importantes são:

bptest() Breusch-Pagan Testa heterocedasticidade

dwtest() Durbin-Watson Testa autocorrelação dos resíduos

coeftest() Teste robusto dos coeficientes P-valores robustos

resettest() Ramsey RESET Testa especificação do modelo

instalação e carregamento:

library("lmtest")
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric

importante quando se estima um modelo linear por MQO, verificar se o pressuposto de Gauss-Markov não é violado. Os resíduos devem ter Varância constante. Hipótese da homocedasticidade dos resíduos

Homocedadasticidade

# 1.1 Teste de Breusch-Pagan (lmtest)

library(lmtest)
bptest(modelo_multiplo)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_multiplo
## BP = 2.9351, df = 3, p-value = 0.4017

autocorrelação

# 2.1 Teste de Durbin-Watson
dwtest(modelo_multiplo)
## 
##  Durbin-Watson test
## 
## data:  modelo_multiplo
## DW = 1.6441, p-value = 0.1002
## alternative hypothesis: true autocorrelation is greater than 0

Gráficos de diagnóstico dos Residuos

par(mfrow = c(2, 2))
plot(modelo_multiplo)

par(mfrow = c(1, 1))