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:
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)
})
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
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)
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
Se refiere a la correlación entre variables predictoras. Puede afectar el desempeño de algunas pruebas estadísticas.
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")
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:
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.
+ Comparar dos variables numéricas continuas
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
+ Comparar dos variables numéricas continuas
+ Equivalente no paramétrico de la T de Student
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
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
Mide la dependencia lineal entre 2 variables
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
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
Modela la relación (lineal) entre una variable continua (respuesta) y una o mas variables predictoras
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")
Compara promedios entre grupos
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
Compara promedios entre grupos
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
+ Evalúa si el número de muestras para la combinación de niveles en 2 variables categóricas sigue una distribución determinada
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?
Estima la correlación entre matrices de distancia (similitud)
Utiliza aleatorización para calcular valores de P
Supuestos
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
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
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
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