class: center, middle, inverse, title-slide # Visualización y Análisis en
## Sesión II ### Javier Tamayo Leiva
### Pontificia Universidad Católica de Valparaíso ### Junio 22, 2021 --- <style> .title-slide { background-size: 30%; background-position: center left; } .fa { vertical-align: middle; } .center2 { margin: 0; position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } body { text-align: justify; } .title-slide h1 { color: #F2EAD0; font-size: 90px; # font-family: "blacksword"; } .title-slide, .title-slide h2, .title-slide h3 { color: #FFF9F2; # font-family: 'Cormorant Garamond', serif; } .remark-slide-number { position: inherit; } .remark-slide-number .progress-bar-container { position: absolute; bottom: 0; height: 4px; display: block; left: 0; right: 0; } .remark-slide-number .progress-bar { height: 100%; background-color: #F2CB07; } .left-code { color: #777; width: 38%; height: 92%; float: left; } .right-plot { width: 60%; float: right; padding-left: 1%; } .left-code-wide { color: #777; width: 60%; height: 92%; float: left; } .right-plot-narrow { width: 38%; float: right; padding-left: 1%; } .small .remark-code { /*Change made here*/ font-size: 65% !important; } .medium .remark-code { /*Change made here*/ font-size: 75% !important; } </style> ## Análisis exploratorio de datos (*Exploratory data analysis*) .pull-left[ ### Estadística descriptiva - {gtsummary} package <br><br> - {ggpubr} package <br><br> - Visualizando distribuciones <br> - Histograms, Density plot, Heatmaps <br> - Medidas de Tendencia <br> - q-q plots, ECDF plots<br> - Boxplot, Violin plots <br><br> - Análisis de normalidad <br> - Shapiro–Wilk test <br> - Kolmogorov-Smirnov test <br><br> - Análisis de Homocedasticidad <br> - Levene test <br> - Bartlett’s test <br> - Fligner-Killeen test <br> ] .pull-right[ ### Inferencia Estadística - Análisis de correlación <br> - Pearson's *r* <br> - Spearman's *ρ* (rho) <br> - Kendall's *τ* (tau) <br><br> - Reducción de dimensión <br> - Análisis de componentes principales (*PCA*) <br><br> - Modelos Lineales <br> - `lm()` <br><br> - Análisis de varianza <br> - F-test, T-test, chi-square <br> - ANOVA test <br> - Kruskal-Wallis test <br> - Scheirer-Ray-Hare test <br><br> - {report} package <br> ] --- ## Dependencias de esta clase ```r # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages(c("tidyverse","ggplot2","gtsummary","car","flextable","RColorBrewer","ggpubr", "Hmisc","corrplot","broom","scales","viridis","ggrepel","ggbiplot", "rcompanion","report","FSA")) ``` ```r # Cargar desde la librería sapply(c("tidyverse","ggplot2","gtsummary","car","flextable","RColorBrewer","ggpubr", "Hmisc","corrplot","broom","scales","viridis","ggrepel","ggbiplot","rcompanion", "report","FSA"), require, character.only = TRUE, quietly = TRUE) ``` <br> .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt4[ Si bien los paquetes más importantes de esta sesión se irán mostrando durante la presentación, te recomiendo instalar todos los paquetes y cargar las librerías para poder ir siguiendo en paralelo en tú sesión de R los ejercicios. .tr[ — _Consejos_ ]] --- class: inverse center middle # Análisis exploratorio de datos <br> --- ## Análisis exploratorio de datos El análisis exploratorio de datos o “EDA” (por sus siglas en inglés **E**xploratory **D**ata **A**nalysis), es como se conoce -en estadística- el proceso por el cual un investigador inspecciona un set de datos con la finalidad de generar preguntas, procesar y adquirir conocimiento (procesa datos, genera resultados), y refina o genera nuevas preguntas. <br> ### Proceso 1. Generar preguntas basandose en los datos. <br> 1. Obtener resultados (procesa datos, gráficos, modelos, etc.). <br> 1. Refinar preguntas y/o generar nuevas preguntas. <br><br> Si bien el nombre puede generar la impresión de un proceso estandarizado, en la práctica no hay reglas que limiten los análisis o técnicas utilizadas para generar el proceso iterativo. Sin embargo, existen análisis que se vuelven recurrentes durante el proceso. <br> .footnote[Análisis exploratorio de datos [(EDA) R4DS-ES](https://es.r4ds.hadley.nz/análisis-exploratorio-de-datos-eda.html)] --- class: inverse center middle ## Estadística descriptiva --- ## Los datos (ggplot2::diamonds)
Precio de mas de 50,000 diamantes cortados <br> --- ## paquete-**gtsummary** ```r # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages("gtsummary") # Instalar la versión beta desde GitHub install.packages("remotes") remotes::install_github("ddsjoberg/gtsummary") # Para guardar tablas en formato PDF, Word o PowerPoint # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages("flextable") # Instalar la versión beta desde GitHub devtools::install_github("davidgohel/flextable") ``` ```r # Cargar desde la librería library(gtsummary) library(flextable) ``` .footnote[[{gtsummary}](http://www.danieldsjoberg.com/gtsummary/index.html) package <br> [{gtsummary}](http://www.danieldsjoberg.com/gtsummary/reference/index.html) package reference] --- ## Resumir data con **gtsummary** ```r dmnd2 <- diamonds %>% select(cut) # Seleccionar solo columnas "class" desde mpg. Se pueden seleccionar # varias columnas en "select()". Ej select(class, year, ...) # También se pueden usar todas las columnas sí se saltan este paso. tbl_summary(dmnd2) %>% modify_header(label = "**Samples**") # Resumir data ```
Samples
N = 53,940
1
cut
Fair
1,610 (3.0%)
Good
4,906 (9.1%)
Very Good
12,082 (22%)
Premium
13,791 (26%)
Ideal
21,551 (40%)
1
n (%)
--- ## Resumir data con **gtsummary** ```r # Crear tabla resumen diamonds %>% tbl_cross(row = cut, col = color) %>% bold_labels() ``` .medium[
Characteristic
color
Total
D
E
F
G
H
I
J
cut
Fair
163
224
312
314
303
175
119
1,610
Good
662
933
909
871
702
522
307
4,906
Very Good
1,513
2,400
2,164
2,299
1,824
1,204
678
12,082
Premium
1,603
2,337
2,331
2,924
2,360
1,428
808
13,791
Ideal
2,834
3,903
3,826
4,884
3,115
2,093
896
21,551
Total
6,775
9,797
9,542
11,292
8,304
5,422
2,808
53,940
] ```r # Guardar en formato Word diamonds %>% tbl_cross(row = color, col = cut) %>% bold_labels() %>% as_flex_table() %>% # Transforma el elemento para su compatibilidad con {flextable} flextable::save_as_docx(path = "./diamonds.docx") # Nombre y ruta al documento Word a crear ``` --- ## paquete-**ggpubr** El paquete "**ggpubr**" proporciona algunas funciones que facilitan el uso de **ggplot2** para crear y personalizar gráficos con una estética orientada y apropiada para su publicación. Los gráficos y objetos creados son complementarios con las funciones y elementos en el universo **tidyverse** y **ggplot2**. <br> ```r # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages("ggpubr") # Instalar la versión beta desde GitHub install.packages("devtools") devtools::install_github("kassambara/ggpubr") ``` ```r # Cargar desde la librería library(ggpubr) ``` .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/index.html) package] --- class: inverse center middle ## Estadística descriptiva ### Visualizando distribuciones --- ## Histograms Gráfica la distribución de una variable continua dividiendola en `bins` y calculando sus frecuencías. <br> .left-code[ Versión {ggpubr} package ```r gghistogram(diamonds, x = "price", fill = "royalblue", bins = 100) ``` Versión {ggplot2} package ```r ggplot(diamonds, aes(x=price), fill = "royalblue")+ geom_histogram(bins = 100) ``` > El paramétro `bins` permite seleccionar el número de observaciones agrupadas por cada barra. ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-hp-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/gghistogram.html) histogram <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_histogram.html) histogram] --- ## Density plot Calcula y gráfica la estimación de la densidad de los datos, es una versión suavizada del histograma. El area bajo la curva suma 1. <br> .left-code[ Versión {ggpubr} package ```r ggdensity(diamonds, x = "price") ``` Versión {ggplot2} package ```r ggplot(data = diamonds, aes(price)) + geom_density() + theme_classic() ``` ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-dp-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/ggdensity.html) density plot <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_density.html) density plot] --- ## Density plot Calcula y gráfica la estimación de la densidad de los datos, es una versión suavizada del histograma. El area bajo la curva suma 1. <br> .left-code[ Versión {ggpubr} package ```r ggdensity(diamonds, x = "price", fill = "color") ``` Versión {ggplot2} package ```r ggplot(data = diamonds, aes(price, fill = color)) + geom_density() + theme_classic() ``` > Podemos separar los grupos al incorporar una tercera variable ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-dp2-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/ggdensity.html) density plot <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_density.html) density plot] --- ## Heatmaps Heatmaps plot muestran un mapa de calor donde se observa la distribución de los datos (muy útiles para evitar overplot). .left-code[ Versión {ggplot2} package ```r ggplot(diamonds %>% slice_sample(n=100), aes(x = price, y = carat)) + geom_density_2d_filled() + theme_classic() ``` > Para facilitar la visualización y a modo de ejemplo hemos realizado un submuestreo de solo 100 diamantes con <br>`slice_sample(n=100)` ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-hm-out-1.png" width="576" /> > <small> Versión {ggplot2} package</small> ] .footnote[[{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) density plot 2d] --- ## Heatmaps Heatmaps plot muestran un mapa de calor donde se observa la distribución de los datos (muy útiles para evitar overplot). .left-code[ Versión {ggplot2} package ```r ggplot(diamonds %>% slice_sample(n=100), aes(x = price, y = carat)) + geom_density_2d_filled(contour_var = "count") + theme_classic() ``` > También podemos cambiar la escala desde probabilidad a cuentas con <br> `contour_var = "count"`. ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-hm2-out-1.png" width="576" /> > <small> Versión {ggplot2} package</small> ] .footnote[[{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) density plot 2d] --- ## Medidas de Tendencia central .left-code-wide[ Versión {ggplot2} package ```r ggplot(data = diamonds, aes(price)) + geom_density(fill = "#00CC99") + geom_vline(aes(xintercept=mean(price)), color="black") + geom_vline(aes(xintercept=median(price)), color="red") + geom_vline(aes(xintercept=diamonds %>% add_count(price,sort=TRUE) %>% slice_head(n=1) %>% select(price) %>% as.numeric()), color="blue") + theme_classic() ``` > Podemos adicionar los valores de tendencia central Promedio (negro), Media (rojo), Moda (azul) ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-mt-out-1.png" width="432" /> > <small> Versión {ggplot2} package</small> ] .footnote[[{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_abline.html) reference line] --- ## Q-Q plot Q-Q plot (*quantile-quantile* plot) dibuja la correlación entre la muestra de interés y una distribución normal. .left-code[ Versión {ggpubr} package ```r ggqqplot(diamonds, x="price") ``` Versión {ggplot2} package ```r ggplot(diamonds, aes(sample=price))+ stat_qq() + stat_qq_line() ``` ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-qq-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/ggqqplot.html) qq plot <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_qq.html) qq plot] --- ## ECDF plot ECDF plot (*Empirical Cumulative Density Function* plot) permite observar la distribución empírica acumulativa de los datos. .left-code[ Versión {ggpubr} package ```r ggecdf(diamonds, x="price") ``` Versión {ggplot2} package ```r ggplot(diamonds, aes(x=price))+ stat_ecdf() ``` ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-ecdf-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/ggecdf.html) ecdf plot <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/stat_ecdf.html) ecdf plot] --- ## ECDF plot ECDF plot (*Empirical Cumulative Density Function* plot) permite observar la distribución empírica acumulativa de los datos. .left-code[ Versión {ggpubr} package ```r ggecdf(diamonds, x="price", color = "cut") ``` Versión {ggplot2} package ```r ggplot(diamonds, aes(x=price,color=cut))+ stat_ecdf() ``` ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-ecdf2-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/ggecdf.html) ecdf plot <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/stat_ecdf.html) ecdf plot] --- ## Boxplot El boxplot muestra de forma compacta la distribución de una variable continua (Mediana, 1ºQ-4ºQ) y "outliers".<br> .left-code[ Versión {ggpubr} package ```r ggboxplot(diamonds, x = "cut", y = "price" , fill = "cut", outlier.shape = NA) ``` Versión {ggplot2} package ```r ggplot(data = diamonds, aes(x=cut, y=price, fill=cut)) + geom_boxplot(outlier.shape = NA) + theme_classic() ``` ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-bp-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/ggboxplot.html) boxplot <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) boxplot] --- ## Violin plot Un violin plot es un diagrama de densidad que se muestra con la estructura de un boxplot.<br> .left-code[ Versión {ggpubr} package ```r ggviolin(diamonds, x = "color", y = "price" , fill = "color") ``` Versión {ggplot2} package ```r ggplot(data = diamonds, aes(x=color, y=price, fill=color)) + geom_violin(trim = FALSE) + theme_classic() ``` ] .right-plot[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-vp-out-1.png" width="576" /> > <small> Versión {ggpubr} package</small> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/ggviolin.html) violin plot <br> [{ggplot2}](https://ggplot2.tidyverse.org/reference/geom_violin.html) violin plot] --- class: inverse center middle ## Estadística descriptiva ### Análisis de normalidad --- ## Pueba de normalidad Shapiro-Wilk ### Shapiro-Wilk (SW) test .pull-left[ H0 = La variable muestra una distribución normal <br> H1 = La variable no muestra una distribución normal <br> > Para grupos pequeños N < 5000 ### Interpretación p-value > alfa: No rechazar H0 (normal) <br> p-value < alfa: Rechazar H0 (no normal) <br> > alfa hipotético 5% (0,05) ] .pull-right[ .left[ ```r dmnds<- diamonds %>% slice_sample(n = 5000) shapiro.test(dmnds$price) ``` .medium[ ``` ## ## Shapiro-Wilk normality test ## ## data: dmnds$price ## W = 0.79564, p-value < 2.2e-16 ``` ] ] .left[ ```r # 1) Crear serie entre -50 y 50, cada 5 "x" # 2) Crear distribución normal "y" x = seq(-50, 50, by=5) y = dnorm(x, mean(x), sd(x)) shapiro.test(dnorm(y, mean(y), sd(y))) ``` .medium[ ``` ## ## Shapiro-Wilk normality test ## ## data: dnorm(y, mean(y), sd(y)) ## W = 0.91786, p-value = 0.07866 ``` ] ] ] --- ## Pueba de normalidad Kolmogorov-Smirnov ### Kolmogorov-Smirnov (KS) test .pull-left[ H0 = La variable muestra una distribución normal <br> H1 = La variable no muestra una distribución normal <br> > Menos robusto que SW, pero no limita el N ### Interpretación p-value > alfa: No rechazar H0 (normal) <br> p-value < alfa: Rechazar H0 (no normal) <br> > alfa hipotético 5% (0,05) ] .pull-right[ .left[ ```r # Múltiples variables independientes ks.test(diamonds$price, "pnorm", mean=mean(diamonds$price),sd=sd(diamonds$price)) ``` .medium[ ``` ## ## One-sample Kolmogorov-Smirnov test ## ## data: diamonds$price ## D = 0.18467, p-value < 2.2e-16 ## alternative hypothesis: two-sided ``` ] ] .left[ ```r x = seq(-50, 50, by=5) y = dnorm(x, mean(x), sd(x)) ks.test(y, "pnorm", mean=mean(y), sd=sd(y)) ``` .medium[ ``` ## ## One-sample Kolmogorov-Smirnov test ## ## data: y ## D = 0.13645, p-value = 0.8291 ## alternative hypothesis: two-sided ``` ] ] ] --- ## Distribución de referencia `stat_overlay_normal_density()`de **ggpubr** permite dibujar una distribución normal sobre la distribución de la muestra de interés. ```r ggdensity(data=diamonds, x = "price", fill = "lightgreen") + stat_overlay_normal_density(color = "darkblue", linetype = "dashed") ``` .center[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-sond-out-1.png" width="360" /> ] .footnote[[{ggpubr}](http://rpkgs.datanovia.com/ggpubr/reference/stat_overlay_normal_density.html) package - function] --- ## Transfromación de datos En la situaciones donde no se cumple el supuesto de normalidad, se puede considerar transformar los datos. <br> - Asimetria a la derecha (o positivo): Generalmente Moda < Mediana < Media <br> - Asimetria a la izquierda (o negativo): Generalmente Moda > Mediana > Media <br> .pull-left[ - square-root para asimetría moderada: <br> - sqrt(x) Asimetria positiva, <br> - sqrt(max(x+1) - x) Asimetria negativa <br><br> - log para asimetría mayor: <br> - log10(x) Asimetria positiva, <br> - log10(max(x+1) - x) Asimetria negativa <br><br> - inverso para asimetría severa: <br> - 1/x Asimetria positiva, <br> - 1/(max(x+1) - x) Asimetria negativa <br> ] .pull-right[ ```r # Log transform ## log10(x) dmnds<- diamonds %>% mutate(price_log = log10(price)) ## log10(max(x+1) - x) dmnds<- diamonds %>% mutate(price_log = log10(max(price+1)-price)) ``` ] -- .bg-washed-red.b--dark-red.ba.bw2.br3.shadow-5.ph3.mt3[ La transformación no siempre será exitosa, frente a lo que se puede optar por métodos no paramétricos. .tr[ — _Advertencia_ ]] --- class: inverse center middle ## Estadística descriptiva ### Análisis de Homocedasticidad --- ## Pueba de homocedasticidad Levene test ### Levene test .pull-left[ Se usa para probar la homogeneidad de varianza (homocedasticidad) en k grupos de muestras, donde k puede ser mayor a dos. Está adaptado para datos distribuidos normalmente. <br><br> H0 = Los grupos muestra homocedasticidad <br> H1 = Los grupos (al menos 2) no muestra homocedasticidad <br> ### Interpretación p-value > alfa: No rechazar H0 (homocedasticidad) <br> p-value < alfa: Rechazar H0 (no homocedasticidad) <br> > alfa hipotético 5% (0,05) ] .pull-right[ ```r library(car) # Una variable independiente leveneTest(y = diamonds$price, group = diamonds$cut, center = "median") ``` .small[ ``` ## Levene's Test for Homogeneity of Variance (center = "median") ## Df F value Pr(>F) ## group 4 123.6 < 2.2e-16 *** ## 53935 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` ] ] --- ## Pueba de homocedasticidad Bartlett’s test ### Bartlett’s test .pull-left[ Se usa para probar la homogeneidad de varianza (homocedasticidad) en k grupos de muestras, donde k puede ser mayor a dos. Está adaptado para datos distribuidos normalmente. <br><br> H0 = Los grupos muestra homocedasticidad <br> H1 = Los grupos (al menos 2) no muestra homocedasticidad <br> ### Interpretación p-value > alfa: No rechazar H0 (homocedasticidad) <br> p-value < alfa: Rechazar H0 (no homocedasticidad) <br> > alfa hipotético 5% (0,05) ] .pull-right[ ```r # Una variable independiente bartlett.test(price ~ cut, data = diamonds) ``` .medium[ ``` ## ## Bartlett test of homogeneity of variances ## ## data: price by cut ## Bartlett's K-squared = 406.7, df = 4, p-value < 2.2e-16 ``` ] ```r # Múltiples variables independientes bartlett.test(price ~ interaction(cut,color), data=diamonds) ``` .medium[ ``` ## ## Bartlett test of homogeneity of variances ## ## data: price by interaction(cut, color) ## Bartlett's K-squared = 1965.3, df = 34, p-value < 2.2e-16 ``` ] ] --- ## Pueba de homocedasticidad Fligner-Killeen test ### Fligner-Killeen test .pull-left[ Para probar homocedasticidad en k grupos de muestras, donde k puede ser mayor a dos. Más robusto contra las desviaciones de la normalidad o cuando hay problemas relacionados con valores atípicos (outliers). <br><br> H0 = Los grupos muestra homocedasticidad <br> H1 = Los grupos (al menos 2) no muestra homocedasticidad <br> ### Interpretación p-value > alfa: No rechazar H0 (homocedasticidad) <br> p-value < alfa: Rechazar H0 (no homocedasticidad) <br> > alfa hipotético 5% (0,05) ] .pull-right[ ```r # Una variable independiente fligner.test(price ~ cut, data = diamonds) ``` .small[ ``` ## ## Fligner-Killeen test of homogeneity of variances ## ## data: price by cut ## Fligner-Killeen:med chi-squared = 1676.4, df = 4, p-value < 2.2e-16 ``` ] ```r # Múltiples variables independientes fligner.test(price ~ interaction(cut,color), data=diamonds) ``` .small[ ``` ## ## Fligner-Killeen test of homogeneity of variances ## ## data: price by interaction(cut, color) ## Fligner-Killeen:med chi-squared = 3332.1, df = 34, p-value < 2.2e-16 ``` ] ] --- class: inverse center middle ## Inferencia Estadística ### Análisis de correlación --- ## paquete-**Hmisc** y **corrplot** ```r # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages("Hmisc") install.packages("corrplot") # Instalar la versión beta desde GitHub install.packages("devtools") devtools::install_github("harrelfe/Hmisc") devtools::install_github("taiyun/corrplot", build_vignettes = TRUE) ``` ```r # Cargar desde la librería library(Hmisc) library(corrplot) ``` .footnote[[{Hmisc}](https://hbiostat.org/R/Hmisc/) package <br> [{corrplot}](https://github.com/taiyun/corrplot) package] --- ## Correlación ### ¿Qué es la correlación? <br> La correlación es una medida estadística que nos informa sobre la asociación entre dos variables. Describe cómo se comporta una variable frente a algún cambio en la variable asociada.<br> ### Interpretación Si las variables aumentan o disminuyen juntas, entonces tendrán una correlación positiva. Si las variables son opuestas (una aumenta y la otra disminuye), entonces la correlación será negativa entre ellas. Si varían de forma independiente, la correlación entre ellos será cercana a cero.<br> -- .bg-washed-red.b--dark-red.ba.bw2.br3.shadow-5.ph3.mt3[ 1. Las correlaciones son la medida de dependencia lineal entre dos variables, solo se pueden aplicar entre pares. 1. Son sensibles al número de muestras. Si el número de muestras es pequeños (<20 ~ 30) el análisis pierde poder estadístico (óptimo ≥ 100)<br> .tr[ — _Advertencia_ ]] --- ### Métodos de Correlación .left[ Pearson: Evalúa la relación lineal entre dos variables continuas.<br> ```r cor(diamonds$price, diamonds$carat, use ="pairwise.complete.obs", method = "pearson") ``` ``` ## [1] 0.9215913 ``` ] -- .left[ Spearman: Evalúa la relación monótona. El coeficiente de correlación de Spearman se basa en los valores clasificados por ranking para cada variable en lugar de los datos brutos. <br> ```r dmnds <- diamonds %>% mutate(color=as.numeric(dplyr::recode(color, "D"="1", "E"="2", "F"="3", "G"="4", "H"="5", "I"="6", "J"="7"))) cor(dmnds$price, dmnds$color, use ="pairwise.complete.obs", method = "spearman") ``` ``` ## [1] 0.1501422 ``` ] -- .left[ Kendall: Evalúa la correlación de rangos: la semejanza en el ordenamiento de los datos cuando se agrupan en rangos. <br> ```r dmnds <- dmnds %>% mutate(cut=as.numeric(dplyr::recode(cut,"Ideal"="1", "Premium"="2", "Very Good"="3", "Good"="4", "Fair"="5"))) cor(dmnds$color, dmnds$cut, use ="pairwise.complete.obs", method = "kendall") ``` ``` ## [1] -0.01399794 ``` ] --- ### ¿Cómo gráfico múltiples correlaciones? .pull-left[ ```r # Seleccionar variables numéricas dmnds <- diamonds %>% select_if(is.numeric) %>% as.matrix() cor<-rcorr(dmnds,type="spearman") #"pearson" # Ajustar valor de p (múltiples comparaciones) cor$P.adj<-p.adjust(cor$P, method = "fdr") dim(cor$P.adj) <- dim(cor$P) # Gráfico corrplot(cor$r, method="circle", type="upper", col=brewer.pal(n=8, name="PuOr"), tl.col="black", tl.srt=90, p.mat = cor$P.adj, sig.level = 0.05, insig = "blank", pch.cex=0.9, pch.col = "white", diag=TRUE, title = NULL, mar = c(.1, .1, .1, .1)) ``` .footnote[[{corrplot}](https://github.com/taiyun/corrplot) package] ] .pull-right[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-corrplot-out-1.png" width="504" /> ] --- class: inverse center middle ## Inferencia Estadística ### Reducción de dimensión --- ## paquete-**ggbiplot** y **broom** ```r # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages("ggbiplot") install.packages("broom") install.packages("ggrepel") # Instalar la versión beta desde GitHub install.packages("devtools") devtools::install_github("vqv/ggbiplot") devtools::install_github("tidymodels/broom") devtools::install_github("slowkow/ggrepel") ``` ```r # Cargar desde la librería library(ggbiplot) library(broom) library(ggrepel) ``` .footnote[[{ggbiplot}](https://github.com/vqv/ggbiplot) package <br> [{broom}](https://broom.tidymodels.org) package <br> [{ggrepel}](https://ggrepel.slowkow.com/index.html) package] --- ## Análisis de componentes principales (*PCA*) El análisis de componentes principales o PCA por su nombre en inglés (**P**rincipal **C**omponent **A**nalysis) es una técnica útil durante el análisis exploratorio de datos. Permite visualizar de mejor manera la variación presente en un conjunto de datos con n > 2 variables. Es particularmente útil en el caso de conjuntos de datos "grandes", donde se tiene muchas variables para cada una de las muestras. <br> Los componentes principales son la extracción de características de la estructura subyacente en los datos. Con las variables "antiguas" creamos "nuevas" variables independientes, donde cada "nueva" variable independiente (PC1, ...) es una combinación de cada una de las "antiguas" variables independientes. Luego ordenamos estas nuevas variables según qué tan bien predicen nuestra variable dependiente. <br> -- ### Interpretación En el análisis se busca encontrar la línea recta que mejor distribuye los datos cuando se proyectan en ella. Este es conocido como el primer componente principal o PC1, y se entiende como el eje que muestra la mayor varianza en los datos. Además, tenemos "eigenvectors" que representan direcciones y "eigenvalues" que representan magnitud o importancia de las "antiguas" variables independientes. Eigenvalues más grandes se correlacionan con variables más importantes. <br> .footnote[[PCA in a nutshell](https://towardsdatascience.com/a-one-stop-shop-for-principal-component-analysis-5582fb7e0a9c)] --- ## Estandarización de datos *z-score* La estandarización, también conocida como z-score, consiste en restar la media y dividir por la desviación estándar. Al hacerlo, cada valor refleja la distancia desde la media en unidades de desviación estándar. ```r # z-score por variable diamonds %>% mutate(price_zscore = (price - mean(price))/sd(price)) # z-score por set de datos dmnds_scaled <- diamonds %>% select_if(is.numeric) %>% scale() # Función para escalar datos presente en R base ``` -- .bg-washed-red.b--dark-red.ba.bw2.br3.shadow-5.ph3.mt3[ La estandarización es necesaria en algoritmos que asumen datos centrados en cero como el análisis de componentes principales (PCA). .tr[ — _Advertencia_ ]] --- ## Análisis de componentes principales (*PCA*) ```r dmnds.scaled.pca <- diamonds %>% select_if(is.numeric) %>% scale() %>% prcomp() summary(dmnds.scaled.pca) ``` ``` ## Importance of components: ## PC1 PC2 PC3 PC4 PC5 PC6 PC7 ## Standard deviation 2.1826 1.1340 0.83115 0.41684 0.20077 0.18151 0.11135 ## Proportion of Variance 0.6806 0.1837 0.09869 0.02482 0.00576 0.00471 0.00177 ## Cumulative Proportion 0.6806 0.8642 0.96294 0.98776 0.99352 0.99823 1.00000 ``` -- .left-code-wide[ ```r dmnds.scaled.pca %>% broom::tidy(matrix = "eigenvalues") %>% ggplot(aes(PC, percent)) + geom_col(fill = "#208C8C", alpha = 1) + scale_x_continuous(breaks = 1:7) + scale_y_continuous(labels = scales::percent_format(accuracy =1), expand = expansion(mult = c(0, 0.01))) + coord_cartesian(xlim = c(0, 7), ylim = c(0, 0.7)) + labs(x="Principal Component", y="Percentage of Contribution") + theme_classic() ``` ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-pca-out-1.png" width="360" /> ] --- ## Análisis de componentes principales (*PCA*) ### Gráfico basico .left-code-wide[ ```r ggbiplot(dmnds.scaled.pca, obs.scale = 1, var.scale = 1) ``` > El biplot es una forma típica de representar un PCA. En resumén permite la representación conjunta de las muestras y los eigenvectors/eigenvalues. Sin embargo, si se trabaja con muchas muestras y/o variables, la visualización puede tornarse compleja. ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-pca2-out-1.png" width="396" /> ] --- ## Análisis de componentes principales (*PCA*) ### Gráfico **ggplot2** .left-code-wide[ ```r dmnds.scaled.pca %>% broom::augment(diamonds) %>% # Addicionar el set de datos original ggplot(aes(.fittedPC1, .fittedPC2, fill = color)) + geom_point(size = 1, colour="white", pch=21, alpha=1) + guides(fill = guide_legend(title.position = "top", title.hjust = .5)) + labs(fill="Color", x="PC1 (68.06% variance explained)", y="PC2 (18.37% variance explained)") + theme_classic() ``` ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-pca3-out-1.png" width="396" /> ] --- ## Análisis de componentes principales (*PCA*) ### Gráfico **ggplot2** .left-code-wide[ ```r dmnds.scaled.pca %>% broom::augment(diamonds) %>% # Addicionar el set de datos original ggplot(aes(.fittedPC1, .fittedPC2, fill = color)) + geom_point(size = 1, colour="white", pch=21, alpha=1) + guides(fill = guide_legend(title.position = "top", title.hjust = .5)) + coord_cartesian(xlim = c(-10,10), ylim = c(-10,10)) + labs(fill="Color", x="PC1 (68.06% variance explained)", y="PC2 (18.37% variance explained)") + theme_classic() ``` > Es muy importante centrar el gráfico (0,0) para poder correctamente interpretar la distribución. ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-pca4-out-1.png" width="396" /> ] --- ## Análisis de componentes principales (*PCA*) ### Gráfico **ggplot2** Eigenvectors/Eigenvalues .left-code-wide[ ```r dmnds.scaled.pca %>% broom::tidy(matrix = "rotation") %>% # extract rotation matrix pivot_wider(names_from = "PC", names_prefix = "PC", values_from = "value") %>% # Crea una tabla larga fusionando columnas ggplot(aes(PC1, PC2)) + geom_segment(xend = 0, yend = 0, arrow = arrow(angle = 20, ends = "first", type = "closed", length = grid::unit(8,"pt"))) + geom_text_repel(aes(PC1, PC2, label = column), hjust =0.5, nudge_x = 0.05, nudge_y = 0.02, color = "#208C8C") + coord_cartesian(xlim = c(-0.5, 0.5), ylim = c(-0.8, 0.8)) + theme_classic() ``` ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-pca5-out-1.png" width="396" /> ] --- ## Análisis de componentes principales (*PCA*) ### Eigenvectors/Eigenvalues ```r dmnds.s.pca.eing <- dmnds.scaled.pca %>% broom::tidy(matrix = "rotation") %>% # extract rotation matrix pivot_wider(names_from = "PC",names_prefix = "PC", values_from = "value") ``` <table> <thead> <tr> <th style="text-align:left;"> column </th> <th style="text-align:right;"> PC1 </th> <th style="text-align:right;"> PC2 </th> <th style="text-align:right;"> PC3 </th> <th style="text-align:right;"> PC4 </th> <th style="text-align:right;"> PC5 </th> <th style="text-align:right;"> PC6 </th> <th style="text-align:right;"> PC7 </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> carat </td> <td style="text-align:right;"> 0.4524455 </td> <td style="text-align:right;"> -0.0346960 </td> <td style="text-align:right;"> 0.0054948 </td> <td style="text-align:right;"> -0.0683594 </td> <td style="text-align:right;"> 0.1339995 </td> <td style="text-align:right;"> 0.7681511 </td> <td style="text-align:right;"> 0.4258803 </td> </tr> <tr> <td style="text-align:left;"> depth </td> <td style="text-align:right;"> -0.0009161 </td> <td style="text-align:right;"> -0.7306797 </td> <td style="text-align:right;"> -0.6728293 </td> <td style="text-align:right;"> -0.0472480 </td> <td style="text-align:right;"> -0.0887383 </td> <td style="text-align:right;"> 0.0144503 </td> <td style="text-align:right;"> -0.0556003 </td> </tr> <tr> <td style="text-align:left;"> table </td> <td style="text-align:right;"> 0.0995161 </td> <td style="text-align:right;"> 0.6750674 </td> <td style="text-align:right;"> -0.7280695 </td> <td style="text-align:right;"> -0.0595406 </td> <td style="text-align:right;"> -0.0103761 </td> <td style="text-align:right;"> -0.0252683 </td> <td style="text-align:right;"> -0.0020493 </td> </tr> <tr> <td style="text-align:left;"> price </td> <td style="text-align:right;"> 0.4255193 </td> <td style="text-align:right;"> -0.0352579 </td> <td style="text-align:right;"> 0.1054495 </td> <td style="text-align:right;"> -0.8497782 </td> <td style="text-align:right;"> -0.0537721 </td> <td style="text-align:right;"> -0.2733095 </td> <td style="text-align:right;"> -0.0828143 </td> </tr> <tr> <td style="text-align:left;"> x </td> <td style="text-align:right;"> 0.4532125 </td> <td style="text-align:right;"> 0.0035126 </td> <td style="text-align:right;"> 0.0395088 </td> <td style="text-align:right;"> 0.2429951 </td> <td style="text-align:right;"> 0.0889802 </td> <td style="text-align:right;"> 0.1984606 </td> <td style="text-align:right;"> -0.8286582 </td> </tr> <tr> <td style="text-align:left;"> y </td> <td style="text-align:right;"> 0.4472649 </td> <td style="text-align:right;"> 0.0021579 </td> <td style="text-align:right;"> 0.0541888 </td> <td style="text-align:right;"> 0.3284606 </td> <td style="text-align:right;"> -0.7740579 </td> <td style="text-align:right;"> -0.2152666 </td> <td style="text-align:right;"> 0.2088571 </td> </tr> <tr> <td style="text-align:left;"> z </td> <td style="text-align:right;"> 0.4459537 </td> <td style="text-align:right;"> -0.0890352 </td> <td style="text-align:right;"> -0.0396034 </td> <td style="text-align:right;"> 0.3170073 </td> <td style="text-align:right;"> 0.6033966 </td> <td style="text-align:right;"> -0.4986704 </td> <td style="text-align:right;"> 0.2799579 </td> </tr> </tbody> </table> --- ## Análisis de componentes principales (*PCA*) ### Extraer Eigenvalues por muestra ```r dmnds.s.pca.eing.sample <- predict(dmnds.scaled.pca, newdata = diamonds) %>% as.data.frame() ``` <table> <thead> <tr> <th style="text-align:right;"> PC1 </th> <th style="text-align:right;"> PC2 </th> <th style="text-align:right;"> PC3 </th> <th style="text-align:right;"> PC4 </th> <th style="text-align:right;"> PC5 </th> <th style="text-align:right;"> PC6 </th> <th style="text-align:right;"> PC7 </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 7.354534 </td> <td style="text-align:right;"> -15.057067 </td> <td style="text-align:right;"> -46.60134 </td> <td style="text-align:right;"> -0.5046097 </td> <td style="text-align:right;"> -4.310466 </td> <td style="text-align:right;"> -1.419672 </td> <td style="text-align:right;"> -3.463489 </td> </tr> <tr> <td style="text-align:right;"> 7.448852 </td> <td style="text-align:right;"> -12.361190 </td> <td style="text-align:right;"> -47.76018 </td> <td style="text-align:right;"> -0.7127005 </td> <td style="text-align:right;"> -4.251163 </td> <td style="text-align:right;"> -1.436512 </td> <td style="text-align:right;"> -3.449867 </td> </tr> <tr> <td style="text-align:right;"> 7.802760 </td> <td style="text-align:right;"> -9.674191 </td> <td style="text-align:right;"> -47.68472 </td> <td style="text-align:right;"> -0.6259365 </td> <td style="text-align:right;"> -4.227654 </td> <td style="text-align:right;"> -1.493697 </td> <td style="text-align:right;"> -3.399172 </td> </tr> <tr> <td style="text-align:right;"> 7.870983 </td> <td style="text-align:right;"> -14.638197 </td> <td style="text-align:right;"> -47.99117 </td> <td style="text-align:right;"> -0.4086941 </td> <td style="text-align:right;"> -4.341885 </td> <td style="text-align:right;"> -1.492052 </td> <td style="text-align:right;"> -3.507047 </td> </tr> <tr> <td style="text-align:right;"> 8.068992 </td> <td style="text-align:right;"> -15.113171 </td> <td style="text-align:right;"> -48.40970 </td> <td style="text-align:right;"> -0.3227314 </td> <td style="text-align:right;"> -4.359610 </td> <td style="text-align:right;"> -1.533276 </td> <td style="text-align:right;"> -3.557899 </td> </tr> <tr> <td style="text-align:right;"> 7.473111 </td> <td style="text-align:right;"> -15.123079 </td> <td style="text-align:right;"> -47.86727 </td> <td style="text-align:right;"> -0.5898057 </td> <td style="text-align:right;"> -4.342072 </td> <td style="text-align:right;"> -1.446987 </td> <td style="text-align:right;"> -3.483434 </td> </tr> <tr> <td style="text-align:right;"> 7.478984 </td> <td style="text-align:right;"> -14.866733 </td> <td style="text-align:right;"> -47.63059 </td> <td style="text-align:right;"> -0.5698899 </td> <td style="text-align:right;"> -4.332413 </td> <td style="text-align:right;"> -1.446964 </td> <td style="text-align:right;"> -3.471726 </td> </tr> <tr> <td style="text-align:right;"> 7.546671 </td> <td style="text-align:right;"> -15.275367 </td> <td style="text-align:right;"> -46.78378 </td> <td style="text-align:right;"> -0.4161699 </td> <td style="text-align:right;"> -4.319993 </td> <td style="text-align:right;"> -1.441710 </td> <td style="text-align:right;"> -3.477489 </td> </tr> </tbody> </table> --- class: inverse center middle ## Inferencia Estadística ### Modelos lineales --- ## Modelos lineales ###¿Qué es una regresión lineal? Una regresión lineal es un modelo (ecuación) estadístico que se usa para analizar la relación entre una variable de respuesta (comunmente llamada **Y**) y una o más variables y sus interacciones (comunmente llamada **X** o variables explicativas). La regresión lineal asume una relación lineal entre la variable de respuesta y las variables explicativas. Esto significa que puede ajustar una línea entre las dos (o más variables). <br> Un modelo básico es: <br><br> **Y** = <span style="color:#009E73">*A*</span> + <span style="color:#D55E00">*B*</span> \* **X**<br> Donde <span style="color:#009E73">*A*</span> corresponde al intersecto (donde empiezas a medir cuando **X** es cero) y <span style="color:#D55E00">*B*</span> a la pendiente (el cambio de **Y** con respecto a **X**). La idea del modelamiento es generar un **modelo ajustado** de la mejor forma a nustras variables, encontrando el <span style="color:#009E73">*A*</span> y <span style="color:#D55E00">*B*</span> que mejor se adapten a nuestro set de datos. <br> --- ## Modelos lineales ###¿Cómo calcular una regresión lineal en **R**? Cómo mencionamos anteriormente, **R** es una _Lingua Franca_ para estadística y ciencia de datos. En **R** base (conjunto de funciones y paquetes que se cargan por defecto al cargar tú sesión de **R**) existe la función `lm` que te permite ajustar un modelo lineal a tús variablas de interés. <br> La estructura básica del comando es la siguiente: <br><br> lm([variable de respuesta o **Y**] ~ [variable explicativa o **X**], data = [nombre del set de datos]) <br><br> En nuestro caso intentaremos predecir el precio de los diamantes (variable de respuesta o **Y**), en base a el tamaño o carat (variable explicativa o **X**) con el siguiente código. ```r # Primero obtener regresión lineal y guardarla en objeto llamado "lm.pc" lm.pc <- lm(price ~ carat, data = diamonds) # Segundo obtener resumén del resultado summary(lm.pc) ``` --- ## Modelos lineales ###¿Cómo interpretar una regresión lineal? ```r lm.pc <- lm(price ~ carat, data = diamonds) summary(lm.pc) ``` ``` ## ## Call: ## lm(formula = price ~ carat, data = diamonds) ## ## Residuals: ## Min 1Q Median 3Q Max ## -18585.3 -804.8 -18.9 537.4 12731.7 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) -2256.36 13.06 -172.8 <2e-16 *** ## carat 7756.43 14.07 551.4 <2e-16 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 1549 on 53938 degrees of freedom ## Multiple R-squared: 0.8493, Adjusted R-squared: 0.8493 ## F-statistic: 3.041e+05 on 1 and 53938 DF, p-value: < 2.2e-16 ``` --- ## Modelos lineales ###¿Cómo gráficar una regresión lineal básica? .left-code-wide[ ```r ggplot(data=diamonds, aes(x=carat, y=price)) + geom_smooth(method = lm) + theme_classic() ``` > `geom_smooth(method = "...")` nos permite ajustar la función a el modelo que nos interesa gráficar, en base a funciones de modelamiento presentes en **R** como `lm` o en base a un modelo que nosotros generemos. ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-lm-out-1.png" width="396" /> ] .footnote[[geom_smooth()](https://ggplot2.tidyverse.org/reference/geom_smooth.html) reference] --- ## Modelos lineales ###¿Cómo gráficar una regresión lineal para publicación? .left-code-wide[ ```r ggplot(data=diamonds, aes(x=carat, y=price)) + geom_point(alpha=1/100, color="#56B4E9") + geom_smooth(method = lm) + scale_y_continuous(labels = scales::dollar) + ggpubr::stat_regline_equation(label.x = 1, label.y = 31000, aes(label = paste(..eq.label.., ..adj.rr.label.., sep = "~~~~"))) + theme_classic() ``` > La función `geom_point(alpha=1/100, color="#56B4E9")` nos permite mostrar los datos originales, sin saturar la imagen al aplicar una transparencia de 1/100 en color "#56B4E9" (Malibu Blue). <br><br> > La función `stat_regline_equation(...)` de {**ggpubr**} nos permite incorporar en el gráfico valores importantes como el adjust R^2 y la ecuación. ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-lm2-out-1.png" width="396" /> ] .footnote[[stat_regline_equation()](https://rpkgs.datanovia.com/ggpubr/reference/stat_regline_equation.html) reference] --- ## Modelos lineales ###¿Cómo gráficar una regresión lineal para publicación? .left-code-wide[ ```r ggplot(data=diamonds, aes(x=carat, y=price, color=cut)) + geom_smooth(aes(fill = cut, color = cut), method = lm) + scale_y_continuous(labels = scales::dollar) + ggpubr::stat_regline_equation(label.y=seq(22500, 30000, 1500), aes(label = paste(..eq.label.., ..adj.rr.label.., sep = "~~~~"))) + scale_color_viridis(begin =0, end = 0.6, option = "D", discrete = TRUE) + scale_fill_viridis(begin =0, end = 0.6, option = "D", discrete = TRUE) + theme_classic() ``` > Al asignar color a los grupos dentro de la variable "cut", generamos A) que los puntos se distribuyan según el color de su grupo "cut" y B) que la regresión se aplique a cada grupo de forma independiente. Sin embargo, deben prestar atención a de el factor "cut" se asigna de forma general en `ggplot(...)` y además en `geom_smooth()` ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-lm3-out-1.png" width="468" /> ] .footnote[[stat_regline_equation()](https://rpkgs.datanovia.com/ggpubr/reference/stat_regline_equation.html) reference] --- class: inverse center middle ## Inferencia Estadística ### Análisis de varianza --- ## Análisis de varianza Son una colección de análisis que permiten examinar si las medias de los grupos (poblaciones, muestras) difieren entre sí. Existen métodos que difieren en el número de grupos que pueden comparar. Además existen métodos parametricos (requieren que se cumplan los supuestos) y no parámetricos (no requieren que se cumplan todos los supuestos) que son más o menos robustos frente al incumplimiento de algunos de los tres supuestos en los datos.<br> ### Supuestos 1. Independencia (los elementos de un grupo no están relacionados con los del otro grupo) <br> 1. Normalidad (los elementos de una muestra tienen distribución normal) <br> 1. Homocedasticidad (las variaciones de los grupos son iguales) <br><br> -- .bg-washed-red.b--dark-red.ba.bw2.br3.shadow-5.ph3.mt3[ La independencia de las muestras corresponde en gran medida al correcto diseño experimental, y es uno de los parámetros que debe ser cumplido para la mayor parte de los métodos no parámetricos. .tr[ — _Advertencia_ ]] --- ## paquete-**rcompanion** y **FSA** <br><br><br> ```r # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages("rcompanion") install.packages("FSA") ``` ```r # Cargar desde la librería library(rcompanion) library(FSA) ``` .footnote[[{rcompanion}](https://rdrr.io/cran/rcompanion/man/) package <br> [{rcompanion}](https://rcompanion.org/handbook/) handbook <br> [FSA](https://github.com/droglenc/FSA) package] --- ## T-test T-test se utiliza para comprobar la igualdad de las medias entre dos grupos.<br> > T-test requiere que los dos grupos cumplan los 3 supuestos. .left-code-wide[ ```r dmnds <- diamonds %>% filter(cut %in% c("Fair","Ideal")) t.test(price ~ cut, dmnds) ``` ``` ## ## Welch Two Sample t-test ## ## data: price by cut ## t = 9.7484, df = 1894.8, p-value < 2.2e-16 ## alternative hypothesis: true difference in means is not equal to 0 ## 95 percent confidence interval: ## 719.9065 1082.5251 ## sample estimates: ## mean in group Fair mean in group Ideal ## 4358.758 3457.542 ``` ] -- .right-plot-narrow[ ### Interpretación p-value > alfa: No rechazar H0 (igualdad) <br> p-value < alfa: Rechazar H0 (no igualdad) <br> > alfa hipotético 5% (0,05) ] --- ## T-test ### Gráfico .left-code-wide[ T-test se utiliza para comprobar la igualdad de las medias entre dos grupos.<br> > ¿Tienen "Fair" y "Ideal" la misma media en precio? ```r ggplot(data = dmnds, aes(x=cut, y=price, fill=cut)) + geom_boxplot(outlier.shape = NA) + stat_compare_means(method = "t.test") + theme_classic() ``` ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-ttest-out-1.png" width="432" /> ] --- ## F-test F-test se utiliza para comprobar la igualdad de las varianzas entre dos grupos.<br> > F-test requiere que los dos grupos cumplan los 3 supuestos. <br> > ¿Tienen "Fair" y "Ideal" la misma varianza en precio? .left-code-wide[ <br> ```r var.test(price ~ cut, dmnds) ``` ``` ## ## F test to compare two variances ## ## data: price by cut ## F = 0.87399, num df = 1609, denom df = 21550, p-value = 0.0003133 ## alternative hypothesis: true ratio of variances is not equal to 1 ## 95 percent confidence interval: ## 0.8144715 0.9399720 ## sample estimates: ## ratio of variances ## 0.873995 ``` ] -- .right-plot-narrow[ ### Interpretación p-value > alfa: No rechazar H0 (igualdad) <br> p-value < alfa: Rechazar H0 (no igualdad) <br> > alfa hipotético 5% (0,05) ] --- ## chi-square test chi-square test evalúa si existe una asociación significativa entre las categorías de dos grupos.<br> > ¿Son las mediciones de los pacientes "A" y "B" independientes? .left-code-wide[ ```r # Crearemos grupos a comparar df <- tibble(PacienteA = c(89,37,30), PacienteB = c(20,15,50)) chisq.test(df) # Evaluar p-value ``` ``` ## ## Pearson's Chi-squared test ## ## data: df ## X-squared = 40.593, df = 2, p-value = 1.533e-09 ``` ] -- .right-plot-narrow[ ### Interpretación p-value > alfa: No rechazar H0 <br>(Independientes) <br><br> p-value < alfa: Rechazar H0 <br>(Dependientes) <br> > alfa hipotético 5% (0,05) ] --- ## ANOVA test (One-way) ANOVA es una técnica estadística que se utiliza para comparar las medias de más de dos grupos. > ANOVA requiere que los grupos cumplan los 3 supuestos. ```r dmnds.aov <- aov(price ~ cut, data = diamonds) summary(dmnds.aov) ``` ``` ## Df Sum Sq Mean Sq F value Pr(>F) ## cut 4 1.104e+10 2.760e+09 175.7 <2e-16 *** ## Residuals 53935 8.474e+11 1.571e+07 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` -- .left[ #### Post-Hoc test ```r # Tukey's HSD (honestly significant difference) test TukeyHSD(dmnds.aov) ``` ] --- ## ANOVA test (One-way) ### Gráfico .left-code-wide[ ```r ggplot(data = diamonds, aes(x=cut, y=price, fill=cut)) + geom_boxplot(outlier.shape = NA) + stat_compare_means(method = "anova") + stat_compare_means(aes(label = ..p.signif..), method = "t.test", ref.group = ".all.", label.y = 18000) + theme_classic() ``` > La segunda comparación incluye el Post-Hoc test "t.test" para comparar entre grupos. ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-ANOVA-out-1.png" width="432" /> ] .footnote[[ggpubr](http://rpkgs.datanovia.com/ggpubr/reference/stat_compare_means.html) `stat_compare_means()` function] --- ## ANOVA test (Two-way) ```r dmnds.aov2 <- aov(price ~ cut*color, data = diamonds) summary(dmnds.aov2) ``` ``` ## Df Sum Sq Mean Sq F value Pr(>F) ## cut 4 1.104e+10 2.760e+09 181.405 <2e-16 *** ## color 6 2.551e+10 4.251e+09 279.371 <2e-16 *** ## cut:color 24 1.653e+09 6.889e+07 4.527 1e-12 *** ## Residuals 53905 8.203e+11 1.522e+07 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` -- .left[ #### Post-Hoc test ```r # Tukey's HSD (honestly significant difference) test TukeyHSD(dmnds.aov2) ``` ] --- ## Kruskal-Wallis test ```r kruskal.test(price ~ cut, data = diamonds) ``` ``` ## ## Kruskal-Wallis rank sum test ## ## data: price by cut ## Kruskal-Wallis chi-squared = 978.62, df = 4, p-value < 2.2e-16 ``` -- .left[ #### Post-Hoc test ```r # Mann–Whitney–Wilcoxon o Wilcoxon rank-sum test pairwise.wilcox.test(diamonds$price, diamonds$cut, p.adjust.method="fdr") ``` .medium[ ``` ## ## Pairwise comparisons using Wilcoxon rank sum test ## ## data: diamonds$price and diamonds$cut ## ## Fair Good Very Good Premium ## Good 7.9e-14 - - - ## Very Good < 2e-16 0.023 - - ## Premium 1.5e-05 1.6e-12 < 2e-16 - ## Ideal < 2e-16 < 2e-16 < 2e-16 < 2e-16 ## ## P value adjustment method: fdr ``` ] ] --- ## Kruskal-Wallis test ### Gráfico .left-code-wide[ ```r ggplot(data = diamonds, aes(x=cut, y=price, fill=cut)) + geom_boxplot(outlier.shape = NA) + stat_compare_means() + stat_compare_means(aes(label = ..p.signif..), method = "wilcox.test", ref.group = ".all.", label.y = 18000) + theme_classic() ``` > La segunda comparación incluye el Post-Hoc test "wilcox.test". ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-KW-out-1.png" width="468" /> ] .footnote[[ggpubr](http://rpkgs.datanovia.com/ggpubr/reference/stat_compare_means.html) `stat_compare_means()` function] --- ## Kruskal-Wallis test ### Gráfico .left-code-wide[ ```r my_comparisons <- list(c("Fair", "Ideal"), c("Fair", "Premium"), c("Fair", "Very Good")) ggplot(data = diamonds, aes(x=cut, y=price, fill=cut)) + geom_boxplot(outlier.shape = NA) + stat_compare_means() + stat_compare_means(aes(label = ..p.signif..), method = "wilcox.test", comparisons = my_comparisons, label.y = c(15000, 16000, 17000)) + theme_classic() ``` > También podemos adicionar comparaciones específicas entre los grupos. ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-KW2-out-1.png" width="468" /> ] .footnote[[ggpubr](http://rpkgs.datanovia.com/ggpubr/reference/stat_compare_means.html) `stat_compare_means()` function] --- ## Kruskal-Wallis test ### Gráfico .left-code-wide[ ```r my_comparisons <- list(c("Fair", "Ideal"), c("Fair", "Premium"), c("Fair", "Very Good")) ggplot(data = diamonds, aes(x=cut, y=price, fill=cut)) + geom_boxplot(outlier.shape = NA) + stat_compare_means() + stat_compare_means(aes(label = ..p.value..), method = "wilcox.test", comparisons = my_comparisons, label.y = c(15000, 16000, 17000)) + theme_classic() ``` > También podemos cambiar desde marcas a p-values cambiando por `..p.value..` ] .right-plot-narrow[ <img src="data:image/png;base64,#Sesion_002_files/figure-html/plot-KW3-out-1.png" width="468" /> ] .footnote[[ggpubr](http://rpkgs.datanovia.com/ggpubr/reference/stat_compare_means.html) `stat_compare_means()` function] --- ## Scheirer-Ray-Hare test La prueba de Scheirer-Ray-Hare es una prueba no paramétrica que se utiliza para un diseño bidireccional (two-way). .left[ ```r scheirerRayHare(price ~ cut * color, data = diamonds) ``` .medium[ ``` ## ## DV: price ## Observations: 53940 ## D: 0.9999996 ## MS total: 242464795 ``` ``` ## Df Sum Sq H p.value ## cut 4 2.3728e+11 978.62 0.0000e+00 ## color 6 2.9932e+11 1234.50 0.0000e+00 ## cut:color 24 2.1919e+10 90.40 1.2373e-09 ## Residuals 53905 1.2520e+13 ``` ] ] -- .left[ #### Post-Hoc test > Luego se analizan los grupos significativos. <br> ```r dunnTest(price ~ cut, data = diamonds, method="bh") dunnTest(price ~ color, data = diamonds, method="bh") ``` ] --- ## paquete-**report** ```r # Instalar desde CRAN (The Comprehensive R Archive Network) install.packages("report") # Instalar la versión beta desde GitHub install.packages("remotes") remotes::install_github("easystats/report") ``` ```r # Cargar desde la librería library(report) ``` .footnote[[{report}](https://easystats.github.io/report/index.html) package] --- ## paquete-**report** .bg-washed-yellow.b--gold.ba.bw2.br3.shadow-5.ph4.mt4[ “*From R to your manuscript*” El objetivo principal **report** es reducir la brecha entre la salida de datos de R y el formato de resultados contenidos en un manuscrito. **report** Genera automáticamente informes de modelos y marcos de datos de acuerdo con las pautas de las mejores prácticas (por ejemplo, el estilo de la APA), lo que garantiza la estandarización y la calidad en los informes de resultados. <br> .tr[ — _report package_ ]] -- .bg-washed-red.b--dark-red.ba.bw2.br3.shadow-5.ph3.mt3[ **report** es un paquete en desarrollo, no todos los análisis tienen aún su función de reporte. Sin embargo, es probable que en un tiempo se adicionen nuevas funciones en base a contribuidores (una de las muchas ventajas del _open-source_ & _open-science_). .tr[ — _Advertencia_ ]] .footnote[[{report}](https://easystats.github.io/report/index.html) package] --- ## Funciones útiles `report(model)` ayuda a la interpretación de los resultados obtenidos y te permite generar un reporte del modelo generado y sus resultados ya estandarizados con un estilo apropiado para su publicación (**es una guía**). Algunas funciones y resultados actualmente soportados corresponden a: Correlations, t-tests, Regression models, ANOVAs, Mixed models, Bayesian models, Bayes factors, Structural Equation Models (SEM), y Model comparison.<br> ### Ejemplo ```r lm.pc.rep <- report(lm.pc) as.report_text(lm.pc.rep, summary=TRUE) ``` We fitted a linear model to predict price with carat. The model's explanatory power is substantial (R2 = 0.85, adj. R2 = 0.85). The model's intercept is at -2256.36 (95% CI [-2281.95, -2230.77]). Within this model: <br><br> - The effect of carat is statistically significant and positive (beta = 7756.43, 95% CI [7728.86, 7784.00], t(53938) = 551.41, p < .001, Std. beta = 0.92)<br> .footnote[[{report}](https://easystats.github.io/report/reference/report.html) reference] --- class: center, middle # Muchas Gracias!! Presentación creada en R con los paquetes: [xaringan](https://github.com/yihui/xaringan)<br> [xaringanthemer](https://github.com/gadenbuie/xaringanthemer)<br> [R Markdown](https://rmarkdown.rstudio.com).<br>