Análise de Regressão Linear

Author

Silvio Aparecido da Silva

Modelo de Regressão Linear simples

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).

  1. 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
dados<-read_csv("https://raw.githubusercontent.com/Silvioest/teste/refs/heads/master/dados1.csv")
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  
  1. 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)")

  1. Correlação
cor(dados[,2:3])
               Idade  Distancia
Idade      1.0000000 -0.8014795
Distancia -0.8014795  1.0000000
  1. 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 
  1. Gráfico de dispersão
plot(dados$Idade,dados$Distancia,
     main = "Dispersão Idade(anos) VS Distancia(m)",
     xlab="Idade(anos)",
     ylab="Distancia(m)")

  1. 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
  1. 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")

  1. Análise de Residuos
par(mfrow=c(2,2))
plot(ajuste)

  1. Análise de Residuos
plot(ajuste, which=c(1:4),pch=20)

  1. Histograma do residuos
hist(ajuste$residuals)

  1. 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

  1. 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'

  1. 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)

Exemplo 2 -Modelo de Regressão Linear

Dados da Pesquisa Populacional de 1976 nos EUA

Um data.frame com 526 observações em 6 variáveis:

salario: salário médio por hora

educacao: anos de escolaridade

experiencia: anos de experiência potencial

tememp: anos no emprego atual

numdep: número de dependentes

sexo: = mulher e homem

  1. Abrindo dados e tabela resumo
dados<-read_csv("https://raw.githubusercontent.com/Silvioest/teste/refs/heads/master/dados2.csv")
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                     
  1. Correlação
cor(dados[,1:4])
              salario    educacao experiencia      tememp
salario     1.0000000  0.40590333   0.1129034  0.34688957
educacao    0.4059033  1.00000000  -0.2995418 -0.05617257
experiencia 0.1129034 -0.29954184   1.0000000  0.49929145
tememp      0.3468896 -0.05617257   0.4992914  1.00000000
  1. Histograma da variável salário
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)")

  1. Gráfico de dispersão
plot(dados$educacao,log(dados$salario),
     main = "Dispersão salário VS educacao",
     xlab="educacao",
     ylab="salario")

  1. 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
  1. 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")

  1. Análise de Residuos
par(mfrow=c(2,2))
plot(ajuste)

  1. Histograma dos residuos
hist(ajuste$residuals)

  1. 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

Os residuos não seguem uma distribuição normal