Estadística en R

R básico tiene funciones para las pruebas mas comunes de estadística (correlación, regresión, chi-cuadrado) y una gran cantidad de paquetes para (casi) cualquier método estadístico alternativo:

  • modelos lineales mixtos (lme4)
  • ecología de comunidades (vegan)
  • selección de modelos (AICcmodavg, MuMIn)
  • modelos lineales y estadística multivariada (MASS)
  • estadística bayesiana (MCMCglmm)

Antes de continuar, debemos instalar los siguientes paquetes:

pqts <- c("corrplot", "MASS", "multcomp", "ggplot2", 
    "vegan", "MuMIn")

A <- lapply(pqts, function(y) {
    if (!y %in% installed.packages()[, "Package"]) 
        install.packages(y)
    require(y, character.only = T)
})

 

Estadística descriptiva

Mínimo:

min(iris$Sepal.Length)
## [1] 4.3
which.min(iris$Sepal.Length)
## [1] 14
tapply(iris$Sepal.Length, iris$Species, min)
##     setosa versicolor  virginica 
##        4.3        4.9        4.9

 

Máximo:

max(iris$Sepal.Length)
## [1] 7.9
which.max(iris$Sepal.Length)
## [1] 132
tapply(iris$Sepal.Length, iris$Species, max)
##     setosa versicolor  virginica 
##        5.8        7.0        7.9

 

Rango:

range(iris$Sepal.Length)
## [1] 4.3 7.9
tapply(iris$Sepal.Length, iris$Species, range)
## $setosa
## [1] 4.3 5.8
## 
## $versicolor
## [1] 4.9 7.0
## 
## $virginica
## [1] 4.9 7.9

 

Varianza, desviación estándar y error estándar:

# varianza
var(iris$Sepal.Length)
## [1] 0.6856935
# desviacion estandar
sd(iris$Sepal.Length)
## [1] 0.8280661
# Error estándar
sd(iris$Sepal.Length)/sqrt(length(iris$Sepal.Length))
## [1] 0.06761132

 

Los cuantiles son puntos tomados a intervalos regulares de la función de distribución de una variable aleatoria:

quantile(iris$Sepal.Length)
##   0%  25%  50%  75% 100% 
##  4.3  5.1  5.8  6.4  7.9
quantile(iris$Sepal.Length, probs = c(0.025, 0.975))
##   2.5%  97.5% 
## 4.4725 7.7000
summary(iris$Sepal.Length)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.300   5.100   5.800   5.843   6.400   7.900

 

Frecuencias (cuentas):

table(iris$Species)
## 
##     setosa versicolor  virginica 
##         50         50         50
tapply(iris$Species, iris$Species, FUN = length)
##     setosa versicolor  virginica 
##         50         50         50

 

Revisión de supuestos

Normalidad

Los histogramas son una gran herramienta para evaluar normalidad:

hist(iris$Sepal.Length[iris$Species == "setosa"])

 

También podemos explorar la distribución de una variable usando gráficos de densidad:

plot(density(iris$Sepal.Length[iris$Species == "setosa"]), 
    main = "Largo del sépalo")

 

Podemos usar ggplot2 para generar estos gráficos:

library(ggplot2)

ggplot(iris, aes(x = Sepal.Length)) + geom_histogram(color = "#B4DE2C80", 
    fill = "#3E4A8980") + theme_classic()


ggplot(iris, aes(x = Sepal.Length)) + geom_density(fill = "#3E4A8980") + 
    theme_classic()

 

Ejercicio 1


¿Cómo puedo hacer un gráfico de paneles multiples con un histograma para cada especie en ggplot2

 

Gráfico Q-Q (“Q” viene del inglés ‘quantile’): método gráfico para el diagnóstico de diferencias entre la distribución de probabilidad de una población de la que se ha extraído una muestra aleatoria y una distribución usada para la comparación:

qqnorm(iris$Sepal.Length, col = "#6DCD5980", pch = 20, 
    cex = 2)
qqline(iris$Sepal.Length, col = 2)

 

También podemos crear gráficos Q-Q usando ggplot2:

ggplot(iris, aes(sample = Sepal.Length)) + stat_qq(col = "#6DCD5980") + 
    stat_qq_line() + theme_classic()

 

La prueba de Shapiro nos permite evaluar si la distribución difiere de la esperada bajo normalidad:

shapiro.test(iris$Sepal.Length)
## 
##  Shapiro-Wilk normality test
## 
## data:  iris$Sepal.Length
## W = 0.97609, p-value = 0.01018

 

Ejercicio 2


2.1 Cree un bucle que aplique la prueba de Shapiro para el largo del pétalo para cada especie en iris


2.2 Aplique una transformación logáritmica a iris$Sepal.Length y visualice y evalue nuevamente la normalidad con las herramientas vistas en este anteriormente

 

Normalidad y transformación de variables:

hist(log(iris$Sepal.Length), breaks = 15, col = "#B4DE2C80")

 

Normalidad y transformación de variables:

qqnorm(log(iris$Sepal.Length), col = "#B4DE2C80", pch = 20, 
    cex = 2)
qqline(log(iris$Sepal.Length), col = 2)

 

Homocedasiticidad

Se dice que un modelo predictivo presenta homocedasticidad cuando la varianza del error condicional a las variables explicativas es constante a lo largo de las observaciones. La homocedasticidad es una propiedad fundamental del modelo de regresión lineal general y está dentro de sus supuestos clásicos básicos:

Se puede poner a prueba con var.test():

var.test(iris$Sepal.Length[iris$Species != "setosa"] ~ 
    iris$Species[iris$Species != "setosa"])
## 
##  F test to compare two variances
## 
## data:  iris$Sepal.Length[iris$Species != "setosa"] by iris$Species[iris$Species != "setosa"]
## F = 0.65893, num df = 49, denom df = 49, p-value = 0.1478
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.3739257 1.1611546
## sample estimates:
## ratio of variances 
##          0.6589276

 

Colinealidad

Se refiere a la correlación entre variables predictoras. Puede afectar el desempeño de algunas pruebas estadísticas.

Matrices de correlación

Permiten explorar la correlación entre pares de variables en rasgos multivariados:

mat.cor <- cor(iris[, sapply(iris, is.numeric)])

head(mat.cor)
##              Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
## Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
## Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
## Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

 

corrplot(corr = mat.cor)

corrplot(corr = mat.cor, method = "ellipse", col = "#B4DE2C80", 
    tl.col = "black")

 

corrplot(corr = mat.cor[1:4, 1:4], method = "number")

 

corrplot.mixed(corr = mat.cor[1:4, 1:4], upper = "number", 
    lower = "ellipse")

 

  • Mas ejemplos de corrplot aquí

Prueba de hipótesis

La prueba de hipótesis estadística nula (NHST por sus siglas en inglés) es un procedimiento que provee una regla de decisión sobre si hay una asociación entre dos o mas factores. Es una decisión binaria:

  • Rechazar o retener la hipótesis nula
  • Es decir, conservar la hipótesis nula o la hipótesis alternativa

El juego de NHST es comenzar con la suposición de que la hipótesis nula es cierta. Generalmente esta hipótesis implica la falta de un efecto. Ahora veremos algunas herramientas comunes para la prueba de hipótesis en R.

 

Prueba T de Student (de 2 muestras):

+ Comparar dos variables numéricas continuas
  • Supuestos
    • Observaciones (o pares) son independientes
    • Las variables siguen una distribución normal

Usando una fórmula:

data(sleep)

t.test(extra ~ group, data = sleep)
## 
##  Welch Two Sample t-test
## 
## data:  extra by group
## t = -1.8608, df = 17.776, p-value = 0.07939
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -3.3654832  0.2054832
## sample estimates:
## mean in group 1 mean in group 2 
##            0.75            2.33

 

Alternativamente:

x <- sleep$extra[sleep$group == 1]
y <- sleep$extra[sleep$group == 2]

t.test(x, y)
## 
##  Welch Two Sample t-test
## 
## data:  x and y
## t = -1.8608, df = 17.776, p-value = 0.07939
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -3.3654832  0.2054832
## sample estimates:
## mean of x mean of y 
##      0.75      2.33

 

T pareada:

t.test(extra ~ group, data = sleep, paired = T)
## 
##  Paired t-test
## 
## data:  extra by group
## t = -4.0621, df = 9, p-value = 0.002833
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -2.4598858 -0.7001142
## sample estimates:
## mean of the differences 
##                   -1.58

 

Prueba de Wilcoxon

+ Comparar dos variables numéricas continuas
+ Equivalente no paramétrico de la T de Student  
  • Supuestos
    • Observaciones (o pares) son independientes
wilcox.test(x = x, y = y)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  x and y
## W = 25.5, p-value = 0.06933
## alternative hypothesis: true location shift is not equal to 0

 

Prueba de Wilcoxon pareada

wilcox.test(x = x, y = y, paired = TRUE)
## 
##  Wilcoxon signed rank test with continuity correction
## 
## data:  x and y
## V = 0, p-value = 0.009091
## alternative hypothesis: true location shift is not equal to 0

 

Correlación de Pearson

Mide la dependencia lineal entre 2 variables

  • Supuestos
    • Normalidad
    • Relación es lineal
    • Homocedasticidad
x2 <- iris$Petal.Length
y2 <- iris$Petal.Width

cor(x = x2, y = y2)
## [1] 0.9628654
cor.test(x = x2, y = y2)
## 
##  Pearson's product-moment correlation
## 
## data:  x2 and y2
## t = 43.387, df = 148, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9490525 0.9729853
## sample estimates:
##       cor 
## 0.9628654

 

  • Correlación de Spearman (no paramétrica)
    • Alternativa no paramétrica a pearson
cor.test(x = x2, y = y2, method = "spearman")
## 
##  Spearman's rank correlation rho
## 
## data:  x2 and y2
## S = 35061, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.9376668

 

Regresión lineal

Modela la relación (lineal) entre una variable continua (respuesta) y una o mas variables predictoras

  • Supuestos
    • Homocedasticidad
    • Independencia de los errores (residuales)
    • Predictores no son colineares
reg <- lm(iris$Sepal.Length ~ iris$Sepal.Width)

summary(reg)
## 
## Call:
## lm(formula = iris$Sepal.Length ~ iris$Sepal.Width)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.5561 -0.6333 -0.1120  0.5579  2.2226 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        6.5262     0.4789   13.63   <2e-16 ***
## iris$Sepal.Width  -0.2234     0.1551   -1.44    0.152    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8251 on 148 degrees of freedom
## Multiple R-squared:  0.01382,    Adjusted R-squared:  0.007159 
## F-statistic: 2.074 on 1 and 148 DF,  p-value: 0.1519

 

coef(reg)
##      (Intercept) iris$Sepal.Width 
##        6.5262226       -0.2233611
confint(reg)
##                      2.5 %     97.5 %
## (Intercept)       5.579865 7.47258038
## iris$Sepal.Width -0.529820 0.08309785
plot(iris$Sepal.Width, iris$Sepal.Length, pch = 20, 
    col = "#B4DE2C80", cex = 2)

abline(reg)

ggplot(iris, aes(y = Sepal.Length, x = Sepal.Width)) + 
    geom_point(fill = "#B4DE2C80", size = 2, shape = 21) + 
    geom_smooth(method = "lm", col = "red2")

 

ANDEVA (ANOVA):

Compara promedios entre grupos

  • Supuestos
    • Homocedasticidad
    • Normalidad de las variables
    • Normalidad de los residuales
    • Independencia de las observaciones
reg3 <- lm(iris$Sepal.Length ~ iris$Species)

anova(reg3)
## Analysis of Variance Table
## 
## Response: iris$Sepal.Length
##               Df Sum Sq Mean Sq F value    Pr(>F)    
## iris$Species   2 63.212  31.606  119.26 < 2.2e-16 ***
## Residuals    147 38.956   0.265                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

 

Pruebas a-posteriori

reg3 <- lm(iris$Sepal.Length ~ iris$Species)

anova(reg3)
## Analysis of Variance Table
## 
## Response: iris$Sepal.Length
##               Df Sum Sq Mean Sq F value    Pr(>F)    
## iris$Species   2 63.212  31.606  119.26 < 2.2e-16 ***
## Residuals    147 38.956   0.265                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
pairwise.t.test(iris$Sepal.Length, iris$Species, p.adj = "bonferroni")
## 
##  Pairwise comparisons using t tests with pooled SD 
## 
## data:  iris$Sepal.Length and iris$Species 
## 
##            setosa  versicolor
## versicolor 2.6e-15 -         
## virginica  < 2e-16 8.3e-09   
## 
## P value adjustment method: bonferroni

 

Pruebas a-posteriori con anovas de aov():

reg4 <- aov(Sepal.Length ~ Species, data = iris)

TukeyHSD(reg4)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Sepal.Length ~ Species, data = iris)
## 
## $Species
##                       diff       lwr       upr p adj
## versicolor-setosa    0.930 0.6862273 1.1737727     0
## virginica-setosa     1.582 1.3382273 1.8257727     0
## virginica-versicolor 0.652 0.4082273 0.8957727     0
iris$Species2 <- as.factor(iris$Species)

reg4 <- aov(Sepal.Length ~ Species2, data = iris)

TukeyHSD(reg4)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Sepal.Length ~ Species2, data = iris)
## 
## $Species2
##                       diff       lwr       upr p adj
## versicolor-setosa    0.930 0.6862273 1.1737727     0
## virginica-setosa     1.582 1.3382273 1.8257727     0
## virginica-versicolor 0.652 0.4082273 0.8957727     0

 

Pruebas a-posteriori (paquete ‘multcomp’):

reg4T <- glht(reg4, linfct = mcp(Species2 = "Tukey"))

confint(reg4T)
## 
##   Simultaneous Confidence Intervals
## 
## Multiple Comparisons of Means: Tukey Contrasts
## 
## 
## Fit: aov(formula = Sepal.Length ~ Species2, data = iris)
## 
## Quantile = 2.3677
## 95% family-wise confidence level
##  
## 
## Linear Hypotheses:
##                             Estimate lwr    upr   
## versicolor - setosa == 0    0.9300   0.6862 1.1738
## virginica - setosa == 0     1.5820   1.3382 1.8258
## virginica - versicolor == 0 0.6520   0.4082 0.8958
plot(reg4T)

dif.letras <- cld(reg4T)

dif.letras
##     setosa versicolor  virginica 
##        "a"        "b"        "c"
ggplot(iris, aes(x = Species2, y = Sepal.Length)) + 
    geom_boxplot(fill = "#B4DE2C80") + annotate(geom = "text", 
    x = 1:3, y = max(iris$Sepal.Length) + 1, label = dif.letras$mcletters$Letters)

 

Pruebas a-posteriori

##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = iris$Sepal.Length ~ iris$Species)
## 
## $`iris$Species`
##                       diff       lwr       upr p adj
## versicolor-setosa    0.930 0.6862273 1.1737727     0
## virginica-setosa     1.582 1.3382273 1.8257727     0
## virginica-versicolor 0.652 0.4082273 0.8957727     0

 

Kruskal-Wallis (ANDEVA no paramétrico):

Compara promedios entre grupos

  • Supuestos:
    • Independencia de las observaciones
kw <- kruskal.test(iris$Sepal.Length ~ iris$Species)

kw
## 
##  Kruskal-Wallis rank sum test
## 
## data:  iris$Sepal.Length by iris$Species
## Kruskal-Wallis chi-squared = 96.937, df = 2, p-value < 2.2e-16

 

Chi-cuadrado (tabla de contingencia):

+ Evalúa si el número de muestras para la combinación de niveles en 2 variables categóricas sigue una distribución determinada 
  • Supuestos:
    • Independencia de las observaciones
    • N para cada celda debe ser >= 5
iris$Sepal.Length.cat <- ifelse(iris$Sepal.Length > 
    6, 1, 0)
set.seed(10)
iris$Sepal.Length.cat[sample(1:nrow(iris), 100)] <- sample(c(0, 
    1), size = 50, replace = TRUE)

species.sl <- table(iris$Sepal.Length.cat, iris$Species)

species.sl
##    
##     setosa versicolor virginica
##   0     36         26        18
##   1     14         24        32
species.sl <- species.sl[, -2]

chisq.test(species.sl)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  species.sl
## X-squared = 11.634, df = 1, p-value = 0.0006474

 

Chi-cuadrado con simulación del valor de P con Monte Carlo

chisq.test(species.sl, simulate.p.value = TRUE, B = 1000)
## 
##  Pearson's Chi-squared test with simulated p-value (based on 1000
##  replicates)
## 
## data:  species.sl
## X-squared = 13.043, df = NA, p-value = 0.003996

 

Ejercicio 1

1.1 Que prueba alternativa existe para tablas de contingencia y como se corre en R?

 

 

Prueba de Mantel:

  • Estima la correlación entre matrices de distancia (similitud)

  • Utiliza aleatorización para calcular valores de P

  • Supuestos

    • Matrices creadas con métodos de distancia equivalentes
data(varespec)

data(varechem)

veg.dist <- vegdist(varespec)  # Bray-Curtis
env.dist <- vegdist(scale(varechem), "euclid")

mantel(veg.dist, env.dist)
## 
## Mantel statistic based on Pearson's product-moment correlation 
## 
## Call:
## mantel(xdis = veg.dist, ydis = env.dist) 
## 
## Mantel statistic r: 0.3047 
##       Significance: 0.001 
## 
## Upper quantiles of permutations (null model):
##   90%   95% 97.5%   99% 
## 0.124 0.150 0.185 0.220 
## Permutation: free
## Number of permutations: 999

 

Métodos de aleatorización (Monte Carlo)

  • Calculan un estadístico luego de aleatorizar los datos
  • Repiten el procedimiento muchas veces hasta generar una distribución nula
  • Comparan el valor observado con la distribución nula para calcular el valor de P
  • No necesariamente se generan todas las combinaciones posibles en la aleatorización

Prueba T simple:

t.test(extra ~ group, data = sleep)
## 
##  Welch Two Sample t-test
## 
## data:  extra by group
## t = -1.8608, df = 17.776, p-value = 0.07939
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -3.3654832  0.2054832
## sample estimates:
## mean in group 1 mean in group 2 
##            0.75            2.33

T pareada por aleatorización:

obs <- t.test(extra ~ group, data = sleep, paired = T)

obs$statistic
##         t 
## -4.062128
reps <- 10000
t.ale <- NULL
sleep1 <- sleep

for (i in 1:reps) {

    sleep1$group <- sample(sleep1$group)

    obs <- t.test(extra ~ group, data = sleep1, paired = T)

    t.ale <- append(t.ale, obs$statistic)
}

# valor de p
sum(t.ale >= obs$statistic)/reps
## [1] 0.8732
hist(t.ale, col = "#B4DE2C80", main = NULL, breaks = 20, 
    xlim = c(range(c(obs$statistic, t.ale))))
abline(v = obs$statistic, col = "red", lty = 3, lwd = 4)

 

Ejercicio 2


  1. 1 Calcule un valor de P para la prueba de chi-cuadrado utilizando aleatorización


3.1 Calcule un valor de P para la prueba de correlación con una rutina de aleatorización


Información de la sesión

## R version 4.0.5 (2021-03-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
## LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3
## 
## locale:
##  [1] LC_CTYPE=pt_BR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=es_CR.UTF-8        LC_COLLATE=pt_BR.UTF-8    
##  [5] LC_MONETARY=es_CR.UTF-8    LC_MESSAGES=pt_BR.UTF-8   
##  [7] LC_PAPER=es_CR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_CR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] MuMIn_1.43.17   vegan_2.5-7     lattice_0.20-41 permute_0.9-5  
##  [5] multcomp_1.4-17 TH.data_1.0-10  survival_3.2-10 mvtnorm_1.1-1  
##  [9] MASS_7.3-53.1   corrplot_0.88   ggplot2_3.3.3   knitr_1.33     
## 
## loaded via a namespace (and not attached):
##  [1] zoo_1.8-9         tidyselect_1.1.1  xfun_0.22         bslib_0.2.4      
##  [5] purrr_0.3.4       splines_4.0.5     colorspace_2.0-0  vctrs_0.3.8      
##  [9] generics_0.1.0    htmltools_0.5.1.1 stats4_4.0.5      yaml_2.2.1       
## [13] mgcv_1.8-35       utf8_1.2.1        rlang_0.4.11      jquerylib_0.1.4  
## [17] pillar_1.6.0      glue_1.4.2        withr_2.4.2       lifecycle_1.0.0  
## [21] stringr_1.4.0     munsell_0.5.0     gtable_0.3.0      codetools_0.2-18 
## [25] evaluate_0.14     labeling_0.4.2    parallel_4.0.5    fansi_0.4.2      
## [29] highr_0.9         scales_1.1.1      formatR_1.9       jsonlite_1.7.2   
## [33] farver_2.1.0      digest_0.6.27     stringi_1.5.3     dplyr_1.0.5      
## [37] grid_4.0.5        tools_4.0.5       sandwich_3.0-0    magrittr_2.0.1   
## [41] sass_0.3.1        tibble_3.1.1      cluster_2.1.1     crayon_1.4.1     
## [45] pkgconfig_2.0.3   ellipsis_0.3.2    Matrix_1.3-2      rmarkdown_2.7    
## [49] R6_2.5.0          nlme_3.1-152      compiler_4.0.5