class: title-slide, inverse, middle, right background-image: url(https://images.unsplash.com/photo-1560806175-2e9e26340b2b?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80) background-size: cover ### Clase 8 # Factores y <br> Anova ## Miriam Lerma<br> Marzo 2021 --- class: inverse # Intro - [Factores](#factores) - [Analisis de varianza](#anova) -- ## Ustedes - Conocimientos de R (saben abrirlo, cargar paquetes y datos, saben hacer operaciones y graficos). - Quieren saber como transformar a factor y conocer la sintaxis para hacer analisis de varianza en R. -- **Notas** <br> Ya vieron teoría. <br> Recuerden que los modelos dependen de sus preguntas y experimentos o muestreos. --- class: inverse # Créditos & materiales: Materiales <br> [
Sthda por Alboukadel Kassambara](http://www.sthda.com/english/wiki/one-way-anova-test-in-r) [
Handbook of Regression Models in People Analytics](http://peopleanalytics-regression-book.org/) [
Tutoriales STAT 545](https://stat545.com/) [
ourcodingclub](https://ourcodingclub.github.io/tutorials/mixed-models/) [
Libro por Steve Midway](https://bookdown.org/steve_midway/DAR/understanding-anova-in-r.html) Imágenes adicionales <br> [
Unsplash](https://unsplash.com/)<br> [
Portada Unsplash por Thomas Millot](https://unsplash.com/@tmillot) --- name: factores class: title-slide, inverse, bottom background-image: url(https://images.unsplash.com/photo-1551415923-31d2072bc248?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=2089&q=80) background-size: cover # 1. Factores --- ## 1.1. Titanic Instalar y cargar el paquete ```r #install.packages('titanic') library(titanic) library(tidyverse) ``` Renombremos el dataframe que vamos a usar y agreguemoslo a nuestro environment. ```r Titanic_datos<-titanic_train ``` Vamos a usar estos datos por que no están "limpios". La idea es que **consideren** que algunas variables se deben transformar a **factores**. --- ## 1.2. Columnas y valores Renombrar columnas para que estén en español. ```r Titanic_datos <- Titanic_datos %>% rename(sobrevivio=Survived, clase=Pclass, edad=Age, sexo=Sex, embarcado=Embarked, precio=Fare) ``` Transformamos los espacios vacíos ("") a NA ```r Titanic_datos$embarcado <- ifelse(Titanic_datos$embarcado == "", NA, Titanic_datos$embarcado) ``` --- ## 1.3. Factores Que tipos de datos tenemos? - **int**: integral, numérico sin decimales - **chr**: character - **dbl**: double, es un tipo numérico de doble precisión - **fct**: factor? No hay ninguno con esta clase. ```r glimpse(Titanic_datos) ``` ``` ## Rows: 891 ## Columns: 12 ## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,… ## $ sobrevivio <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1… ## $ clase <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3… ## $ Name <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl… ## $ sexo <chr> "male", "female", "female", "female", "male", "male", "mal… ## $ edad <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, … ## $ SibSp <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0… ## $ Parch <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0… ## $ Ticket <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37… ## $ precio <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,… ## $ Cabin <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C… ## $ embarcado <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"… ``` --- ## 1.3. Factores Transformamos columnas que son factores a factor. **fct**: factor? Ahora si existen columnas con esta clase. ```r Titanic_datos<-Titanic_datos%>% mutate(sobrevivio = as_factor(sobrevivio), clase = as_factor(clase), sexo = as_factor(sexo)) ``` ```r glimpse(Titanic_datos) ``` ``` ## Rows: 891 ## Columns: 12 ## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,… ## $ sobrevivio <fct> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1… ## $ clase <fct> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3… ## $ Name <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl… ## $ sexo <fct> male, female, female, female, male, male, male, male, fema… ## $ edad <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, … ## $ SibSp <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0… ## $ Parch <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0… ## $ Ticket <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37… ## $ precio <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,… ## $ Cabin <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C… ## $ embarcado <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"… ``` --- ## 1.4. Sobrevivencia ¿Cuál fue el número de sobrevivientes? Vamos a crear un objeto con esa tabla. ```r Sobrevivientes<-Titanic_datos %>% group_by(sobrevivio) %>% count() ``` Usaremos la informacion de la tabla que creamos para agregar el numero de sobreviventes. .pull-left[ ```r g1 <- ggplot(Titanic_datos, aes(sobrevivio)) + geom_bar()+ * geom_text(data = Sobrevivientes, aes(sobrevivio, y=25, label=n), color="white")+ xlab("sobrevivencia")+ ylab("Frecuencia")+ theme_classic() ``` ] .pull-right[ <img src="Clase8_files/figure-html/unnamed-chunk-12-1.png" width="80%" /> ] **Nuevo concepto** podemos usar _geom_text_ para incluir texto en el gráfico. --- ## 1.4. Precio Podemos explorar si los que tenían un boleto mas caro, tenían mas posibilidades de sobrevivir. .pull-left[ ```r p1 <- ggplot(Titanic_datos, aes(x=sobrevivio, y=precio)) + geom_boxplot()+ xlab("sobrevivencia")+ ylab("Precio del boleto")+ theme_classic()+ scale_x_discrete(breaks=c("0","1"), labels=c("No", "Sí")) ``` ] .pull-right[ <img src="Clase8_files/figure-html/unnamed-chunk-14-1.png" width="80%" /> ] **Nuevos conceptos** - Podemos usar _scale_x_discrete_ para cambiar la etiqueta en el eje _x_. --- ## 1.5. Clase y edad Podemos explorar si los que tenian la edad tenia un efecto, ademas de la clase, en las posibilidades de sobrevivir. .pull-left[ ```r c1<-ggplot(Titanic_datos, aes(x= as.factor(clase), edad, fill=sobrevivio))+ geom_violin()+ xlab("Clase")+ ylab("Edad")+ theme_bw()+ theme(legend.position='top')+ scale_fill_brewer(palette = "Set1") ``` ] .pull-right[ <img src="Clase8_files/figure-html/unnamed-chunk-16-1.png" width="80%" /> ] **Nuevos conceptos** - Podemos usar _scale_fill_brewer_ para cambiar los colores de relleno. --- ## 1.6. Sexo y clase Podemos explorar los datos separando por sexo, por clase y por si sobrevivieron o no. .pull-left[ ```r p3<-ggplot(Titanic_datos, aes(sexo, sobrevivio))+ * geom_jitter(aes(color=interaction(factor(sexo), sobrevivio)))+ facet_wrap(~clase)+ ylab("Supervivencia")+ scale_y_discrete(breaks=c("0","1"), labels=c("No", "Sí"))+ theme(legend.position = "none")+ scale_color_brewer(palette = "Set2") ``` ] .pull-right[ <img src="Clase8_files/figure-html/unnamed-chunk-18-1.png" width="80%" /> ] **Nuevos conceptos** - Podemos usar _geom_jitter_ para mover los puntos. - Podemos usar _scale_color_brewer_ para cambiar los colores de los puntos. --- # Ejercicios
- Cargar **paquetes** de titanic y tidyverse - **Renombrar** objeto, columnas y transformar espacios vacíos a NA - Crear tres **gráficos** y cambiar clase de columnas a factor .panelset[ .panel[.panel-name[Paquetes] ```r #install.packages('titanic') library(titanic) library(tidyverse) ``` ] .panel[.panel-name[Renombrar] Renombremos el dataframe que vamos a usar y agreguemoslo a nuestro environment. ```r Titanic_datos<-titanic_train ``` Renombrar columnas para que estén en español. ```r Titanic_datos <- Titanic_datos %>% rename(sobrevivio=Survived, clase=Pclass, edad=Age, sexo=Sex, embarcado=Embarked, precio=Fare) ``` ] .panel[.panel-name[NAs] Transformamos los espacios vacíos ("") a NA ```r Titanic_datos$embarcado <- ifelse(Titanic_datos$embarcado == "", NA, Titanic_datos$embarcado) ``` ] .panel[.panel-name[Precio] Prueba con y sin cambiar a factor. ```r ggplot(Titanic_datos,aes(x=sobrevivio,y=precio)) + geom_boxplot()+ xlab("sobrevivencia")+ ylab("Precio del boleto")+ theme_classic()+ scale_x_discrete(breaks=c("0","1"), labels=c("No", "Sí")) ``` Noten que las clases son 1, 2 y 3 si no le decimos que es **factor**, lo interpreta como **numérico**. Para transformar a factor. ```r Titanic_datos$sobrevivio <- as_factor(Titanic_datos$sobrevivio) ``` ] .panel[.panel-name[Clase y edad] Prueba con y sin cambiar a factor. ```r ggplot(Titanic_datos,aes(x= as_factor(clase), edad, fill=sobrevivio))+ geom_violin()+ xlab("Clase")+ ylab("Edad")+ theme_bw()+ theme(legend.position='top')+ scale_fill_brewer(palette = "Set1") ``` Para transformar a factor. ```r Titanic_datos$clase <- as_factor(Titanic_datos$clase) ``` ] .panel[.panel-name[Clase y sexo] Prueba con y sin cambiar a factor. ```r ggplot(Titanic_datos,aes(sexo, sobrevivio))+ geom_jitter(aes(color=interaction(as_factor(sexo), sobrevivio)))+ facet_wrap(~clase)+ ylab("Supervivencia")+ scale_y_discrete(breaks=c("0","1"), labels=c("No", "Sí"))+ theme(legend.position = "none")+ scale_color_brewer(palette = "Set2") ``` Para transformar a factor. ```r Titanic_datos$sexo <- as.factor(Titanic_datos$sexo) ``` ] ] --- name: anovas class: title-slide, inverse, bottom background-image: url(https://images.unsplash.com/photo-1560806175-2e9e26340b2b?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80) background-size: cover # ANOVAS --- ## 2.1. Teoría [Teoria](https://rpubs.com/Joaquin_AR/219148) El análisis de la varianza (ANOVA) se utiliza de forma intensiva en el análisis y diseño de experimentos para evaluar el efecto de tratamientos en la variabilidad de la variable respuesta. <br> -- Un análisis de la varianza permite determinar, por ejemplo, si diferentes tratamientos (es decir, un grupo de más de dos tratamientos) muestran diferencias significativas en sus resultados o si por el contrario puede suponerse que sus medias poblacionales no difieren. --- ## 2.2. Insectos [Ejercicio](https://biocosas.github.io/R/050_anova.html) Estamos interesados en conocer si hay colores más atractivos para los insectos. Para ello se diseñaron trampas con los siguientes colores: amarillo, azul, blanco y verde. Se cuantificó el número de insectos que quedaban atrapados. <br> <br> Generemos los datos. ```r insectos <- c(16,11,20,21,14,7,37,32,15,25,39, 41,21,12,14,17,13,17,45,59,48,46,38,47) colores <- as.factor(c(rep(c("azul", "verde", "blanco", "amarillo"), each=6))) ``` **Nuevo concepto** _rep_ es repetir ese factor, _each_ seis veces. Crear data frame. ```r Insectos_df<-data.frame(insectos=insectos,colores=colores) ``` --- ## 2.2. Insectos Exploramos los datos ```r Trampas_Fig<-ggplot(Insectos_df, aes(x=colores,y=insectos)) + geom_boxplot(aes(fill=colores))+ xlab("Número de insectos atrapados")+ ylab("Color trampa")+ theme(legend.position = 'none')+ * scale_fill_manual(values=c("#e9c46a", "#457b9d","#f1faee","#2a9d8f")) Trampas_Fig ``` ![](Clase8_files/figure-html/unnamed-chunk-31-1.png)<!-- --> **Nuevo concepto** _scale_fill_manual_ para especificar los colores a usar. --- ## 2.3. ANOVA Esta es la forma de pedir un ANOVA en R: ```r Anova_insectos<-aov(lm(insectos ~ colores)) ``` Elementos generados en el ANOVA: ```r names(Anova_insectos) ``` ``` ## [1] "coefficients" "residuals" "effects" "rank" ## [5] "fitted.values" "assign" "qr" "df.residual" ## [9] "contrasts" "xlevels" "call" "terms" ## [13] "model" ``` Igual que con los modelos lineares, pedimos un resumen de la tabla del ANOVA ```r summary(Anova_insectos) ``` ``` ## Df Sum Sq Mean Sq F value Pr(>F) ## colores 3 4218 1406 30.55 1.15e-07 *** ## Residuals 20 921 46 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` --- ## 2.3. TukeyHSD Si hemos detectado diferencias significativas entre las medias de las poblaciones. ¿Sería posible saber cuáles son los grupos que generan estas diferencias? .pull-left[ ```r Insectos_df %>% group_by(colores) %>% summarise(promedio=mean(insectos)) ``` ``` ## # A tibble: 4 × 2 ## colores promedio ## <fct> <dbl> ## 1 amarillo 47.2 ## 2 azul 14.8 ## 3 blanco 15.7 ## 4 verde 31.5 ``` ] .pull-right[ <img src="Clase8_files/figure-html/unnamed-chunk-36-1.png" width="80%" /> ] --- ## 2.3. TukeyHSD Prueba post-hoc. ```r intervalos<-TukeyHSD(Anova_insectos) intervalos ``` ``` ## Tukey multiple comparisons of means ## 95% family-wise confidence level ## ## Fit: aov(formula = lm(insectos ~ colores)) ## ## $colores ## diff lwr upr p adj ## azul-amarillo -32.3333333 -43.296330 -21.37034 0.0000004 ## blanco-amarillo -31.5000000 -42.462996 -20.53700 0.0000006 ## verde-amarillo -15.6666667 -26.629663 -4.70367 0.0036170 ## blanco-azul 0.8333333 -10.129663 11.79633 0.9964823 ## verde-azul 16.6666667 5.703670 27.62966 0.0020222 ## verde-blanco 15.8333333 4.870337 26.79633 0.0032835 ``` --- ## 2.4. Validación del modelo Los supuestos que se deben cumplir son tres: - Independencia, - homocedasticidad y - normalidad. --- ## 2.5. Independencia Los valores deben ser independientes. ```r plot(Anova_insectos$residuals) ``` ![](Clase8_files/figure-html/unnamed-chunk-38-1.png)<!-- --> --- ## 2.6. Normalidad El test de Shapiro-Wilk indica que no tenemos evidencia suficiente para rechazar la hipótesis nula (normalidad de los residuos) ```r shapiro.test(Anova_insectos$residuals) ``` ``` ## ## Shapiro-Wilk normality test ## ## data: Anova_insectos$residuals ## W = 0.97337, p-value = 0.75 ``` ```r hist(Anova_insectos$residuals) ``` ![](Clase8_files/figure-html/unnamed-chunk-40-1.png)<!-- --> ```r qqnorm(Anova_insectos$residuals) qqline(Anova_insectos$residuals) ``` ![](Clase8_files/figure-html/unnamed-chunk-40-2.png)<!-- --> --- ## 2.7. Homocedasticidad El test de Bartlett indica que no tenemos evidencia suficiente para rechazar la hipótesis nula (las varianzas son iguales) ```r bartlett.test(Anova_insectos$residuals ~ colores) ``` ``` ## ## Bartlett test of homogeneity of variances ## ## data: Anova_insectos$residuals by colores ## Bartlett's K-squared = 5.2628, df = 3, p-value = 0.1535 ``` --- ## 2.8. Anova con dos factores Crear nueva columna con factor de tamaño. ```r Insectos_df$tamanio <- as.factor(c(rep(c("grande", "mediana", "chica"), each=2))) ``` Crear nuevo modelo. ```r Anova_insectos_2<-aov((insectos ~ colores + tamanio),data=Insectos_df) ``` Resultados del modelo. ```r summary(Anova_insectos_2) ``` ``` ## Df Sum Sq Mean Sq F value Pr(>F) ## colores 3 4218 1406.2 28.96 4.18e-07 *** ## tamanio 2 47 23.3 0.48 0.627 ## Residuals 18 874 48.6 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` --- ## 2.8. Anovas con interaccion Agregar interacción en el modelo. ```r Anova_insectos_3<-aov((insectos ~ colores * tamanio),data=Insectos_df) ``` Otra manera de escribir el mismo modelo. ```r Anova_insectos_4<-aov((insectos ~ colores + tamanio + colores : tamanio),data=Insectos_df) ``` --- ## 2.8. Anovas con interaccion Mismos resultados. ```r summary(Anova_insectos_3) ``` ``` ## Df Sum Sq Mean Sq F value Pr(>F) ## colores 3 4218 1406.2 57.103 2.24e-07 *** ## tamanio 2 47 23.3 0.946 0.4155 ## colores:tamanio 6 578 96.4 3.915 0.0212 * ## Residuals 12 296 24.6 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` ```r summary(Anova_insectos_4) ``` ``` ## Df Sum Sq Mean Sq F value Pr(>F) ## colores 3 4218 1406.2 57.103 2.24e-07 *** ## tamanio 2 47 23.3 0.946 0.4155 ## colores:tamanio 6 578 96.4 3.915 0.0212 * ## Residuals 12 296 24.6 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` --- # Ejercicios
- Generar **datos y modelo** - Verificar algunos **supuestos** - Analisis **post-hoc** - Crear anova de **dos factores** - Crear anova con **interacción** .panelset[ .panel[.panel-name[Datos y modelo] Generar datos y modelo. ```r insectos <- c(16,11,20,21,14,7,37,32,15,25,39,41,21,12,14,17,13,17,45,59,48,46,38,47) colores <- as.factor(c(rep(c("azul", "verde", "blanco", "amarillo"), each =6))) ``` ```r Anova_insectos<-aov(lm(insectos ~ colores)) ``` ```r summary(Anova_insectos) ``` ] .panel[.panel-name[Supuestos] ```r plot(Anova_insectos$residuals) ``` ```r hist(Anova_insectos$residuals) qqnorm(Anova_insectos$residuals) qqline(Anova_insectos$residuals) ``` ```r shapiro.test(Anova_insectos$residuals) ``` ```r bartlett.test(Anova_insectos$residuals ~ colores) ``` ] .panel[.panel-name[Post-hoc] Veamos si los grupos son diferentes y cuales grupos son diferentes. ```r TukeyHSD(Anova_insectos) ``` ```r Insectos_df<-data.frame(insectos=insectos,colores=colores) ggplot(Insectos_df, aes(x=colores,y=insectos)) + geom_boxplot(aes(fill=colores))+ xlab("Color de la trampa")+ ylab("Numero de insectos")+ scale_fill_manual(values=c("#e9c46a", "#457b9d","#f1faee","#2a9d8f"))+ theme_classic()+ theme(legend.position = "none") ``` ] .panel[.panel-name[Dos factores] Crear nueva columna con factor de tamaño. ```r Insectos_df$tamanio <- as.factor(c(rep(c("grande", "mediana", "chica"), each=2))) ``` ```r Anova_insectos_2<-aov((insectos ~ colores + tamanio),data=Insectos_df) ``` ```r summary(Anova_insectos_2) ``` ] .panel[.panel-name[Interacciones] Interacción: ```r Anova_insectos_3<-aov((insectos ~ colores * tamanio),data=Insectos_df) ``` ```r Anova_insectos_4<-aov((insectos ~ colores + tamanio + colores : tamanio),data=Insectos_df) ``` ```r summary(Anova_insectos_3) ``` ```r summary(Anova_insectos_4) ``` ] ] --- class: title-slide, inverse background-image: url(https://images.unsplash.com/photo-1560806175-2e9e26340b2b?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1000&q=80) background-size: cover # Recapitulando <br> <br> <br> - [Factores](#factores) - [Analisis de varianza](#anova) <br> <br> <br> <br> .right[ Para dudas, comentarios y sugerencias:<br> Escríbeme a miriamjlerma@gmail.com Este material esta accesible y se encuentra en <br> mi [
github](https://github.com/MiriamLL/Curso_CIAD/) y mi [
página ](https://www.miriam-lerma.com) ] <h1> .right[ [
](https://www.miriam-lerma.com/teaching.html) ]</h1>