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
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”))
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"
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
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*}\]$$
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.
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.
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.
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
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
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
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.
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
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
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
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
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
library("lmtest")
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
# 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
# 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
par(mfrow = c(2, 2))
plot(modelo_multiplo)
par(mfrow = c(1, 1))