class: center, middle # Regresión lineal ### Análisis estadístico utilizando R <img src="https://miro.medium.com/max/1400/1*guak1sQTh5sAf46NMzbQig.jpeg" width="30%" /> UNQ UNTreF CONICET Ignacio Spiousas [<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:#A42339;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg>](https://github.com/spiousas) [<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:#A42339;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>](https://twitter.com/Spiousas) Pablo Etchemendy [<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:black;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg>](https://github.com/https://github.com/petcheme) [<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;fill:#black;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path></svg>](https://twitter.com/petcheme) 2021-08-20 --- class: left, top, highlight-last-item # Ajustando una recta .pull-left[ <img src="linear_models_1_files/figure-html/unnamed-chunk-1-1.png" width="100%" style="display: block; margin: auto;" /> ] .pull-right.big[ La ecuación de esta recta la conocemos: <br> `$$y = 0 + 365 x$$` Y de forma general podemos escribir: <br> `$$y = b_0 + b_1 x + e$$` Donde `\(b_0\)` es la **ordenada al origen** y `\(b_1\)` la **pendiente** y `\(e\)` es el **error** `$$y = \hat{y} + e$$` ] ??? Los parámetros se calculan con los datos, es decir, son estimaciones. Cuando usamos x para predecir y, generalmente llamamos a x la variable predictora y llamamos a y el resultado. --- class: left, top, highlight-last-item # Ajustando una recta .pull-left[ El mundo real se va a parecer un poco más a esto: <img src="linear_models_1_files/figure-html/unnamed-chunk-2-1.png" width="80%" style="display: block; margin: auto;" /> ] -- .pull-right[ O esto: <img src="linear_models_1_files/figure-html/unnamed-chunk-3-1.png" width="80%" style="display: block; margin: auto;" /> ] --- class: left, top, highlight-last-item # Ajustando una recta Tengamos cuidado de que la recta tenga sentido <img src="linear_models_1_files/figure-html/unnamed-chunk-4-1.png" width="40%" style="display: block; margin: auto;" /> --- class: left, top, highlight-last-item # Ajustando una recta Cuál es la diferencia entre estos dos ajustes, ambos con la recta `$$y = 10 + 15 x$$` .pull-left[ <img src="linear_models_1_files/figure-html/unnamed-chunk-5-1.png" width="80%" style="display: block; margin: auto;" /> ] .pull-right[ <img src="linear_models_1_files/figure-html/unnamed-chunk-6-1.png" width="80%" style="display: block; margin: auto;" /> ] ??? Hablar del sentido de la ordenada al origen y de los valores que no entran dentro del rango. La extrapolación es peligrosa. --- class: left, top, highlight-last-item # El peso de los pinguinos Vamos a predecir el peso de un pinguino **Adelie** utilizando el largo de su aleta .pull-left[ <img src="linear_models_1_files/figure-html/unnamed-chunk-7-1.png" width="80%" style="display: block; margin: auto;" /> ] .pull-right.big[ La ecuación de esta recta es: `$$\hat{y} =-2508.09 + 32.69 x$$` ] --- class: left, top, highlight-last-item # El peso de los pinguinos Vamos a predecir el peso de un pinguino **Adelie** utilizando el largo de su aleta .pull-left[ <img src="linear_models_1_files/figure-html/unnamed-chunk-8-1.png" width="80%" style="display: block; margin: auto;" /> ] .pull-right[ .big[ La ecuación de esta recta es: `$$\hat{y} =-2508.09 + 32.69 x$$` ] Veamos este individuo: <table class="table" style="margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:right;"> flipper_length_mm </th> <th style="text-align:right;"> body_mass_g </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 198 </td> <td style="text-align:right;"> 4400 </td> </tr> </tbody> </table> La aleta del pingüno mide *198 mm* y su peso es *4400 g* Sin embargo, la predicción del modelo es: `$$\hat{y} =-2508.09 + 32.69 · 198$$` `$$\hat{y} = 3964.53$$` Es decir: `$$e = y - \hat{y} = 4400 - 3964.53$$` `$$e = 437.47$$` ] ??? Hablar de que esa predicción la podemos pensar como el promedio Decir que esa diferencia son los residuos --- class: left, top, highlight-last-item # Los residuos 🗑 Los rediduos son la diferencia entre el ajuste y los datos $$ Datos = ajuste + residuos $$ $$ y = \hat{y} + e $$ .pull-left[ <img src="linear_models_1_files/figure-html/unnamed-chunk-10-1.png" width="80%" style="display: block; margin: auto;" /> ] .pull-right[ Cada observación tiene un residuo $$ y_i = \hat{y}_i + e_i $$ $$ e_i = y_i - \hat{y}_i $$ Normalmente se considera el **valor absoluto** de los residuos En estos casos son ```r abs(resid(m1)[c(12, 93, 96)]) ``` ``` ## 12 93 96 ## 416.2505 410.5390 597.2382 ``` ] --- class: left, top, highlight-last-item # Los residuos 🗑 Los residuos son útiles para evaluar qué tan bien se ajusta un modelo lineal a un conjunto de datos .pull-left[ <img src="linear_models_1_files/figure-html/unnamed-chunk-12-1.png" width="80%" style="display: block; margin: auto;" /> ] .pull-right[ Viendo los residuos podemos observar: - Si la distribución es **normal** - Si la **variabilidad** depende del predictor <br> <br> .big[¿Cómo nos pueden ayudar los residuos a elegir la mejor recta?] ] --- class: left, top, highlight-last-item # Cuadrados mínimos La forma más comun de encontrar la **mejor recta** es minimizar la suma cuadrática de los residuos $$ e_1^2 + e_2^2 + e_3^2 + ... + e_n^2 $$ -- .pull-left[ Por ejemplo, si dejamos fija la **ordenada al origen** y variamos la **pendiente** <img src="linear_models_1_files/figure-html/unnamed-chunk-13-1.png" width="60%" style="display: block; margin: auto;" /> ] .pull-right.big[ No vamos a entrar en detalle de cómo se hace computacionalmente este cálculo pero tengamos presente que: **Cuando ajustamos una regresión estamos minimizando la suma de los cuadrados de los residuos** Por eso: - No importa el signo del residuo - Residuos el doble de grandes aportan 4 veces más a la magnitud a minimizar ] --- class: left, top, highlight-last-item # Ajustando un modelo lineal con **R** Para ajustar una regresión (o modelo lineal, e' lo mismo), usamos la función de **R** Base `lm()` .pull-left[ ```r # m1 <- lm(body_mass_g ~ flipper_length_mm, penguins_adelie) m1 <- penguins_adelie %>% lm(body_mass_g ~ flipper_length_mm, .) summary(m1) ``` ``` ## ## Call: ## lm(formula = body_mass_g ~ flipper_length_mm, data = .) ## ## Residuals: ## Min 1Q Median 3Q Max ## -875.87 -333.10 -9.55 250.09 1143.33 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) -2508.088 986.911 -2.541 0.0121 * ## flipper_length_mm 32.689 5.188 6.300 3.4e-09 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 407.5 on 144 degrees of freedom ## Multiple R-squared: 0.2161, Adjusted R-squared: 0.2106 ## F-statistic: 39.69 on 1 and 144 DF, p-value: 3.402e-09 ``` ] .pull-right[ Si lo que queremos ver son los coeficientes debemos mirar la columna **Estimates** `$$\hat{y} =-2508.09 + 32.69 x$$` El resto de las cosas las vamos a entender más adelante... ] --- class: left, top, highlight-last-item # Ojo con la extrapolación .pull-left[ Si los valores que usamos para ajustar el modelo son muy distintos a los valores en los que vamos a querer predecir tenemos que tener cuidado. Por ejemplo: - Para un lago de aleta de 50 mm el peso es negativo - Para un largo de aleta de 300 el peso es 7.3 Kg ] .pull-right.big[ <img src="linear_models_1_files/figure-html/unnamed-chunk-15-1.png" width="80%" style="display: block; margin: auto;" /> ] --- class: left, top, highlight-last-item # ¿Cuán bueno es un **ajuste**? Lo que nos importa es **cuánta variabilidad explica el ajuste** Por eso la medida más común es: $$ R^2 = \frac{sd^2 - sd^2_{residuos}}{sd^2} $$ Es decir, la **variabilidad de la magnitud**, menos la **variabilidad de los residuos**, normalizada. .pull-left[ <img src="linear_models_1_files/figure-html/unnamed-chunk-16-1.png" width="95%" style="display: block; margin: auto;" /> ] .pull-right[ <img src="linear_models_1_files/figure-html/unnamed-chunk-17-1.png" width="95%" style="display: block; margin: auto;" /> ] --- class: left, top, highlight-last-item # ¿Cuán bueno es un **ajuste**? **Coeficiente de determinación** $$ R^2 = \frac{sd^2 - sd^2_{residuos}}{sd^2} $$ En nuestro caso: $$ R^2 = \frac{210332.4 - 164881.9}{210332.4} = 0.216$$ Que si vemos en el `summary()` de nuestro modelo: ```r m1 <- lm(body_mass_g ~ flipper_length_mm, data = penguins_adelie) summary(m1)$r.squared ``` ``` ## [1] 0.2160892 ``` o ```r r_cor <- cor(penguins_adelie$flipper_length_mm, penguins_adelie$body_mass_g) r_cor^2 ``` ``` ## [1] 0.2160892 ``` ??? Hablar de que no es la única forma de ver si un modelo es bueno --- class: left, top, highlight-last-item # Variables categóricas ¿Qué pasa si queremos predecir el peso con una variable categórica como la especie? .pull-left[ ```r penguins_adelie_gentoo <- penguins %>% drop_na() %>% filter(species %in% c("Adelie", "Gentoo")) m2 = lm(body_mass_g ~ species, data = penguins_adelie_gentoo) summary(m2) ``` ``` ## ## Call: ## lm(formula = body_mass_g ~ species, data = penguins_adelie_gentoo) ## ## Residuals: ## Min 1Q Median 3Q Max ## -1142.44 -356.16 -6.16 343.84 1207.56 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 3706.16 39.59 93.62 <2e-16 *** ## speciesGentoo 1386.27 59.07 23.47 <2e-16 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 478.3 on 263 degrees of freedom ## Multiple R-squared: 0.6768, Adjusted R-squared: 0.6756 ## F-statistic: 550.7 on 1 and 263 DF, p-value: < 2.2e-16 ``` ] .pull-left[ En este caso la ecuación que representa el modelo es: $$ peso = 3706.16 + 1386.27 * species $$ donde **species** vale 0 si es **Adelie** y 1 si es **Gentoo** <img src="linear_models_1_files/figure-html/unnamed-chunk-21-1.png" width="50%" style="display: block; margin: auto;" /> ] --- class: left, top, highlight-last-item # *Outliers* en regresión <img src="linear_models_1_files/figure-html/unnamed-chunk-22-1.png" width="50%" style="display: block; margin: auto;" /> --- class: left, top, highlight-last-item # Resumen .huge[ Aprendimos a: - Ajustar un modelo lineal con un *predictor* - Evaluar el ajuste - Interpretar la salida de *summary()* - Su relación con la correlación - Modelar e interpretar variables categóricas - Tener ciudado con los outliers Ahora nos queda ver cómo podemos **inferir** el comportamiento de una población a partir de una muestra. ] --- class: center, top # Referencias .left[.big[ - Mine Çetinkaya-Rundel and Johanna Hardin (2021). Introduction to Modern Statistics. Openintro Project. https://openintro-ims.netlify.app/index.html. ]]