Suposições do modelo de regressão

Até aqui, ao ajustar o modelo \(\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}\), assumimos que (Montgomery, Cap. 4.1):

  1. A relação entre a resposta \(y\) e os regressores é linear (ao menos aproximadamente);
  2. O erro \(\varepsilon\) tem média zero;
  3. O erro \(\varepsilon\) tem variância constante \(\sigma^2\) (homocedasticidade);
  4. Os erros são não correlacionados;
  5. Os erros têm distribuição normal.

As suposições 4 e 5 juntas implicam que os erros são independentes. A suposição 5 é necessária para os testes de hipóteses e a construção de intervalos.

Devemos sempre considerar duvidosa a validade dessas suposições e conduzir análises para examinar a adequação do modelo proposto.

O que faremos nesta aula

  • Cap. 4 — Adequação do modelo: análise de resíduos, gráficos de resíduos, estatística PRESS e detecção de outliers;
  • Cap. 5 — Transformações: estabilização de variância e linearização;
  • Cap. 6 — Leverage e influência: hat matrix, distância de Cook, DFBETAS e DFFITS;
  • Cap. 7 — Regressão polinomial: modelos de 2ª ordem e interação;
  • Cap. 8 — Variáveis indicadoras: variáveis qualitativas na regressão.

Referência principal: Montgomery, D. C.; Peck, E. A.; Vining, G. G. Introduction to Linear Regression Analysis, 6ª ed. Wiley, 2021 (Cap. 4 a 8).

Definição de resíduo

O resíduo é a diferença entre o valor observado e o valor ajustado:

\[ e_i = y_i - \hat{y}_i, \qquad i = 1, 2, \ldots, n. \]

O resíduo pode ser visto como o desvio entre o dado e o ajuste — logo, é uma medida da variabilidade da resposta não explicada pelo modelo. Qualquer desvio das suposições sobre os erros deve aparecer nos resíduos.

Os resíduos têm média zero e sua variância média aproximada é estimada por

\[ \frac{\sum_{i=1}^{n}(e_i - \bar{e})^2}{n-p} = \frac{\sum_{i=1}^{n} e_i^2}{n-p} = \frac{SS_{Res}}{n-p} = MS_{Res}. \]

Escalonamento dos resíduos

Para comparar resíduos em escala comum e detectar observações atípicas, usamos versões escalonadas (Montgomery, 4.2.1):

Resíduo Fórmula Uso
Bruto \(e_i = y_i - \hat{y}_i\) base
Padronizado \(d_i = \dfrac{e_i}{\sqrt{MS_{Res}}}\) \(\lvert d_i\rvert > 3\) sugere outlier
Studentizado (interno) \(r_i = \dfrac{e_i}{\sqrt{MS_{Res}(1-h_{ii})}}\) variância constante
PRESS \(e_{(i)} = \dfrac{e_i}{1-h_{ii}}\) capacidade preditiva
R-Student (externo) \(t_i = \dfrac{e_i}{\sqrt{S^2_{(i)}(1-h_{ii})}}\) outlier

onde \(h_{ii}\) é o elemento \(i\) da diagonal da matriz \(\mathbf{H}\).

Resíduo padronizado

Como a variância média aproximada de um resíduo é estimada por \(MS_{Res}\), um escalonamento natural é o resíduo padronizado:

\[ d_i = \frac{e_i}{\sqrt{MS_{Res}}}, \qquad i = 1, 2, \ldots, n. \]

Os resíduos padronizados têm média zero e variância aproximadamente unitária. Um resíduo padronizado grande (\(\lvert d_i \rvert > 3\), por exemplo) sinaliza um potencial outlier.

Resíduo studentizado

Usar \(MS_{Res}\) como variância do \(i\)-ésimo resíduo é apenas uma aproximação. Podemos melhorar o escalonamento usando o desvio-padrão exato do resíduo. Como \(\mathbf{e} = (\mathbf{I}-\mathbf{H})\mathbf{y}\),

\[ \mathrm{Var}(\mathbf{e}) = \sigma^2(\mathbf{I}-\mathbf{H}) \quad\Longrightarrow\quad \mathrm{Var}(e_i) = \sigma^2(1-h_{ii}). \]

Assim, o resíduo studentizado é

\[ r_i = \frac{e_i}{\sqrt{MS_{Res}(1-h_{ii})}}, \qquad i = 1, 2, \ldots, n, \]

que tem variância constante \(\mathrm{Var}(r_i)=1\) quando o modelo está correto.

Resíduo PRESS

Outra forma de tornar os resíduos úteis na detecção de outliers é examinar \(y_i - \hat{y}_{(i)}\), em que \(\hat{y}_{(i)}\) é o valor ajustado da \(i\)-ésima resposta com base em todas as observações, exceto a \(i\)-ésima:

\[ e_{(i)} = y_i - \hat{y}_{(i)} = \frac{e_i}{1-h_{ii}}. \]

O resíduo PRESS é o resíduo comum ponderado pelos elementos \(h_{ii}\) da hat matrix. Pontos com \(h_{ii}\) grande terão resíduos PRESS grandes — em geral, pontos de alta influência. Sua variância é

\[ \mathrm{Var}\!\left[e_{(i)}\right] = \frac{\sigma^2}{1-h_{ii}}, \]

de modo que o PRESS padronizado coincide com o resíduo studentizado.

Resíduo R-Student

O resíduo studentizado \(r_i\) usa \(MS_{Res}\) (escalonamento interno). Uma alternativa é estimar \(\sigma^2\) sem a \(i\)-ésima observação:

\[ S^2_{(i)} = \frac{(n-p)MS_{Res} - e_i^2/(1-h_{ii})}{n-p-1}. \]

Usando essa estimativa obtemos o resíduo externamente studentizado (R-Student):

\[ t_i = \frac{e_i}{\sqrt{S^2_{(i)}(1-h_{ii})}}, \qquad i = 1, 2, \ldots, n. \]

Se a \(i\)-ésima observação for influente, \(S^2_{(i)}\) difere bastante de \(MS_{Res}\), e o R-Student é mais sensível a esse ponto.

O conjunto de dados (Exemplo 3.1, p. 76)

Uma engarrafadora de refrigerantes analisa as rotas de atendimento a máquinas de venda. Deseja-se prever o tempo \(y\) (minutos) que o entregador gasta para abastecer as máquinas, em função do número de caixas \(x_1\) e da distância caminhada \(x_2\) (pés). São 25 observações.

entrega <- data.frame(
  ID = 1:25,
  y  = c(16.68, 11.50, 12.03, 14.88, 13.75, 18.11, 8.00, 17.83, 79.24, 21.50,
         40.33, 21.00, 13.50, 19.75, 24.00, 29.00, 15.35, 19.00, 9.50, 35.10,
         17.90, 52.32, 18.75, 19.83, 10.75),
  x1 = c(7, 3, 3, 4, 6, 7, 2, 7, 30, 5, 16, 10, 4, 6, 9, 10, 6, 7, 3, 17, 10, 26, 9, 8, 4),
  x2 = c(560, 220, 340, 80, 150, 330, 110, 210, 1460, 605, 688, 215, 255, 462, 448,
         776, 200, 132, 36, 770, 140, 810, 450, 635, 150)
)
head(entrega)
#>   ID     y x1  x2
#> 1  1 16.68  7 560
#> 2  2 11.50  3 220
#> 3  3 12.03  3 340
#> 4  4 14.88  4  80
#> 5  5 13.75  6 150
#> 6  6 18.11  7 330

Ajuste do modelo de regressão múltipla

\[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \varepsilon \]

mod <- lm(y ~ x1 + x2, data = entrega)
coef(mod)
#> (Intercept)          x1          x2 
#>    2.341231    1.615907    0.014385

O modelo ajustado é \(\hat{y} = 2.341 + 1.616\,x_1 + 0.0144\,x_2\) (compare com Montgomery, Tab. 3.2).

Sumário do ajuste

summary(mod)
#> 
#> Call:
#> lm(formula = y ~ x1 + x2, data = entrega)
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -5.788 -0.663  0.436  1.157  7.420 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)  2.34123    1.09673    2.13  0.04417 *  
#> x1           1.61591    0.17073    9.46  3.3e-09 ***
#> x2           0.01438    0.00361    3.98  0.00063 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 3.26 on 22 degrees of freedom
#> Multiple R-squared:  0.96,   Adjusted R-squared:  0.956 
#> F-statistic:  261 on 2 and 22 DF,  p-value: 4.69e-16

Os cinco tipos de resíduos

res_1 <- residuals(mod)                 # brutos:        e_i
res_2 <- res_1 / summary(mod)$sigma      # padronizados:  d_i
res_3 <- rstandard(mod)                  # studentizados: r_i (interno)
res_4 <- rstandard(mod, type = "pred")   # PRESS:         e_(i)
res_5 <- rstudent(mod)                   # R-Student:     t_i (externo)

residuos <- data.frame(
  brutos       = res_1,
  padronizados = res_2,
  studentizado = res_3,
  PRESS        = res_4,
  RStudent     = res_5
)
round(head(residuos, 10), 3)
#>    brutos padronizados studentizado  PRESS RStudent
#> 1  -5.028       -1.543       -1.628 -5.598   -1.696
#> 2   1.146        0.352        0.365  1.234    0.358
#> 3  -0.050       -0.015       -0.016 -0.055   -0.016
#> 4   4.924        1.511        1.580  5.384    1.639
#> 5  -0.444       -0.136       -0.142 -0.480   -0.139
#> 6  -0.290       -0.089       -0.091 -0.303   -0.089
#> 7   0.845        0.259        0.270  0.920    0.265
#> 8   1.157        0.355        0.367  1.235    0.359
#> 9   7.420        2.276        3.214 14.789    4.311
#> 10  2.376        0.729        0.813  2.957    0.807

Recomenda-se usar o resíduo studentizado ou R-Student. Espera-se que sigam, aproximadamente, uma distribuição \(t\) com \(n-p-1\) graus de liberdade (ou \(N(0,1)\) para \(n\) grande).

Por que representar graficamente os resíduos?

A análise gráfica dos resíduos é uma forma muito eficaz de investigar a adequação do ajuste e verificar as suposições. Em geral, representamos os resíduos externamente studentizados (que têm variância constante).

Três gráficos fundamentais:

  1. Gráfico de probabilidade normal dos resíduos — verifica normalidade;
  2. Resíduos vs. valores ajustados \(\hat{y}_i\) — verifica variância e linearidade;
  3. Resíduos na ordem temporal — verifica independência (autocorrelação).

Gráfico de probabilidade normal (Figura 4.3)

Pequenos desvios da normalidade não afetam muito o modelo, mas não-normalidade grosseira é séria, pois as estatísticas \(t\) e \(F\) e os intervalos dependem dessa suposição.

Figura 1: Padrões típicos de gráficos de probabilidade normal (dados ilustrativos).

Resíduos vs. valores ajustados (Figura 4.5)

Um gráfico dos resíduos studentizados \(t_i\) contra os valores ajustados \(\hat{y}_i\) é útil para detectar várias inadequações do modelo.

Figura 2: Padrões de resíduos vs. ajustados: (a) satisfatório; (b) funil; (c) duplo arco; (d) não linear.

Os padrões (b), (c) e (d) indicam, respectivamente, variância não constante, variância que cresce e depois decresce, e não-linearidade (falta de termos no modelo).

Resíduos na ordem temporal — autocorrelação

Se a ordem de coleta dos dados é conhecida, convém representar os resíduos contra essa ordem. O ideal é uma faixa horizontal aleatória.

A correlação entre erros em períodos diferentes chama-se autocorrelação e é uma violação potencialmente séria das suposições básicas (tratada no Cap. 14).

Exemplo em R — gráficos de resíduos

qqnorm(res_3, pch = 19, main = "Resíduos studentizados")
qqline(res_3, col = "blue", lwd = 2)

Figura 3: Gráfico de probabilidade normal dos resíduos studentizados (delivery time).

Exemplo em R — resíduos vs. ajustados e ordem

y_est <- fitted(mod)
op <- par(mfrow = c(1, 2), mar = c(4, 4, 2, 1))
plot(y_est, res_3, xlim = c(0, 80), ylim = c(-2, 5), pch = 19,
     main = "vs. ajustados", xlab = "y estimado", ylab = "Resíduo studentizado")
abline(h = 0, col = "grey50")
plot(res_3 ~ entrega$ID, pch = 19,
     main = "vs. ordem (ID)", xlab = "ID (ordem)", ylab = "Resíduo studentizado")
abline(h = 0, col = "grey50")
par(op)

Figura 4: Resíduos studentizados vs. valores ajustados e vs. ordem de coleta.

A observação 9 aparece bem destacada — voltaremos a ela.

Testes para os resíduos — normalidade

Alguns testes de normalidade: Qui-quadrado, Kolmogorov-Smirnov, Jarque-Bera, Shapiro-Wilk, Anderson-Darling, Cramér-von Mises, D’Agostino-Pearson, Lilliefors, Shapiro-Francia.

shapiro.test(res_3)                              # Shapiro-Wilk
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  res_3
#> W = 0.923, p-value = 0.06
ks.test(res_3, "pnorm", mean = 0, sd = 1)        # Kolmogorov-Smirnov
#> 
#>  Exact one-sample Kolmogorov-Smirnov test
#> 
#> data:  res_3
#> D = 0.172, p-value = 0.41
#> alternative hypothesis: two-sided

\(H_0\): os resíduos são normais. p-valores pequenos levam à rejeição de \(H_0\).

Testes para os resíduos — independência

Alguns testes: Durbin-Watson, Breusch-Godfrey e Ljung-Box. É necessário conhecer a ordem de coleta dos dados. Supondo a ordem da variável ID:

# library(lmtest)
dwtest(res_3 ~ entrega$ID, alternative = "two.sided")
#> 
#>  Durbin-Watson test
#> 
#> data:  res_3 ~ entrega$ID
#> DW = 1.4, p-value = 0.073
#> alternative hypothesis: true autocorrelation is not 0

\(H_0\): ausência de autocorrelação (erros independentes).

Testes para os resíduos — homocedasticidade

Alguns testes: Bartlett, Breusch-Pagan, Levene, White, Goldfeld-Quandt, entre outros.

# library(lmtest)
bptest(mod)                                      # Breusch-Pagan
#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  mod
#> BP = 12, df = 2, p-value = 0.0025

\(H_0\): variância dos erros é constante (homocedasticidade).

Definição

O PRESS (prediction error sum of squares), proposto por Allen (1971, 1974), é a soma dos quadrados dos resíduos PRESS:

\[ PRESS = \sum_{i=1}^{n}\left[\,y_i - \hat{y}_{(i)}\,\right]^2 = \sum_{i=1}^{n}\left(\frac{e_i}{1-h_{ii}}\right)^{2}. \]

O PRESS mede quão bem o modelo prevê novos dados. Um modelo com PRESS pequeno é preferível.

Usando o PRESS para comparar modelos

No próprio delivery time, ao acrescentar \(x_2\) (distância) ao modelo que continha apenas \(x_1\) (caixas), o PRESS diminui — indicando melhor capacidade preditiva.

mod_x1  <- lm(y ~ x1, data = entrega)         # só caixas
mod                                            # caixas + distância (já ajustado)
#> 
#> Call:
#> lm(formula = y ~ x1 + x2, data = entrega)
#> 
#> Coefficients:
#> (Intercept)           x1           x2  
#>      2.3412       1.6159       0.0144

PRESS_x1  <- sum(rstandard(mod_x1, type = "pred")^2)
PRESS_x12 <- sum(rstandard(mod,    type = "pred")^2)
c(PRESS_so_x1 = PRESS_x1, PRESS_x1_x2 = PRESS_x12)
#> PRESS_so_x1 PRESS_x1_x2 
#>      733.55      459.04

O PRESS cai de 733.55 (só \(x_1\)) para \(\approx\) 459 (\(x_1+x_2\)) — o modelo de dois regressores prevê melhor. (Montgomery cita 733.55 e 457.40; a pequena diferença é de arredondamento.)

O que é um outlier

Um outlier é uma observação extrema, consideravelmente diferente das demais. Resíduos muito maiores em valor absoluto (três ou quatro desvios-padrão) indicam potenciais outliers no espaço de \(y\).

Os gráficos de resíduos vs. \(\hat{y}_i\) e o gráfico de probabilidade normal ajudam a identificá-los. Examinar resíduos escalonados (studentizado e R-Student) é uma excelente forma de detectar outliers.

Exemplo em R — identificando o outlier

plot(res_3, main = "Resíduos studentizados", pch = 19,
     xlab = "Observações", ylab = "Resíduo studentizado")
abline(h = c(-2, 2), col = "red", lty = 2)
which(abs(res_3) > 2)     # candidatos a outlier
#> 9 
#> 9

Figura 5: Resíduos studentizados com limites de referência ±2.

A observação 9 (\(t_9 \approx 4.3\)) destaca-se claramente.

O que fazer com o outlier?

Uma opção é reestimar o modelo sem a observação e comparar resultados.

mod_sem9 <- lm(y ~ x1 + x2, data = entrega[-9, ])

# comparação dos ajustes
rbind(
  completo = c(coef(mod),     sigma = summary(mod)$sigma,     R2 = summary(mod)$r.squared),
  sem_obs9 = c(coef(mod_sem9), sigma = summary(mod_sem9)$sigma, R2 = summary(mod_sem9)$r.squared)
)
#>          (Intercept)     x1       x2  sigma      R2
#> completo      2.3412 1.6159 0.014385 3.2595 0.95959
#> sem_obs9      4.4472 1.4977 0.010324 2.4300 0.94870
# Comparação via estatística PRESS
PRESS_completo <- sum(rstandard(mod,      type = "pred")^2)
PRESS_sem9     <- sum(rstandard(mod_sem9, type = "pred")^2)
c(PRESS_completo = PRESS_completo, PRESS_sem9 = PRESS_sem9)
#> PRESS_completo     PRESS_sem9 
#>         459.04         165.25

Remover a observação 9 reduz drasticamente \(\hat{\sigma}\) e o PRESS: ela é influente. A decisão de excluir deve, porém, considerar o contexto do problema.

Por que transformar?

Quando a análise de resíduos revela variância não constante ou não-linearidade, uma transformação de \(y\) e/ou dos regressores pode corrigir a inadequação e tornar o modelo linear adequado.

Dois objetivos principais:

  • Estabilizar a variância (Cap. 5.2);
  • Linearizar o modelo (Cap. 5.3).

Transformações estabilizadoras de variância (5.2)

Frequentemente a variância de \(y\) está ligada à sua média. Escolhemos a transformação conforme essa relação (Montgomery, Tabela 5.1):

Relação de \(\sigma^2\) com \(E(y)\) Transformação
\(\sigma^2 \propto \text{constante}\) \(y' = y\) (nenhuma)
\(\sigma^2 \propto E(y)\) \(y' = \sqrt{y}\) (Poisson)
\(\sigma^2 \propto E(y)\,[1-E(y)]\) \(y' = \operatorname{sen}^{-1}(\sqrt{y})\) (proporções)
\(\sigma^2 \propto [E(y)]^2\) \(y' = \ln(y)\)
\(\sigma^2 \propto [E(y)]^3\) \(y' = y^{-1/2}\)
\(\sigma^2 \propto [E(y)]^4\) \(y' = y^{-1}\)

Transformações para linearizar (5.3)

Modelos intrinsecamente lineares podem ser linearizados. Exemplo — função exponencial:

\[ y = \beta_0\, e^{\beta_1 x}\,\varepsilon \quad\xrightarrow{\;\ln\;}\quad \ln y = \ln\beta_0 + \beta_1 x + \ln\varepsilon. \]

Função Transformação Forma linear
\(y = \beta_0 x^{\beta_1}\) \(y'=\log y,\; x'=\log x\) \(y' = \log\beta_0 + \beta_1 x'\)
\(y = \beta_0 e^{\beta_1 x}\) \(y'=\ln y\) \(y' = \ln\beta_0 + \beta_1 x\)
\(y = \beta_0 + \beta_1 \log x\) \(x'=\log x\) \(y' = \beta_0 + \beta_1 x'\)
\(y = \dfrac{x}{\beta_0 x-\beta_1}\) \(y'=1/y,\; x'=1/x\) \(y' = \beta_0 - \beta_1 x'\)

Exemplo em R — linearização por logaritmo

set.seed(2024)
x  <- runif(50, 0, 5)
y  <- 2 * exp(0.6 * x) * rlnorm(50, 0, 0.15)   # y = b0 e^{b1 x} * erro
fit_log <- lm(log(y) ~ x)                       # linearização: ln(y) = ln(b0) + b1 x

op <- par(mfrow = c(1, 2), mar = c(4, 4, 2, 1))
plot(x, y, pch = 19, main = "Escala original (curva)")
plot(x, log(y), pch = 19, main = "Escala ln (reta)", ylab = "ln(y)")
abline(fit_log, col = "blue", lwd = 2)
par(op)

coef(fit_log)         # (Intercepto = ln(b0);  x = b1)
#> (Intercept)           x 
#>     0.68926     0.59951
exp(coef(fit_log)[1]) # estimativa de b0
#> (Intercept) 
#>      1.9922

Figura 6: Modelo exponencial: escala original (esq.) e linearizado por ln (dir.).

Leverage vs. influência

Figura 7: Figura 6.1 (esq.): ponto de leverage. Figura 6.2 (dir.): observação influente.

  • Ponto de leverage: valor incomum no espaço dos preditores \(x\) (longe do centro);
  • Ponto influente: ao ser removido, muda substancialmente os resultados (coeficientes, predições, \(R^2\)).

A matriz hat e os valores de leverage

Os valores de leverage são os elementos da diagonal da matriz chapéu \(\mathbf{H} = \mathbf{X}(\mathbf{X}'\mathbf{X})^{-1}\mathbf{X}'\):

\[ h_{ii} = \mathbf{x}_i'(\mathbf{X}'\mathbf{X})^{-1}\mathbf{x}_i . \]

  • \(h_{ii}\) mede a distância de \(\mathbf{x}_i\) ao centro do espaço dos preditores;
  • \(0 \le h_{ii} \le 1\) e \(\displaystyle\sum_i h_{ii} = p\), logo \(\bar{h} = p/n\);
  • Regra prática: \(h_{ii} > \dfrac{2p}{n}\) indica um ponto de leverage.

Distância de Cook (6.3)

Combina leverage e resíduo para medir a influência da \(i\)-ésima observação sobre todos os coeficientes:

\[ D_i = \frac{(\hat{\boldsymbol{\beta}}_{(i)} - \hat{\boldsymbol{\beta}})' \,\mathbf{X}'\mathbf{X}\, (\hat{\boldsymbol{\beta}}_{(i)} - \hat{\boldsymbol{\beta}})}{p\,MS_{Res}} = \frac{r_i^2}{p}\cdot\frac{h_{ii}}{1-h_{ii}}. \]

Pontos com \(D_i\) grande influenciam bastante \(\hat{\boldsymbol{\beta}}\). Regra prática: \(D_i > 1\) indica observação influente.

DFBETAS e DFFITS (6.4)

Diagnósticos de deleção propostos por Belsley, Kuh e Welsch (1980):

DFBETAS — quanto o coeficiente \(\hat{\beta}_j\) muda (em desvios-padrão) ao remover a obs. \(i\):

\[ DFBETAS_{j,i} = \frac{\hat{\beta}_j - \hat{\beta}_{j(i)}}{\sqrt{S^2_{(i)}\,C_{jj}}}, \qquad \text{corte: } \left|DFBETAS_{j,i}\right| > \frac{2}{\sqrt{n}}. \]

DFFITS — quanto o valor ajustado \(\hat{y}_i\) muda (em desvios-padrão) ao remover a obs. \(i\):

\[ DFFITS_i = \frac{\hat{y}_i - \hat{y}_{(i)}}{\sqrt{S^2_{(i)}\,h_{ii}}}, \qquad \text{corte: } \left|DFFITS_i\right| > 2\sqrt{\frac{p}{n}}. \]

Exemplo em R — leverage (hat values)

p <- length(coef(mod))     # nº de parâmetros (b0, b1, b2)
n <- nrow(entrega)         # nº de observações
2 * p / n                  # limite de referência
#> [1] 0.24

h <- hatvalues(mod)
which(h > 2 * p / n)       # pontos de leverage
#>  9 22 
#>  9 22

As observações 9 e 22 têm valores de leverage acima de \(2p/n\).

Exemplo em R — distância de Cook

D <- cooks.distance(mod)
plot(D, type = "h", lwd = 2, main = "Distância de Cook",
     xlab = "Observação", ylab = expression(D[i]))
abline(h = 1, col = "red", lty = 2)
which(D > 1)               # observações influentes
#> 9 
#> 9

Figura 8: Distância de Cook por observação (limite de referência = 1).

A observação 9 (\(D_9 \approx 3.4\)) é claramente influente.

Exemplo em R — DFBETAS e DFFITS

# DFBETAS: influência de cada obs. em cada coeficiente (corte 2/sqrt(n))
round(head(dfbetas(mod)), 2)
#>   (Intercept)    x1    x2
#> 1       -0.19  0.41 -0.43
#> 2        0.09 -0.05  0.01
#> 3        0.00  0.00  0.00
#> 4        0.45  0.09 -0.27
#> 5       -0.03 -0.01  0.02
#> 6       -0.01  0.00  0.00
2 / sqrt(n)
#> [1] 0.4
# DFFITS: influência de cada obs. na predição (corte 2*sqrt(p/n))
dffits_val <- dffits(mod)
2 * sqrt(p / n)
#> [1] 0.69282
which(abs(dffits_val) > 2 * sqrt(p / n))   # observações destacadas
#>  9 22 
#>  9 22

Vários diagnósticos convergem para a observação 9 (e, em menor grau, a 22) como ponto de leverage/influência.

Modelos polinomiais

O modelo linear \(\mathbf{y} = \mathbf{X}\boldsymbol{\beta} + \boldsymbol{\varepsilon}\) serve para qualquer relação linear nos parâmetros — inclusive polinômios.

Segunda ordem em uma variável: \[ y = \beta_0 + \beta_1 x + \beta_2 x^2 + \varepsilon. \]

Segunda ordem em duas variáveis (Eq. 7.7): \[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_{11} x_1^2 + \beta_{22} x_2^2 + \beta_{12} x_1 x_2 + \varepsilon, \]

com dois efeitos lineares, dois quadráticos e um de interação. Polinômios modelam bem respostas curvilíneas e superfícies de resposta.

Superfície de resposta (ilustração)

Figura 9: Superfície de resposta de um modelo de 2ª ordem em duas variáveis.

Exemplo em R — termos quadráticos

Usando o delivery time, ajustamos modelos polinomiais de 2ª ordem:

# Y = b0 + b1 x1 + b2 x1^2 + erro
mod_q1 <- lm(y ~ x1 + I(x1^2), data = entrega)
summary(mod_q1)$coefficients
#>             Estimate Std. Error t value  Pr(>|t|)
#> (Intercept) 8.212645   2.309937  3.5554 0.0017721
#> x1          1.135618   0.429848  2.6419 0.0148926
#> I(x1^2)     0.034561   0.013785  2.5071 0.0200542

# Y = b0 + b1 x2 + b2 x2^2 + erro
mod_q2 <- lm(y ~ x2 + I(x2^2), data = entrega)
summary(mod_q2)$coefficients
#>               Estimate Std. Error t value   Pr(>|t|)
#> (Intercept) 1.1614e+01 2.7213e+00 4.26788 0.00031362
#> x2          8.7999e-03 1.0450e-02 0.84214 0.40877202
#> I(x2^2)     2.6646e-05 7.7082e-06 3.45679 0.00224496

Exemplo em R — interação e modelos encaixados

# Modelo com interação:  Y = b0 + b1 x1 + b2 x2 + b3 x1:x2 + erro
mod_int <- lm(y ~ x1 + x2 + x1:x2, data = entrega)   # ou lm(y ~ x1 * x2)
summary(mod_int)$coefficients
#>               Estimate Std. Error t value   Pr(>|t|)
#> (Intercept) 7.13908457 1.39974126  5.1003 4.7317e-05
#> x1          1.01440625 0.19125165  5.3040 2.9340e-05
#> x2          0.00582735 0.00338250  1.7228 9.9622e-02
#> x1:x2       0.00074192 0.00017498  4.2401 3.6593e-04

Modelos encaixados. \(M_1\) está encaixado em \(M_2\) se todos os parâmetros de \(M_1\) estão contidos em \(M_2\), e \(M_2\) possui parâmetros adicionais. O modelo mod (só \(x_1, x_2\)) está encaixado em mod_int.

anova(mod, mod_int)          # a interação melhora o ajuste?
#> Analysis of Variance Table
#> 
#> Model 1: y ~ x1 + x2
#> Model 2: y ~ x1 + x2 + x1:x2
#>   Res.Df RSS Df Sum of Sq  F  Pr(>F)    
#> 1     22 234                            
#> 2     21 126  1       108 18 0.00037 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

mod_nulo <- lm(y ~ 1, data = entrega)
anova(mod_nulo, mod)         # o modelo é significativo?
#> Analysis of Variance Table
#> 
#> Model 1: y ~ 1
#> Model 2: y ~ x1 + x2
#>   Res.Df  RSS Df Sum of Sq   F  Pr(>F)    
#> 1     24 5785                             
#> 2     22  234  2      5551 261 4.7e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Variáveis qualitativas na regressão

Muitas vezes precisamos usar variáveis qualitativas (categóricas) como preditoras: operador, turno, sexo, tipo de ferramenta, etc. Elas não têm escala natural de medida.

Atribuímos níveis por meio de variáveis indicadoras (ou dummy). Para dois níveis:

\[ x_2 = \begin{cases} 0 & \text{se a observação é do tipo A}\\ 1 & \text{se a observação é do tipo B} \end{cases} \]

Em geral, uma variável qualitativa com \(a\) níveis é representada por \(a-1\) variáveis indicadoras.

Exemplo 8.1 — vida de ferramenta

Deseja-se relacionar a vida útil \(y\) (horas) de uma ferramenta de corte à velocidade do torno \(x_1\) (rpm) e ao tipo de ferramenta (A ou B).

Modelo de primeira ordem: \[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \varepsilon. \]

  • Tipo A (\(x_2=0\)): \(\;y = \beta_0 + \beta_1 x_1 + \varepsilon\);
  • Tipo B (\(x_2=1\)): \(\;y = (\beta_0+\beta_2) + \beta_1 x_1 + \varepsilon\).

Duas retas paralelas (mesma inclinação \(\beta_1\)), com interceptos separados por \(\beta_2\).

Dados do Exemplo 8.1 (Tabela 8.1)

ferramenta <- data.frame(
  y = c(18.73, 14.52, 17.43, 14.54, 13.44, 24.39, 13.34, 22.71, 12.68, 19.32,
        30.16, 27.09, 25.40, 26.05, 33.49, 35.62, 26.07, 36.78, 34.95, 43.67),
  x1 = c(610, 950, 720, 840, 980, 530, 680, 540, 890, 730,
         670, 770, 880, 1000, 760, 590, 910, 650, 810, 500),
  tipo = factor(rep(c("A", "B"), each = 10))
)
head(ferramenta)
#>       y  x1 tipo
#> 1 18.73 610    A
#> 2 14.52 950    A
#> 3 17.43 720    A
#> 4 14.54 840    A
#> 5 13.44 980    A
#> 6 24.39 530    A

Figura 8.2 — vida útil vs. velocidade

ggplot(ferramenta, aes(x1, y, shape = tipo, color = tipo)) +
  geom_point(size = 3) +
  labs(x = "Velocidade (rpm)", y = "Vida útil (horas)", color = "Tipo", shape = "Tipo")

Figura 10: Vida útil y vs. velocidade x1, por tipo de ferramenta.

Os pontos do tipo B situam-se acima dos do tipo A: a ferramenta B dura mais.

Ajuste do modelo com indicadora

mod_ind <- lm(y ~ x1 + tipo, data = ferramenta)
summary(mod_ind)
#> 
#> Call:
#> lm(formula = y ~ x1 + tipo, data = ferramenta)
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -5.553 -1.787 -0.002  1.839  4.984 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept) 36.98560    3.51038   10.54  7.2e-09 ***
#> x1          -0.02661    0.00452   -5.89  1.8e-05 ***
#> tipoB       15.00425    1.35967   11.04  3.6e-09 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 3.04 on 17 degrees of freedom
#> Multiple R-squared:   0.9,   Adjusted R-squared:  0.889 
#> F-statistic: 76.7 on 2 and 17 DF,  p-value: 3.09e-09

Compare com a Tabela 8.2 de Montgomery: \[ \hat{y} = 36.986 - 0.027\,x_1 + 15.004\,x_2, \qquad R^2 = 0.9003. \]

As duas retas ajustadas

b <- coef(mod_ind)
ggplot(ferramenta, aes(x1, y, color = tipo, shape = tipo)) +
  geom_point(size = 3) +
  geom_abline(intercept = b[1],        slope = b[2], color = "#F8766D", linewidth = 1) +
  geom_abline(intercept = b[1] + b[3], slope = b[2], color = "#00BFC4", linewidth = 1) +
  labs(x = "Velocidade (rpm)", y = "Vida útil (horas)", color = "Tipo", shape = "Tipo")

Figura 11: Retas paralelas ajustadas para os tipos A e B.

O coeficiente \(\hat{\beta}_2 = 15.004\) é a diferença de vida útil entre B e A (para a mesma velocidade), e é altamente significativo (\(p < 10^{-8}\)).

Mais de dois níveis

Para três tipos A, B e C, usamos duas indicadoras \(x_2, x_3\):

\(x_2\) \(x_3\) Tipo
0 0 A
1 0 B
0 1 C

\[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + \varepsilon. \]

Indicadoras também podem substituir um regressor quantitativo difícil de medir com precisão (ex.: faixas de renda) — Cap. 8.2.2.

Regressão linear simples — adsorção de corante

Artigo “Ecofriendly Dyeing of Silk with Extract of Yerba Mate” (Textile Res. J., 2017): efeito da concentração de corante (mg/L) sobre a adsorção (mg/g).

ads <- data.frame(
  concentracao = c(10, 20, 20, 20, 10, 20, 10, 20, 15, 15),
  adsorcao     = c(250, 520, 387, 593, 157, 377, 225, 451, 382, 373)
)
cor(ads$concentracao, ads$adsorcao)
#> [1] 0.86408

Correlação e ajuste

cor.test(ads$concentracao, ads$adsorcao)   # observe o IC para rho
#> 
#>  Pearson's product-moment correlation
#> 
#> data:  ads$concentracao and ads$adsorcao
#> t = 4.86, df = 8, p-value = 0.0013
#> alternative hypothesis: true correlation is not equal to 0
#> 95 percent confidence interval:
#>  0.51421 0.96740
#> sample estimates:
#>     cor 
#> 0.86408
mod_rls <- lm(adsorcao ~ concentracao, data = ads)
coef(mod_rls)
#>  (Intercept) concentracao 
#>      -29.763       25.079

\(\hat{y} = -29.76 + 25.08\,\text{concentração}\).

  • \(\hat{\beta}_0\): adsorção média quando a concentração é zero;
  • \(\hat{\beta}_1\): variação média da adsorção por unidade de concentração.

Intervalo de confiança (IC) vs. de predição (IP)

  • IC (resposta média): incerteza sobre \(E(y\mid x)\) — a reta média;
  • IP (nova observação): incerteza sobre um novo \(y\) — sempre mais largo.
grade <- data.frame(concentracao = seq(10, 20, length.out = 200))
ic <- predict(mod_rls, newdata = grade, interval = "confidence")
ip <- predict(mod_rls, newdata = grade, interval = "prediction")

plot(ads$concentracao, ads$adsorcao, pch = 19, xlab = "Concentração (mg/L)",
     ylab = "Adsorção (mg/g)", ylim = c(100, 650))
lines(grade$concentracao, ic[, "fit"], col = "blue", lwd = 2)
lines(grade$concentracao, ic[, "lwr"], col = "blue",  lty = 2)
lines(grade$concentracao, ic[, "upr"], col = "blue",  lty = 2)
lines(grade$concentracao, ip[, "lwr"], col = "brown", lty = 3)
lines(grade$concentracao, ip[, "upr"], col = "brown", lty = 3)

Figura 12: IC para a resposta média (azul) e IP para novas observações (marrom).

Regressão pela origem e comparação de modelos

mod_origem <- lm(adsorcao ~ -1 + concentracao, data = ads)   # sem intercepto
anova(mod_origem, mod_rls)                                    # há diferença?
#> Analysis of Variance Table
#> 
#> Model 1: adsorcao ~ -1 + concentracao
#> Model 2: adsorcao ~ concentracao
#>   Res.Df   RSS Df Sum of Sq    F Pr(>F)
#> 1      9 41163                         
#> 2      8 40551  1       612 0.12   0.74

Se não há diferença significativa entre os modelos, escolhe-se o mais simples (com menos parâmetros).

# R2 e R2 ajustado
c(R2_completo = summary(mod_rls)$r.squared,
  R2aj_completo = summary(mod_rls)$adj.r.squared)
#>   R2_completo R2aj_completo 
#>       0.74664       0.71497

Regressão múltipla — adsorção

Agora \(Y\) = adsorção, \(X_1\) = concentração, \(X_2\) = temperatura, \(X_3\) = pH:

\[ Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_3 X_3 + \varepsilon. \]

ads_m <- data.frame(
  conc = c(10, 20, 20, 20, 10, 20, 10, 20, 15, 15),
  temp = c(70, 70, 80, 90, 70, 70, 90, 90, 80, 80),
  ph   = c(3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0, 3.5, 3.5),
  adsorcao = c(250, 520, 387, 593, 157, 377, 225, 451, 382, 373)
)
mod_rlm <- lm(adsorcao ~ conc + temp + ph, data = ads_m)
coef(mod_rlm)
#> (Intercept)        conc        temp          ph 
#>     53.7587     21.5485      3.6572    -90.2717
confint(mod_rlm)             # IC para os coeficientes
#>                 2.5 %   97.5 %
#> (Intercept) -507.5815 615.0989
#> conc          10.5185  32.5784
#> temp          -1.9885   9.3029
#> ph          -197.2655  16.7221

IP para novas observações (RLM)

novos <- data.frame(conc = c(12, 12, 25, 25),
                    temp = c(50, 80, 50, 80),
                    ph   = c(6.0, 6.0, 6.0, 6.0))
predict(mod_rlm, newdata = novos, interval = "prediction")
#>       fit        lwr    upr
#> 1 -46.431 -406.34184 313.48
#> 2  63.284 -235.13062 361.70
#> 3 233.699 -177.57350 644.97
#> 4 343.414   -0.83269 687.66

Os intervalos de predição refletem a incerteza para combinações novas de concentração, temperatura e pH — fora dos valores observados.

O que vimos

  • Adequação do modelo (Cap. 4): resíduos escalonados, gráficos diagnósticos, testes (Shapiro, KS, Durbin-Watson, Breusch-Pagan), estatística PRESS e outliers;
  • Transformações (Cap. 5): estabilização de variância e linearização;
  • Leverage e influência (Cap. 6): hat values, distância de Cook, DFBETAS, DFFITS;
  • Regressão polinomial (Cap. 7): termos quadráticos, interação, modelos encaixados;
  • Variáveis indicadoras (Cap. 8): variáveis qualitativas e o exemplo da vida de ferramenta.

A verificação da adequação não é opcional: sempre analise os resíduos e a influência antes de confiar nas conclusões do modelo.

Referências

  • Montgomery, D. C.; Peck, E. A.; Vining, G. G. Introduction to Linear Regression Analysis, 6ª ed. Wiley, 2021.
  • Material da disciplina Análise de Regressão — Bacharelado em Estatística, UFMT.

Prof. Dr. Juliano Bortolini · www.julianobortolini.com.br

@profjulianobortolini · linkedin · github