O modelo de regressão linear explica a estrutura do fenômeno em observação a partir de uma variável explicativa (X) em relação a outra considerada uma variável dependente (Y).
\[
y=\beta_0+\beta_1x_i
\]
Para efeito de ilustração, considere os dados apresentados na a seguir (disponíveis no arquivo dados1,xlsx), oriundos de um estudo cujo objetivo é avaliar como a distância(m) com que motoristas conseguem distinguir um determinado objeto (doravante indicada simplesmente como distância) varia com a idade(anos).
Abrindo dados e tabela resumo
##install.packages("tidyverse")library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.2 ✔ tibble 3.2.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.0.4
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Rows: 30 Columns: 3
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
dbl (3): Ident, Idade, Distancia
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
summary(dados)
Ident Idade Distancia
Min. : 1.00 Min. :18.00 Min. : 93.0
1st Qu.: 8.25 1st Qu.:28.25 1st Qu.:120.8
Median :15.50 Median :54.00 Median :140.0
Mean :15.50 Mean :51.00 Mean :141.1
3rd Qu.:22.75 3rd Qu.:70.75 3rd Qu.:153.0
Max. :30.00 Max. :82.00 Max. :197.0
Histograma das variáveis
par(mfrow =c(1, 2))hist(dados$Idade,main ="Histograma da v.a Idade(anos)",xlab="Idade(anos)")hist(dados$Distancia,main ="Histograma da v.a Distancia(m)",xlab="Distancia(m)")
Correlação
cor(dados[,2:3])
Idade Distancia
Idade 1.0000000 -0.8014795
Distancia -0.8014795 1.0000000
Teste de correlação
cor.test(dados$Idade,dados$Distancia)
Pearson's product-moment correlation
data: dados$Idade and dados$Distancia
t = -7.0918, df = 28, p-value = 1.026e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.9014550 -0.6203294
sample estimates:
cor
-0.8014795
Gráfico de dispersão
plot(dados$Idade,dados$Distancia,main ="Dispersão Idade(anos) VS Distancia(m)",xlab="Idade(anos)",ylab="Distancia(m)")
Ajustando o modelo de regressão linear simples
ajuste<-lm(Distancia~Idade, data = dados)summary(ajuste)
Call:
lm(formula = Distancia ~ Idade, data = dados)
Residuals:
Min 1Q Median 3Q Max
-26.041 -13.529 2.388 11.478 35.994
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 192.3003 7.8301 24.559 < 2e-16 ***
Idade -1.0039 0.1416 -7.092 1.03e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 16.6 on 28 degrees of freedom
Multiple R-squared: 0.6424, Adjusted R-squared: 0.6296
F-statistic: 50.29 on 1 and 28 DF, p-value: 1.026e-07
Gráfico de dispersão com a linha ajustada
plot(dados$Idade,dados$Distancia,main ="Dispersão Idade(anos) VS Distancia(m)",xlab="Idade(anos)",ylab="Distancia(m)")abline(ajuste, col ="blue")
Análise de Residuos
par(mfrow=c(2,2))plot(ajuste)
Análise de Residuos
plot(ajuste, which=c(1:4),pch=20)
Histograma do residuos
hist(ajuste$residuals)
Teste de normalidade
As hipóteses do teste são:
\(H_0\)(hipótese nula): Os dados seguem uma distribuição normal.
\(H_1\) (Hipótese Alternativa): Os dados não seguem uma distribuição normal.
P-valor > 0.05 para não rejeitar a normalidade
Amostra pequena (n<50) utilizar o teste de shapiro-wilk
shapiro.test(ajuste$residuals)
Shapiro-Wilk normality test
data: ajuste$residuals
W = 0.97203, p-value = 0.596
Ajuste perfeito
Gráfico de dispersão utilizando o pacote ggplot
library(ggplot2)ggplot(dados, aes(x = Idade, y = Distancia)) +geom_point() +geom_smooth(method ="lm", se =TRUE)
`geom_smooth()` using formula = 'y ~ x'
Gráfico de residuos utilizano o pacote ggplot
library(car)
Carregando pacotes exigidos: carData
Anexando pacote: 'car'
O seguinte objeto é mascarado por 'package:dplyr':
recode
O seguinte objeto é mascarado por 'package:purrr':
some
qqPlot(ajuste, main ="Q-Q Plot com Envelope de Confiança", id =FALSE)
Rows: 526 Columns: 6
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (1): sexo
dbl (5): salario, educacao, experiencia, tememp, numdep
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
summary(dados)
salario educacao experiencia tememp
Min. : 0.530 Min. : 0.00 Min. : 1.00 Min. : 0.000
1st Qu.: 3.330 1st Qu.:12.00 1st Qu.: 5.00 1st Qu.: 0.000
Median : 4.650 Median :12.00 Median :13.50 Median : 2.000
Mean : 5.896 Mean :12.56 Mean :17.02 Mean : 5.105
3rd Qu.: 6.880 3rd Qu.:14.00 3rd Qu.:26.00 3rd Qu.: 7.000
Max. :24.980 Max. :18.00 Max. :51.00 Max. :44.000
numdep sexo
Min. :0.000 Length:526
1st Qu.:0.000 Class :character
Median :1.000 Mode :character
Mean :1.044
3rd Qu.:2.000
Max. :6.000
par(mfrow =c(1, 2))hist(dados$salario,main ="Histograma da v.a salario",xlab="Idade(anos)")hist(log(dados$salario),main ="Histograma da v.a log do salario",xlab="Idade(anos)")
Gráfico de dispersão
plot(dados$educacao,log(dados$salario),main ="Dispersão salário VS educacao",xlab="educacao",ylab="salario")
Ajustando o modelo de regressão linear simples
ajuste<-lm(log(salario)~educacao, data = dados)summary(ajuste)
Call:
lm(formula = log(salario) ~ educacao, data = dados)
Residuals:
Min 1Q Median 3Q Max
-2.21158 -0.36393 -0.07263 0.29712 1.52339
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.583773 0.097336 5.998 3.74e-09 ***
educacao 0.082744 0.007567 10.935 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.4801 on 524 degrees of freedom
Multiple R-squared: 0.1858, Adjusted R-squared: 0.1843
F-statistic: 119.6 on 1 and 524 DF, p-value: < 2.2e-16
Gráfico de dispersão Educação vs log Salário
plot(dados$educacao,log(dados$salario),main ="Dispersão Log salário VS educacao",xlab="educacao",ylab="salario")abline(ajuste, col ="blue")
Análise de Residuos
par(mfrow=c(2,2))plot(ajuste)
Histograma dos residuos
hist(ajuste$residuals)
Teste de normalidade
As hipóteses do teste são:
\(H_0\)(hipótese nula): Os dados seguem uma distribuição normal.
\(H_1\) (Hipótese Alternativa): Os dados não seguem uma distribuição normal.
P-valor > 0.05 para não rejeitar a normalidade
Amostra pequena (n<50) utilizar o teste de shapiro-wilk
Para amostra grande (n>50) utilizar o teste de Kolmogorov-Smirnov com correção de Correção de Lilliefors
library(nortest)lillie.test(ajuste$residuals)
Lilliefors (Kolmogorov-Smirnov) normality test
data: ajuste$residuals
D = 0.066288, p-value = 9.34e-06