Análise de Regressão

Author
Affiliation

Universidade Federal de Mato Grosso

Bacharelado em Estatística - UFMT

Atividade prática no R

O aquecimento global é uma questão importante, e as emissões de \(CO_2\) desempenham um papel fundamental nessa discussão. O artigo “Effects of Atmospheric \(CO_2\) Enrichment on Biomass Accumulation and Distribution in Eldarica Pine Trees” (J. Exp. Bot. 1994: 345–349) descreve os resultados do crescimento de pinheiros sob diferentes níveis de \(CO_2\) no ar.

Os dados abaixo correspondem às observações onde:

  • \(x\) = concentração atmosférica de \(CO_2\) (partes por milhão)
  • \(y\) = massa em gramas após 11 meses de experimento.

Tabela. Concentração de \(CO_2\) (\(x\)) e Massa (\(y\))

\(x\) 408 408 554 554 680 680 812 812
\(y\) 1100 1300 1600 2500 3000 4300 4200 4700
x <- c(408, 408, 554, 554, 680, 680, 812, 812)
y <- c(1100, 1300, 1600, 2500, 3000, 4300, 4200, 4700)
  1. Calcule e interprete o valor do coeficiente de correlação amostral.
cor(x,y)
[1] 0.9392405
  1. Realize o teste de hipóteses para decidir se a concentração de \(CO_2\) e a massa dos pinheiros estão linearmente relacionadas e interprete os resultados, considere \(\alpha = 0,05\).
cor.test(x,y)

    Pearson's product-moment correlation

data:  x and y
t = 6.7024, df = 6, p-value = 0.0005355
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.6936940 0.9892025
sample estimates:
      cor 
0.9392405 
  1. Calcule o intervalo de confiança de \(95\%\) para o coeficiente de correlação amostral e interprete-o.
cor.test(x,y)

    Pearson's product-moment correlation

data:  x and y
t = 6.7024, df = 6, p-value = 0.0005355
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.6936940 0.9892025
sample estimates:
      cor 
0.9392405 
  1. Ajuste um modelo de regressão linear simples relacionando \(x\) e \(y\) e interprete o coeficiente linear (\(\beta_1\)).
plot(x,y)

modelo <- lm(y ~ x)
modelo

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)            x  
  -2349.295        8.454  
  1. Realize a análise de variância (ANOVA) para o modelo ajustado e interprete os resultados, considere \(\alpha = 0,05\).
anova(modelo) 
Analysis of Variance Table

Response: y
          Df   Sum Sq  Mean Sq F value    Pr(>F)    
x          1 12808045 12808045  44.922 0.0005355 ***
Residuals  6  1710705   285118                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# a diferença entre os valores do cálculo no R e "na mão" é por causa das aproximações.
  1. Realize o teste de hipóteses \(H_0: \beta_0 = 0\) versus \(H_1: \beta_0 \neq 0\), considere \(\alpha = 0,05\).
summary(modelo)

Call:
lm(formula = y ~ x)

Residuals:
    Min      1Q  Median      3Q     Max 
-734.46 -336.71   82.71  188.19  900.28 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -2349.295    796.567  -2.949 0.025637 *  
x               8.454      1.261   6.702 0.000536 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 534 on 6 degrees of freedom
Multiple R-squared:  0.8822,    Adjusted R-squared:  0.8625 
F-statistic: 44.92 on 1 and 6 DF,  p-value: 0.0005355
  1. Realize o teste de hipóteses \(H_0: \beta_1 = 0\) versus \(H_1: \beta_1 \neq 0\), considere \(\alpha = 0,05\).
summary(modelo)

Call:
lm(formula = y ~ x)

Residuals:
    Min      1Q  Median      3Q     Max 
-734.46 -336.71   82.71  188.19  900.28 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -2349.295    796.567  -2.949 0.025637 *  
x               8.454      1.261   6.702 0.000536 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 534 on 6 degrees of freedom
Multiple R-squared:  0.8822,    Adjusted R-squared:  0.8625 
F-statistic: 44.92 on 1 and 6 DF,  p-value: 0.0005355
  1. Realize o teste de hipóteses \(H_0: \beta_1 = 8\) versus \(H_1: \beta_1 \neq 8\), considere \(\alpha = 0,05\).
beta1 <- 8.454
beta1_h0 <- 8
ep_beta1 <- 1.261
tc <- (beta1 - beta1_h0) / ep_beta1
tc # t calculado
[1] 0.3600317
ttab <- qt(0.975, df = 6)
ttab # t tabelado ou valor crítico.
[1] 2.446912
abs(tc) > ttab # qual é a decisão? Rej ou nao H0?
[1] FALSE
  1. Calcule o intervalo de confiança de \(95\%\) para o coeficiente linear (\(\beta_1\)) e interprete-o.
confint(modelo, level = 0.95)
                   2.5 %     97.5 %
(Intercept) -4298.424521 -400.16580
x               5.367883   11.54098
  1. Apresente os valores estimados de \(y\) para todos os valores de \(x\).
y_hat <- predict(modelo)
y_hat
       1        2        3        4        5        6        7        8 
1100.114 1100.114 2334.461 2334.461 3399.720 3399.720 4515.705 4515.705 
data.frame(x, y, y_hat)
    x    y    y_hat
1 408 1100 1100.114
2 408 1300 1100.114
3 554 1600 2334.461
4 554 2500 2334.461
5 680 3000 3399.720
6 680 4300 3399.720
7 812 4200 4515.705
8 812 4700 4515.705
  1. Calcule o intervalo de confiança para \(y\), quando \(x = 680\), ao nível de \(95\%\) de confiança. Ou seja, \(IC_{95\%}(y(680))\), sendo \(y(680) = E(Y| x = 680)\).
x_conf <- data.frame(x = 680)
predict(modelo, newdata = x_conf, interval = "confidence", level = 0.95)
      fit      lwr      upr
1 3399.72 2894.232 3905.208
  1. Calcule os intervalos de confiança para \(y\), para todos os valores de \(x\), ao nível de \(95\%\) de confiança.
x_conf <- data.frame(x = x)
y_hat_conf <- predict(modelo, newdata = x_conf,
                      interval = "confidence", level = 0.95)

# data.frame com valores de x, y, predito e IC:
tabela <- data.frame(x, y, y_hat_conf)
tabela
    x    y      fit       lwr      upr
1 408 1100 1100.114  315.4437 1884.784
2 408 1300 1100.114  315.4437 1884.784
3 554 1600 2334.461 1837.3540 2831.568
4 554 2500 2334.461 1837.3540 2831.568
5 680 3000 3399.720 2894.2318 3905.208
6 680 4300 3399.720 2894.2318 3905.208
7 812 4200 4515.705 3748.3945 5283.016
8 812 4700 4515.705 3748.3945 5283.016
# alterar o nome dos colunas:
colnames(tabela) <- c("x", "y", "y_hat", "LI", "LS")
tabela
    x    y    y_hat        LI       LS
1 408 1100 1100.114  315.4437 1884.784
2 408 1300 1100.114  315.4437 1884.784
3 554 1600 2334.461 1837.3540 2831.568
4 554 2500 2334.461 1837.3540 2831.568
5 680 3000 3399.720 2894.2318 3905.208
6 680 4300 3399.720 2894.2318 3905.208
7 812 4200 4515.705 3748.3945 5283.016
8 812 4700 4515.705 3748.3945 5283.016
  1. Construa um gráfico com os pontos observados, a reta de regressão ajustada e os intervalos de confiança para \(y\).
plot(x,y)
abline(modelo)
lines(tabela$x, tabela$LI, lty = 2)
lines(tabela$x, tabela$LS, lty = 2)

plot(x, y,
     pch = 19, col = "black",
     xlab = "Concentração de CO2 (ppm)",
     ylab = "Massa (g)",
     main = "Regressão Linear Simples com IC para y")

# adicionar a reta de regressão:
abline(modelo, col = "red", lwd = 2)
# adicionar os intervalos de confiança:
lines(tabela$x, tabela$LI, col = "brown", lty = 2)
lines(tabela$x, tabela$LS, col = "brown", lty = 2)
legend("topleft",
       legend = c("Observações", "Reta de Regressão", "IC para y"),
       col = c("black", "red", "brown"),
       pch = c(19, NA, NA),
       lty = c(NA, 1, 2),
       lwd = c(NA, 2, 1),
       bty = "n")

# Usando o pacote ggplot2
library(ggplot2)

ggplot(tabela, aes(x = x, y = y)) +
  geom_point(color = "black") +
  geom_line(aes(y = y_hat), color = "red", linewidth = 1) +
  geom_line(aes(y = LI), color = "brown", linewidth = 1, lty = 2) +
  geom_line(aes(y = LS), color = "brown", linewidth = 1, lty = 2) +
  labs(title = "Regressão Linear Simples com IC para y",
       x = "Concentração de CO2 (ppm)",
       y = "Massa (g)")

  1. Calcule a estimativa de \(y\) quando \(x = 600\). Ou seja, \(y(600)\).
x0 <- data.frame(x = 600)
y_hat_x0 <- predict(modelo, newdata = x0)
y_hat_x0
       1 
2723.365 
  1. Calcule as estimativas de \(y\) quando \(x = 500, 600\) e \(700\).
x0 <- data.frame(x = c(500, 600, 700))
y_hat_x0 <- predict(modelo, newdata = x0)
y_hat_x0
       1        2        3 
1877.922 2723.365 3568.809 
tabela_x0 <- data.frame(x = x0, y_hat = y_hat_x0)
tabela_x0
    x    y_hat
1 500 1877.922
2 600 2723.365
3 700 3568.809
  1. Calcule as estimativas de \(y\) quando \(x = 500, 600\) e \(700\) e os intervalos de predição para cada um desses valores de \(x\), ao nível de \(95\%\) de confiança.
x0 <- data.frame(x = c(500, 600, 700))
y_hat_x0 <- predict(modelo, newdata = x0, 
                    interval = "prediction", level = 0.95)
y_hat_x0
       fit       lwr      upr
1 1877.922  448.5088 3307.335
2 2723.365 1336.9196 4109.811
3 3568.809 2157.5053 4980.112
tabela_x0 <- data.frame(x = x0, y_hat = y_hat_x0)
tabela_x0
    x y_hat.fit y_hat.lwr y_hat.upr
1 500  1877.922  448.5088  3307.335
2 600  2723.365 1336.9196  4109.811
3 700  3568.809 2157.5053  4980.112
# alterando os nomes das colunas:
colnames(tabela_x0) <- c("x", "y_hat", "LI_pred", "LS_pred")
tabela_x0
    x    y_hat   LI_pred  LS_pred
1 500 1877.922  448.5088 3307.335
2 600 2723.365 1336.9196 4109.811
3 700 3568.809 2157.5053 4980.112
  1. Construa o gráfico com os intervalos de confiança e predição, ao nível de \(95\%\) de confiança, para os valores de \(x\) entre \(400\) e \(900\).
x_seq <- seq(400, 900, by = 10)
x_seq_df <- data.frame(x = x_seq)
y_hat_seq <- predict(modelo, newdata = x_seq_df,
                     interval = "confidence", level = 0.95)
y_pred_seq <- predict(modelo, newdata = x_seq_df,
                      interval = "prediction", level = 0.95)
tabela_seq <- data.frame(x = x_seq, y_hat = y_hat_seq[, "fit"],
                          LI_conf = y_hat_seq[, "lwr"], LS_conf = y_hat_seq[, "upr"],
                          LI_pred = y_pred_seq[, "lwr"], LS_pred = y_pred_seq[, "upr"])
head(tabela_seq)
    x    y_hat  LI_conf  LS_conf    LI_pred  LS_pred
1 400 1032.478 227.7168 1837.240 -502.04035 2566.997
2 410 1117.023 337.3341 1896.711 -404.49658 2638.542
3 420 1201.567 446.5220 1956.612 -307.47224 2710.606
4 430 1286.111 555.2373 2016.986 -210.98031 2783.203
5 440 1370.656 663.4314 2077.880 -115.03364 2856.345
6 450 1455.200 771.0502 2139.350  -19.64488 2930.045
ggplot(tabela_seq, aes(x = x)) +
  geom_line(aes(y = y_hat), color = "red", linewidth = 1) +
  geom_line(aes(y = LI_conf), color = "blue", lty = 2) +
  geom_line(aes(y = LS_conf), color = "blue", lty = 2) +
  geom_line(aes(y = LI_pred), color = "green", lty = 2) +
  geom_line(aes(y = LS_pred), color = "green", lty = 2) +
  labs(title = "Reta de Regressão com IC e IP",
       x = "Concentração de CO2 (ppm)",
       y = "Massa (g)") +
  theme_minimal()

# sugestão de outro gráfico (que também pode ser aprimorado):
ggplot(tabela_seq, aes(x = x)) +
  geom_line(aes(y = y_hat, color = "Y = -2349.295 + 8.454x"), linewidth = 1) +
  geom_line(aes(y = LI_conf, color = "IC 95%"), linetype = 2) +
  geom_line(aes(y = LS_conf, color = "IC 95%"), linetype = 2) +
  geom_line(aes(y = LI_pred, color = "IP 95%"), linetype = 2) +
  geom_line(aes(y = LS_pred, color = "IP 95%"), linetype = 2) +
  scale_color_manual(
    values = c(
      "Y = -2349.295 + 8.454x" = "black",
      "IC 95%" = "black",
      "IP 95%" = "grey"
    )
  ) +
  labs(
    title = "",
    x = "Concentração de CO_2 (ppm)",
    y = "Massa (g)",
    color = ""
  ) +
  theme_minimal() +
  theme(
    legend.position = c(0.05, 0.95),
    legend.justification = c(0, 1),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    axis.line = element_line(color = "black")
  )


@profjulianobortolini      www.julianobortolini.com.br      linkedin      github       lattes