--- title: "Modelos de regressão" subtitle: "Aula 6" author: "Bruno Montezano" institute: "Grupo Alliance
Programa de Pós-Graduação em Psiquiatria e Ciências do Comportamento
Universidade Federal do Rio Grande do Sul" date: last-modified date-format: long lang: pt-br execute: echo: true format: revealjs: incremental: true smaller: true theme: [default, ../assets/custom.scss] logo: "../assets/logo_ufrgs.png" --- ## Conteúdo de hoje - Conceito - Regressão linear simples - Regressão linear múltipla - Coeficiente de determinação - Preditores categóricos - Desafios ## Ciclo da ciência de dados ![](../assets/ciclo_data_science.png){fig-align="center" width=85%} ## Regressão linear * Método estatístico para sumarizar e estudar relações entre duas variáveis contínuas * $X$: preditor ou variável explicativa ou variável independente * $Y$: desfecho ou variável resposta ou variável dependente * Exemplo: salário ($Y$) e anos de estudo ($X$) . . . ```{r altura-peso-scatter} #| echo: false #| fig-align: "center" #| out.width: "70%" set.seed(1) library(ggplot2) altura <- round(runif(10, 150, 195), 1) peso <- 0.5 * altura + rnorm(10, mean = 0, sd = 3) medidas <- data.frame(altura, peso) modelo <- lm(peso ~ altura, data = medidas) medidas$predito <- predict(modelo) medidas$residuos <- medidas$peso - medidas$predito ggplot(medidas, aes(x = altura, y = peso)) + geom_point(size = 4, color = "slateblue4") + scale_x_continuous(labels = \(x) paste0(as.character(x), " cm")) + scale_y_continuous(labels = \(x) paste0(as.character(x), " kg")) + geom_smooth(method = "lm", color = "grey20", se = FALSE, fullrange = TRUE) + labs(x = "Altura", y = "Peso") + theme_minimal(base_size = 16, base_family = "Charter") ``` ## Qual a utilidade das retas? ```{r exemplos-retas} #| echo: false #| fig-align: "center" #| out.width: "100%" library(patchwork) library(dplyr) neg <- openintro::simulated_scatter |> filter(group == 1) pos <- openintro::simulated_scatter |> filter(group == 2) ran <- openintro::simulated_scatter |> filter(group == 3) bad <- openintro::simulated_scatter |> filter(group == 5) bad_reg <- bad |> mutate(y = max(y) + min(y) - y) |> ggplot(aes(x = x, y = y)) + geom_point(size = 2, alpha = 0.8, color = "slateblue4") + geom_smooth(method = "lm", se = FALSE, color = "gray20") + labs(x = NULL, y = NULL) + theme_minimal(base_size = 16, base_family = "Charter") p_neg <- ggplot(neg, aes(x = x, y = y)) + geom_point(size = 2, alpha = 0.8, color = "slateblue4") + geom_smooth(method = "lm", se = FALSE, color = "gray20") + labs(x = NULL, y = NULL) + theme_minimal(base_size = 16, base_family = "Charter") p_pos <- ggplot(pos, aes(x = x, y = y)) + geom_point(size = 2, alpha = 0.8, color = "slateblue4") + geom_smooth(method = "lm", se = FALSE, color = "gray20") + labs(x = NULL, y = NULL) + theme_minimal(base_size = 16, base_family = "Charter") p_ran <- ggplot(ran, aes(x = x, y = y)) + geom_point(size = 2, alpha = 0.8, color = "slateblue4") + geom_smooth(method = "lm", se = FALSE, color = "gray20") + labs(x = NULL, y = NULL) + theme_minimal(base_size = 16, base_family = "Charter") p_neg + p_pos + p_ran + bad_reg + plot_annotation(title = "Um modelo linear pode ser útil mesmo quando os pontos não passam diretamente pela reta.", subtitle = "Em alguns casos, não será o método mais adequado.", caption = "Adaptado do livro Introduction to Modern Statistics (Çetinkaya-Rundel e Hardin, 2023).", theme = theme(text = element_text(family = "Charter"))) ``` ## Como a reta é construída? Construída a partir da fórmula:
$Y = \beta_0 + \beta_1x_1 + e$ $\color{red}\longrightarrow$ $peso = -4.47 + 0.527 \times altura$
* $\beta_0$: intercepto, ou valor de $Y$ quando $X = 0$ * $\beta_1$: coeficiente angular (*slope*) - Entendido como a mudança no $Y$ a partir do aumento de 1 unidade no $x_1$ . . . ```{r altura-peso-ilustracao-equacao} #| echo: false #| fig-align: "center" #| out.width: "70%" ggplot(medidas, aes(x = altura, y = peso)) + geom_point(size = 2.5, color = "slateblue4", alpha = 0.9) + scale_x_continuous(labels = \(x) paste0(as.character(x), " cm"), limits = c(0, 195)) + scale_y_continuous(labels = \(x) paste0(as.character(x), " kg")) + geom_smooth(method = "lm", color = "grey20", se = FALSE, fullrange = TRUE) + geom_point(aes(x = x, y = y), data.frame(x = 0, y = -4.47), size = 5, color = "indianred1") + labs(x = "Altura", y = "Peso") + geom_segment(x = 150, xend = 150, y = 75, yend = 0, color = "tan1", linewidth = 1.5) + geom_segment(x = 150, xend = 0, y = 75, yend = 75, color = "tan1", linewidth = 1.5) + geom_point(x = 150, y = 74.58, size = 5, color = "maroon1") + theme_minimal(base_size = 16, base_family = "Charter") ``` ## Definições e nomenclaturas * $x_1, x_2, \cdots, x_p$: variáveis explicativas (variáveis independentes ou *features* ou preditores) * $X = x_1, x_2, \cdots, x_p$: conjunto de todos os preditores * $Y$: variável resposta (ou variável dependente ou *target*) * $\hat{Y}$: valor esperado (ou predição ou valor estimado ou *fitted*) * $f(X)$ pode ser entendida como "modelo" ou "hipótese" . . . No primeiro exemplo: * $x_1$: `altura` --- Altura em centímetros * $Y$: `peso` --- Peso em quilogramas ## Observado *vs.* Esperado * $Y$ é um valor observado (ou verdade) a partir dos dados * $\hat{Y}$ é um valor esperado (predição, ou valor estimado, ou *fitted*) * $Y - \hat{Y}$ é o resíduo (ou erro) . . . Por definição, $\hat{Y} = f(X)$ que é o valor que a função $f$ retorna. Em suma, nosso modelo. ```{r altura-peso-erro} #| echo: false #| fig-align: "center" #| out.width: "60%" ggplot(medidas, aes(x = altura, y = peso)) + geom_segment( aes( x = altura, y = peso, xend = altura, yend = predito ), color = "chocolate1", linewidth = 1.5, alpha = 0.8, data = medidas ) + geom_point(size = 3.5, color = "slateblue4") + scale_x_continuous(labels = \(x) paste0(as.character(x), " cm")) + scale_y_continuous(labels = \(x) paste0(as.character(x), " kg")) + geom_smooth(method = "lm", color = "grey20", se = FALSE, fullrange = TRUE) + labs(x = "Altura", y = "Peso") + theme_minimal(base_size = 16, base_family = "Charter") ``` ## Por que ajustar uma $f$? ::: columns ::: {.column width="50%"} ### Predição * Em muitas situações, $X$ está disponível facilmente mas $Y$ não é fácil de descobrir (ou mesmo não é possível descobrí-lo). * Queremos que $\hat{Y}=f(X)$ seja uma boa estimativa (preveja bem o futuro). * Exemplo: Com quantos gramas irá nascer um bebê na maternidade do HCPA? ::: ::: {.column width="50%"} ### Inferência * Em inferência estamos mais interessados em entender a relação entre as variáveis explicativas $X$ e a variável resposta $Y$. * Exemplos: - Qual o efeito da idade na função cognitiva dos pacientes bipolares? - Os níveis de estresse podem explicar a severidade de sintomas depressivos? * Nessa aula, nosso foco é **inferência**. ::: ::: ## Vamos trabalhar com `gambás` ::: columns ::: {.column width="65%"} Os dados apresentam informações de gambás da Austrália e Nova Guiné. ```{r ler-e-mostrar-gambas} library(readr) gambas <- read_csv("../dados/gambas.csv") glimpse(gambas) ``` ::: ::: {.column width="35%"} ![O gambá brushtail da Austrália. Foto de Greg Schecter. Licença CC BY 2.0.](../assets/gamba.jpg){fig-align="center" width=85%} ::: ::: ## Exemplo com `gambás` ::: columns ::: {.column width="50%"} #### Regressão linear simples
$y = \beta_0 + \beta_1x$

#### Exemplo
$cabeça = \beta_0 + \beta_1total$

```{r lm-cabeca-comprimento-total} #| eval: false # No R lm(comprimento_cabeca ~ comprimento_total, data = gambas) ``` ::: ::: {.column width="50%"} ::: {.panel-tabset} ## Gráfico ```{r scatterplot-gambas} #| echo: false ggplot(gambas) + geom_point(aes(x = comprimento_total, y = comprimento_cabeca), size = 4, alpha = 0.7) + labs(x = "Comprimento total (em cm)", y = "Comprimento da cabeça (em mm)") + theme_minimal(18, "Charter") ``` ## Reta na mão ```{r reta-na-mao-gambas} #| echo: false ggplot(gambas, aes(x = comprimento_total, y = comprimento_cabeca)) + geom_point(size = 4, alpha = 0.7) + #geom_smooth(method = "lm", # se = FALSE, # color = "firebrick1", # size = 2) + geom_abline(intercept = 36, slope = 0.7, color = "dodgerblue4", size = 2) + labs(x = "Comprimento total (em cm)", y = "Comprimento da cabeça (em mm)") + theme_minimal(18, "Charter") ``` ## Melhor reta ```{r melhor-reta-gambas} #| echo: false ggplot(gambas, aes(x = comprimento_total, y = comprimento_cabeca)) + geom_point(size = 4, alpha = 0.7) + geom_smooth(method = "lm", se = FALSE, color = "firebrick1", size = 2) + geom_abline(intercept = 36, slope = 0.7, color = "dodgerblue4", alpha = 0.6, size = 2) + labs(x = "Comprimento total (em cm)", y = "Comprimento da cabeça (em mm)") + theme_minimal(18, "Charter") ``` ::: ::: ::: ## Melhor reta no R
$comprimento \,da \,cabeça = \beta_0 + \beta_1comprimento \,total$

. . . ```{r regressao-linear-gamba} melhor_reta <- lm(comprimento_cabeca ~ comprimento_total, data = gambas) melhor_reta ```
. . .
$comprimento \,da \,cabeça = 42.7 + 0.57 \times comprimento \,total$

. . .
Como a melhor reta é escolhida?
## "Melhor reta" baseado em que? A gente quer a reta que *erre menos*. . . . Exemplo de medida de erro: **E**rro **Q**uadrático **M**édio.
$$ EQM = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} $$ ```{r comparar erro-reta-na-mao-e-melhor} #| echo: false #| fign-align: "center" #| out.width: "70%" set.seed(1) melhor_reta <- lm(comprimento_cabeca ~ comprimento_total, data = gambas) gambas_com_preds <- melhor_reta |> broom::augment() |> rename(pred_melhor_reta = .fitted) |> mutate( pred_reta_a_mao = 36 + 0.7 * comprimento_total ) grafico_residuos_melhor_reta <- gambas_com_preds |> ggplot(aes(x = comprimento_total, y = comprimento_cabeca)) + geom_point(size = 2) + geom_abline( intercept = melhor_reta$coefficients[1], slope = melhor_reta$coefficients[2], size = 1, colour = "salmon" ) + geom_segment(aes(xend = comprimento_total, yend = pred_melhor_reta), colour = "purple", size = 0.8) + labs( subtitle = "Resíduos da Melhor Reta", y = "Comprimento da cabeça (em mm)", x = "Comprimento total (em cm)" ) + theme_minimal(15, "Charter") grafico_residuos_reta_a_mao <- gambas_com_preds |> ggplot(aes(x = comprimento_total, y = comprimento_cabeca)) + geom_point(size = 2) + geom_abline( intercept = 36, slope = 0.7, size = 1, colour = "orange" ) + geom_segment(aes(xend = comprimento_total, yend = pred_reta_a_mao), colour = "purple", size = 0.8) + labs( subtitle = "Resíduos da Reta Escolhida a Mão", y = "Comprimento da cabeça (em mm)", x = "Comprimento total (em cm)" ) + theme_minimal(15, "Charter") grafico_residuos_melhor_reta + grafico_residuos_reta_a_mao + plot_annotation(title = "Os segmentos roxos são os resíduos (ou o quanto o modelo errou naqueles pontos).", theme = theme_minimal(15, "Charter")) ``` ## E se quisermos usar mais preditores? ::: columns ::: {.column width="50%"} #### Regressão linear múltipla
$y = \beta_0 + \beta_1x_1 + \cdots + \beta_px_p$

#### Exemplo
$cabeça = \beta_0 + \beta_1total + \beta_2cauda$

```{r linear-multipla-no-r-gambas} #| eval: false # No R lm(comprimento_cabeca ~ comprimento_total + comprimento_cauda, data = gambas) ``` ::: ::: {.column width="50%"} ```{r multipla-plotly} #| echo: false #| fig-align: "center" #| out.width: "100%" set.seed(1) library(plotly) x <- gambas$comprimento_total y <- gambas$comprimento_cauda z <- gambas$comprimento_cabeca fit <- lm(z ~ x + y) grid.lines <- 26 x.pred <- seq(min(x), max(x), length.out = grid.lines) y.pred <- seq(min(y), max(y), length.out = grid.lines) xy <- expand.grid(x = x.pred, y = y.pred) z.pred <- matrix(predict(fit, newdata = xy), nrow = grid.lines, ncol = grid.lines) fig <- plot_ly(data = gambas) |> add_trace( x = ~ comprimento_total, y = ~ comprimento_cauda, z = ~ comprimento_cabeca, type = "scatter3d", mode = "markers", opacity = .8 ) |> add_trace( z = z.pred, x = x.pred, y = y.pred, type = "surface", opacity = .9 ) |> layout(scene = list(xaxis = list(title = "Total (cm)"), yaxis = list(title = "Cauda (cm)"), zaxis = list(title = "Cabeça (mm)"))) |> hide_legend() |> hide_colorbar() fig ``` ::: ::: ## O que o R nos diz? ```{r modelo-cabeca-pelo-total-e-cauda} modelo_linear_multiplo <- lm(comprimento_cabeca ~ comprimento_total + comprimento_cauda, data = gambas) summary(modelo_linear_multiplo) ``` . . .
$$ cabeça = 46.8 + 0.64total - 0.28cauda $$
## Coeficiente de determinação * O $R^2$ (coeficiente de determinação) é a proporção da variância na variável resposta que pode ser explicada pelos preditores * Varia de 0 a 1 . . . ```{r r-quadrado-modelo-cabeca} # Extrair o R^2 summary(modelo_linear_multiplo)$r.squared # Extrair o R^2 ajustado summary(modelo_linear_multiplo)$adj.r.squared ``` . . .
"O modelo demonstra que `r paste0(format(round(summary(modelo_linear_multiplo)$adj.r.squared * 100, 1), decimal.mark = ","), "%")` da variação no comprimento da cabeça dos gambás pode ser explicado pelo comprimento total e comprimento da cauda dos gambás."
## Preditores categóricos #### Preditores com apenas duas categorias Pergunta de pesquisa: O tamanho das nadadeiras dos pinguins variam conforme o sexo? ::: columns ::: {.column width="50%"} ```{r boxplot-nadadeira-sexo} #| echo: false #| out.width: "100%" #| fig-align: "center" dados::pinguins |> filter(!is.na(sexo)) |> mutate( sexo = if_else(sexo == "macho", "Macho", "Fêmea") ) |> ggplot(aes(y = comprimento_nadadeira, x = sexo, fill = sexo)) + geom_boxplot(show.legend = FALSE) + ghibli::scale_fill_ghibli_d("MarnieLight1") + labs(y = "Comprimento da nadadeira (mm)", x = "Sexo") + theme_minimal(20, "Charter") ``` ::: ::: {.column width="50%"} ```{r scatterplot-nadadeira-sexo} #| echo: false #| out.width: "100%" #| fig-align: "center" set.seed(1) dados::pinguins |> filter(!is.na(sexo)) |> mutate( sexo_macho = if_else(sexo == "macho", 1, 0) ) |> ggplot(aes(y = comprimento_nadadeira, x = sexo_macho)) + geom_jitter(width = 0.05, height = 0, alpha = 0.7, size = 2) + geom_smooth(method = "lm", se = FALSE, color = "#0E84B4FF", linewidth = 1.5) + labs(y = "Comprimento da nadadeira (mm)", x = "Sexo (macho)") + scale_x_continuous(breaks = 0:1) + theme_minimal(20, "Charter") ``` ::: ::: ```{r regressao-nadadeira-sexo} lm(comprimento_nadadeira ~ sexo, data = dados::pinguins) ``` ## Preditores categóricos #### Preditores com 3 ou mais categorias ::: columns ::: {.column width="50%"} ```{r boxplot-nadadeira-especie} #| echo: false #| out.width: "100%" #| fig-align: "center" dados::pinguins |> ggplot(aes(y = comprimento_nadadeira, x = especie, fill = especie)) + geom_boxplot(show.legend = FALSE) + ghibli::scale_fill_ghibli_d("MononokeMedium", direction = -1) + labs(y = "Comprimento da nadadeira (mm)", x = "Espécie") + theme_minimal(20, "Charter") ``` ```{r linear-nadadeira-especie} lm(comprimento_nadadeira ~ especie, data = dados::pinguins) ``` ::: ::: {.column width="50%"} Modelo: $$ y_i = \beta_0 + \beta_1x_{1i} + \beta_2x_{2i} $$ Em que: $$ x_{1i} = \Bigg \{ \begin{array}{ll} 1 & \text{se for }\texttt{Pinguim-de-barbicha}\\0&\text{caso contrário}\end{array} $$ $$ x_{2i} = \Bigg \{ \begin{array}{ll} 1 & \text{se for }\texttt{Pinguim-gentoo}\\0&\text{caso contrário}\end{array} $$ ::: ::: ## Heteroscedasticidade * Inconstância da variabilidade dos erros . . . ```{r plot-heteroscedasticidade} #| out.width: "100%" #| echo: false #| fig-align: "center" set.seed(1) hetero_df <- tibble( x = runif(50), y = rnorm(50, mean = x, sd = x * 0.5) ) cru <- ggplot(hetero_df, aes(x = x, y = y)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + theme_minimal(20, "Charter") + labs(x = unname(latex2exp::TeX("$x_1$")), y = "Y", title = unname(latex2exp::TeX("$Y = \\beta_0 + \\beta_1x_1$"))) cru ``` ## Lidando com a heteroscedasticidade * Como diagnosticar? - Visualização dos resíduos (`gglm::gglm()`) - Testes (Breuch-Pagan através da função `lmtest::bptest()`) * Como tratar? - Transformações na variável resposta ($log(Y)$, $\sqrt{Y}$, $\frac{1}{Y}$) - Regressão com pesos . . . ```{r plot-heteroscedasticidade-contornada} #| out.width: "50%" #| echo: false #| fig-align: "center" raiz <- ggplot(hetero_df, aes(x = x, y = sqrt(y))) + geom_point() + geom_smooth(method = "lm", se = FALSE) + theme_minimal(20, "Charter") + labs(x = unname(latex2exp::TeX("$x_1$")), y = unname(latex2exp::TeX("$\\sqrt{Y}")), title = unname(latex2exp::TeX("$\\sqrt{Y} = \\beta_0 + \\beta_1x_1$"))) cru + raiz ``` ## Multicolinearidade * Ocorre quando duas ou mais variáveis preditoras são altamente correlacionadas umas com as outras * Não fornecem informações exclusivas * Exemplo: preço de um imóvel ($Y$) explicado pela área ($x_1$) e número de cômodos ($x_2$) . . . ```{r exemplo-multicolinearidade-preco-area-quartos} #| echo: false #| out.width: "80%" #| fig-align: "center" set.seed(1) area <- rnorm(100, mean = 1500, sd = 500) comodos <- round(rnorm(100, mean = 3 + 0.5 * area/100, sd = 1), 0) preco <- rnorm(100, mean = 200000 + 100 * area + 50000 * comodos, sd = 50000) area <- area / 10 dados <- data.frame(area, comodos, preco) ggplot(dados, aes(x = area, y = preco, color = comodos)) + geom_point() + scale_color_viridis_c(name = "Cômodos") + scale_y_continuous(labels = scales::dollar_format(prefix = "R$ ", big.mark = ".")) + scale_x_continuous(labels = \(x) unname(latex2exp::TeX(paste0(as.character(x), "$m^2$")))) + theme_minimal(20, "Charter") + labs(x = "Área", y = "Preço do imóvel") ``` ## Lidando com a multicolinearidade ::: columns ::: {.column width="50%"} * Problemas - Instabilidade numérica - Desvios padrão inflados - Interpretação comprometida * Soluções - Eliminar uma das variáveis muito correlacionadas - Consultar o *variance inflation factor* (VIF) ::: ::: {.column width="50%"} ```{r calcular-vif-preco-imovel} library(car) regressao_linear <- lm(preco ~ area + comodos, data = dados) vif(regressao_linear) ``` * Regra geral - Valor 1: sem correlação entre o preditor e os demais preditores - Valor entre 1 e 5: Correlação moderada entre o preditor e demais preditores - Valor maior que 5: Correlação severa que pode afetar $p$-valores e coeficientes da regressão, sendo potencialmente não confiáveis ::: ::: ## Outliers * As observações distantes das outras do conjunto de dados são consideradas **outliers** . . . ```{r ilustracao-influencia-outlier} #| echo: false #| fig-align: "center" #| out.width: "90%" set.seed(1) x <- 1:10 y <- 2*x + rnorm(10, mean = 0, sd = 1) df <- data.frame(x, y) # Criando o gráfico sem outlier p_sem_outlier <- ggplot(df, aes(x = x, y = y)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + scale_x_continuous(limits = c(0, 12.5)) + scale_y_continuous(limits = c(0, 50)) + theme_minimal(18, "Charter") + labs(x = unname(latex2exp::TeX("$x_1$")), y = unname(latex2exp::TeX("$Y$"))) # Adicionando um outlier aos dados df[11, ] <- c(12, 50) # Criando o gráfico com outlier p_com_outlier <- ggplot(df, aes(x = x, y = y)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + theme_minimal(18, "Charter") + scale_x_continuous(limits = c(0, 12.5)) + scale_y_continuous(limits = c(0, 50)) + labs(x = unname(latex2exp::TeX("$x_1$ com \\textit{outlier}")), y = NULL) p_sem_outlier + p_com_outlier ``` ## Lidando com outliers ::: columns ::: {.column width="40%"} * Como diagnosticar? - Visualização univariada (histograma, boxplot) - Comparação do valor com o desvio padrão - Distância de Cook * Como tratar? - Transformações $log()$, etc - Categorização - Remover valores extremos (não recomendado) ::: ::: {.column width="60%"} ```{r distancia-cook-codigo} modelo_com_outlier <- lm(y ~ x, data = df) cooks.distance(modelo_com_outlier) 4 / nrow(df) ``` ```{r distancia-cook-com-outlier-plot} #| echo: false #| fig-align: "center" #| out.width: "100%" modelo_com_outlier <- lm(y ~ x, data = df) distancia_cook <- cooks.distance(modelo_com_outlier) df_cook <- data.frame(distancia_cook, row.names = NULL) ggplot(df_cook, aes(x = as.numeric(row.names(df_cook)), y = distancia_cook)) + geom_point(size = 3) + scale_x_continuous(breaks = 1:11) + geom_hline(yintercept = 4/nrow(df_cook), color = "darkred", size = 2) + labs(x = "Observação", y = "Distância de Cook") + theme_minimal(20, "Charter") ``` ::: ::: ## Correlação *vs.* Regressão linear ::: columns ::: {.column width="50%"} #### Similaridades * Coeficiente de regressão padronizado é o mesmo que o coeficiente de correlação de Pearson * O quadrado do coeficiente de correlação de Pearson é o mesmo que o $R^2$ na regressão linear simples * O sinal do coeficiente não-padronizado da regressão será o mesmo do coeficiente de correlação * Nenhum dos métodos respondem perguntas de causalidade ::: ::: {.column width="50%"} #### Diferenças * A equação da regressão ($\beta_0 + \beta_1x_1$) pode ser usada para fazer predições de $Y$ baseado em $X$ * Apesar da correlação se referir comumente a relações lineares, o conceito pode estar associado a outros tipos de associação * Correlação entre $X$ e $Y$ é a mesma correlação de $Y$ e $X$. Já na regressão linear, o coeficiente muda quando comparamos um modelo que prediz $Y$ a partir de $X$ e um modelo que prediz $X$ a partir de $Y$ ::: ::: ## Tarefa de casa * Ler Capítulo 8 do [livro OpenIntro Statistics](https://www.openintro.org/book/os/) sobre *Introduction to linear regression* - Caso queira se aprofundar, ler Capítulo 9 sobre *Multiple and logistic regression* * A partir dos dados `dados_iris` do pacote `dados`, crie um modelo de regressão linear simples e um modelo de regressão linear múltipla com as variáveis da sua escolha - Lembre-se que o desfecho deve ser contínuo (numérico) * Crie um gráfico de dispersão/pontos (*scatterplot*) para acompanhar sua análise de regressão linear simples