Documentos de Académico
Documentos de Profesional
Documentos de Cultura
RStudio
2021-08-10
Introducción
¿Qué es?
El análisis de varianza multivariado es un método estadístico multivariante inferencial parámetrico que es una
extensión del ANOVA para comparar medias entre más de dos poblaciones. Está técnica permite analizar
la relación entre varias variables dependientes (o endógenas) métricas y una o más variables independientes
(o exógenas) no métricas.
¿Cuál es el objetivo del análisis?
• contrastar si los valores no métricos de las variables independientes determinarán la igualdad de vectores
de medias de una serie de variables dependientes.
Materiales
Script - MANOVA
Para ejemplificar como se realiza el análisis con RStudio usaremos la base de datos “iris” incorporada dentro
del ambiente de R, que contiene diversas mediciones en cm realizadas en 150 lirios de tres especies por ronald
Fisher que aparecen registradas en su artículo “El uso de múltiples medidas en problemas taxonómicos”
(1936). Para cada individuo analizado se midieron las siguientes variables:
1
Tabla 1.
Descripción de las variables
Para trabajar con el conjunto solo hace falta escribir el nombre de la base de datos directamente en la consola
iris. Visualizaremos los primeros 6 datos de la matriz con la función "head()"
head(iris)
Las 4 variables correspondientes a las mediciones son variables métricas por lo que podríamos considerar las
4 en la comparación. Para verificar si las variables dependientes de cada especie se ajustan a la distribución
normal p-variante con matrices de varianzas - covarianza, usaremos los test de normalidad de mardia y
box’s M ambos empleando la función "mvn()" y "boxM()" ubicadas en las librerías "MVN" y "biotools"
respectivamente. Primero realizaremos los test considerando todas las variables, luego solo la medidas de los
sépalos y luego transformando las medidas de los sépalos al log10. Recuerde que la matriz tiene 150 UE’s
donde de la 1:50 corresponden a la especie setosa, de la 51:100 a la especie versicolor y de la 101:150 a la
especie virginica.
library(MVN)
library(biotools)
---
biotools version 4.1
2
# Todas las variables.
boxM(data = iris[, 1:4], grouping = iris[, 5])
3
Test Statistic p value Result
1 Mardia Skewness 1.76081423820927 0.779643267719773 YES
2 Mardia Kurtosis -0.90648685799867 0.364678217772254 YES
3 MVN <NA> <NA> YES
Ya que el MANOVA requiere que se cumplan tanto el supuesto de normalidad multivariada como el de
homocedasticidad en las matrices de var - cov para las variables consideradas entre las poblaciones, de
acuerdo con las salidas abordaremos el análisis con las mediciones de los sépalos transformadas al log10,
para las que fue posible verificar el ajuste a la distribución normal p-variante de las mediciones del ancho
y largo de sépalos empleando el test de mardia, al no evidenciarse asimérica significativa ni para la especie
setosa, χ2 (4, N = 50) = 6.93, p = 0.14, ni para la especie verisicolor χ2 (4, N = 50) = 4.21, p = 0.38, ni para
la especie virginica χ2 (4, N = 50) = 4.03, p = 0.40, ni variación significativa con respecto al vector de medias,
z = 1.48, p = 0.14 para setosa, z = −0.52, p = 0.61 para versicolor y z = 0.65, p = 0.51 para virginica.
4
Adicionalmente el test M de box no reflejó diferencias aparentes en la matriz de varianza - covarianzas entre
las tres especies, χ2(6) = 16.182, p = 0.013.
Nota: recuerde que según (Hahs-Vaughn, 2016) valores p menores a 0.001 se consideran significantes para
la prueba M de box.
Para verificar si existe linealidad entre las variables dependientes sin evidencia de multicolinealidad al 100%
en las tres poblaciones (especies), realizaremos para lo primero un gráfico de pares distinguiendo los puntos
para cada especie y para lo segundo analizaremos la correlación entre las variables dependientes empleando
la función "cor_test()" ubicada en la librería "rstatix", recuerde que correlaciones por encima de 0.9 se
consideran significativas para multicolinealidad al 100%.
# Linealidad
pairs(log10(iris[, 1:2]), col = c("violetRed", "blue", "purple")[iris$Species], pch = 20,
cex = 1.2)
0.85
Sepal.Length
0.75
0.65
0.60
Sepal.Width
0.45
0.30
5
# A tibble: 3 x 9
Species var1 var2 cor statistic p conf.low conf.high method
<fct> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 setosa Sepal.Le~ Sepal.W~ 0.73 7.40 1.81e-9 0.567 0.838 Pears~
2 versico~ Sepal.Le~ Sepal.W~ 0.53 4.31 8.01e-5 0.293 0.703 Pears~
3 virgini~ Sepal.Le~ Sepal.W~ 0.46 3.60 7.51e-4 0.210 0.655 Pears~
De manera gráfica se observa una tendencia líneal en el patrón de puntos formado para la relación entre el
ancho y el largo de los sépalos de las tres especies, lo cual se verifica con el análisis de correlaciones donde
se evidenció una relación lineal directamente proporcional significativa entre estas dos medidas para las tres
especie, donde la mayor correlación lineal se muestra entre el ancho y largo de los sépalos de la especie setosa,
ρ = −0.73 ( t(50) = 7.40, p < 0.05), y la menor entre el ancho y largo de los sépalos de la especievirginica,
ρ = −0.46 ( t(50) = 3.6, p < 0.05), sin que tal relación supere el 0.9.
Por último verificaremos si el conjunto cuenta con observaciones atípicas influyentes a nivel multivariado, para
ellos emplearemos la función "mahalanobis_distance()" vista en la clase de exploración de datos.Recuerde
que la función toma como valor crítico para D2 , el cuántil en la distibución chi-cuadrado tal que χ2(0.999, p)
donde p es el número de variables.
# A tibble: 150 x 4
Sepal.LengthLog10 Sepal.WidthLog10 mahal.dist is.outlier
<dbl> <dbl> <dbl> <lgl>
1 0.708 0.544 1.65 FALSE
2 0.690 0.477 1.42 FALSE
3 0.672 0.505 2.22 FALSE
4 0.663 0.491 2.64 FALSE
5 0.699 0.556 2.29 FALSE
6 0.732 0.591 3.23 FALSE
7 0.663 0.531 3.04 FALSE
8 0.699 0.531 1.56 FALSE
9 0.643 0.462 4.03 FALSE
10 0.690 0.491 1.39 FALSE
# ... with 140 more rows
qchisq(0.999, 2)
[1] 13.81551
No hay evidencia de observaciones atípicas influyentes para ninguna de las tres especies en cuanto al tamaño
de sus sépalos, D2 < 13.81
6
Para el primer paso emplearemos la función "manova()" ubicada en la librería "car" y para el segundo
la función "lsmeans()" ubicada en la librería "emmeans". A la hora de mostar la tabla de MANOVA la
función dispone de 4 test "Pillai","Wilks","Hotelling-Lawley" y "Roy". Históricamente, el estadístico
de Wilks ha jugado el papel dominante en las pruebas de significación en el MANOVA porque fue el primero
en derivarse y tiene conocidas aproximaciones a las distribuciones χ2 y F , más no implica que sea el test más
robusto. En este sentido se aplica el test de Roy si los vectores medios son colineales, es decir si hay evidencia
de multicolinealidad entre las variables dependientes y solo en tales casos se recomienda su uso ya que es
sensible a la violación del resto de supuestos, mientras que si los datos provienen de poblaciones no normales
que exhiben asimetría o curtosis positiva, cualquiera de las otras tres pruebas funciona aceptablemente bien
(Rencher, 2002), siendo el test de Pillai la estadística más poderosa y sólida para uso general, especialmente
cuando se viola el supuesto homogeneidad de varianza-covarianza y si se tienen tamaños de muestra pequeños.
Con el Análisis buscaremos dar respuesta a la pregunta **¿Es la especie un factor determinante en la
estructura de los sépalos de los iris?. Las hipótesis a contrastar de forma génerica para el test son:
H0 : El vector de media de todas las poblaciones son iguales. En nuestro contexto sería que la estructura
de los sépalos es la misma para las tres especies.
H1 : El vector de media es diferente para al menos un par de poblaciones. En nuestro contexto sería que la
estructura de los sépalos es diferente para al menos un par de especies.
# MANOVA
library(car)
modelo = manova(cbind(Sepal.LengthLog10, Sepal.WidthLog10) ~ Species, data = iris)
summary(modelo, test = "Pillai") #Cambie test=’Wilks’ ó test=’Hotelling-Lawley’ ó test=’Roy’ para las o
# CONTRASTES MULTIPLES.
iris %>%
group_by(Species) %>%
summarise(mean(Sepal.LengthLog10), mean(Sepal.WidthLog10))
# A tibble: 3 x 3
Species ‘mean(Sepal.LengthLog10)‘ ‘mean(Sepal.WidthLog10)‘
<fct> <dbl> <dbl>
1 setosa 0.698 0.532
2 versicolor 0.772 0.440
3 virginica 0.817 0.471
library(emmeans)
d = lsmeans(lm(cbind(Sepal.LengthLog10, Sepal.WidthLog10) ~ Species, data = iris),
"Species")
test(contrast(d, "pairwise"))
7
Results are averaged over the levels of: rep.meas
P value adjustment: tukey method for comparing a family of 3 estimates
# GRAFICA.
library(reshape)
library(ggplot2)
library(reshape2)
ggplot(melt(iris[, 5:7]), aes(variable, value, fill = Species)) + stat_summary(fun.y = mean,
geom = "bar", position = "dodge") + stat_summary(fun.data = mean_cl_normal, geom = "errorbar",
position = position_dodge(width = 0.9), width = 0.5) + theme_classic() + scale_fill_brewer(palette =
0.8
0.6
Species
value
setosa
0.4 versicolor
virginica
0.2
0.0
Sepal.LengthLog10 Sepal.WidthLog10
variable
La estadística de Pillai reflejó que existe sufiente evidencia a partir de los datos para afirmar que al menos un
par de especies tienen sépalos significativamente distintos en cuánto a su estructura, F (4, 294) = 66.90, p <
0.001, determinando con el test de Tukey que la especie virginica tiene sépalos estadísticamente diferentes
a la especie versicolor, p < 0.001 y a la especie setosa, p < 0.001, sin diferencias aparentes entre estass
últimas, p = 0.41.
Introducción
¿Qué es?
8
El Análisis de varianza multivariado permutacional es un método semiparamétrico que conserva importantes
propiedades estadísticas robustas de los métodos multivariados no paramétricos basados en rangos. Tiene la
flexibilidad de basar el análisis en una medida de disimilitud a elección (como Bray-Curtis, Jaccard, etc.) y
lograr inferencias sin suposición de normalidad multivariante. Por lo tanto, el PERMANOVA es una opción
que permite dar respuesta de manera formal a diseños experimentales complejos en una amplia variedad de
contextos donde puede haber más variables de respuesta que unidades de muestreo, donde los datos pueden
no ajustarse a la normal multivariante, tener un conjunto de datos inflados en cero, poseer datos ordinales
o cualitativos (ej., respuestas a cuestionarios, secuencias de ADN / ARN, frecuencias alélicas, aminoácidos
ácidos o datos de proteínas). Aunque originalmente fue motivado por estudios ecológicos, donde las variables
generalmente consisten en conteos de abundancias (o porcentaje de cobertura, frecuencias o biomasa) para un
gran número de especies, el PERMANOVA en la actualidad se usa en muchos campos, incluyendo química,
ciencias sociales, agricultura, medicina, genética, psicología, economía y más. (Anderson, 2017)
¿Cuál es el objetivo del análisis?
• contrastar si hay diferencia significativa entre dos o más grupos para más de 1 varaiable dependiente
basada en cualquier medida de distancia.
Materiales
Script - perMANOVA
Cuado revisamos los requerimiento del MANOVA en cuando a los supuestos de normalidad multivariante
y homocedasticidad en las martices de varianza-covarianzas considerando solo las variables ancho y largo
del sépalo de las 3 especies nos dimos cuenta que para los datos sin transformar no era posible garantizar
la igualdad en la matriz de varianza - covarianzas entre las tres especies con el test de Box M, χ2(6) =
35.655, p < 0.001.
library(MVN)
library(biotools)
# Datos de los sépalos sin transformar.
boxM(data = iris[, 1:2], grouping = iris[, 5])
9
mvn(data = iris[1:50, 1:2], mvnTest = "mardia")$multivariateNormality #setosa
Continuaremos con el gráfico de pares para veririficar si existe linealidad entre las variables dependientes y
el test de correlaciones para corroborar tal linealidad sin evidencia de multicolinealidad al 100% en las tres
poblaciones (especies).
# Linealidad
pairs(iris[, 1:2], col = c("violetRed", "blue", "purple")[iris$Species], pch = 20,
cex = 1.2)
10
2.0 2.5 3.0 3.5 4.0
7.5
6.5
Sepal.Length
5.5
4.5
4.0
Sepal.Width
3.0
2.0
# Multicolinealidad al 100%
library(tidyverse)
library(rstatix)
iris %>%
group_by(Species) %>%
cor_test(Sepal.Length, Sepal.Width)
# A tibble: 3 x 9
Species var1 var2 cor statistic p conf.low conf.high method
<fct> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 setosa Sepal.Le~ Sepal.~ 0.74 7.68 6.71e-10 0.585 0.846 Pears~
2 versicol~ Sepal.Le~ Sepal.~ 0.53 4.28 8.77e- 5 0.290 0.702 Pears~
3 virginica Sepal.Le~ Sepal.~ 0.46 3.56 8.43e- 4 0.205 0.653 Pears~
Siguiendo la interpretación de estos supuestos dada en el apartado de MANOVA, ¿Qué se puede concluir
de los datos sin transformar?
Por último verificaremos si el conjunto cuenta con observaciones atípicas influyentes a nivel multivariado
empleando la función "mahalanobis_distance()"
11
# A tibble: 150 x 4
Sepal.Length Sepal.Width mahal.dist is.outlier
<dbl> <dbl> <dbl> <lgl>
1 5.1 3.5 1.65 FALSE
2 4.9 3 1.37 FALSE
3 4.7 3.2 1.93 FALSE
4 4.6 3.1 2.26 FALSE
5 5 3.6 2.32 FALSE
6 5.4 3.9 3.83 FALSE
7 4.6 3.4 2.63 FALSE
8 5 3.4 1.49 FALSE
9 4.4 2.9 3.36 FALSE
10 4.9 3.1 1.30 FALSE
# ... with 140 more rows
qchisq(0.999, 2)
[1] 13.81551
Siguiendo la interpretación de este supuesto dada en el apartado de MANOVA, ¿Qué se puede concluir
de los datos sin transformar?
Para la primera parte como el supuesto de homocedasticidad no se cumple emplearemos para dar respuesta
a la pregunta ¿Es la especie un factor determinante en la estructura de los sépalos de los iris?
un perMANOVA usando la función "adonis()" ubicada en la librería "vegan" indicando como medida
de distancia la "distancia de mahalanobis" al tratarse las variables dependiente de medidas métricas
correlacionadas entre sí. Para la segunda parte emplearemos la función "pairwise.perm.manova()" ubicada
en la librería "RVAideMemoire".
Las hipótesis a contrastar de forma génerica para el test son:
H0 : No hay diferencias en las posiciones de los centroides de los grupos en el espacio de la medida de
disimilitud elegida.
H1 : Hay diferencias en las posiciones de los centroides de los grupos en el espacio de la medida de disimilitud
elegida.
# perMANOVA
library(vegan)
adonis(iris[, 1:2] ~ Species, data = iris, method = "mahalanobis")
Call:
adonis(formula = iris[, 1:2] ~ Species, data = iris, method = "mahalanobis")
Permutation: free
12
Number of permutations: 999
# CONTRASTES MULTIPLES.
library(RVAideMemoire)
pairwise.perm.manova(iris[, 1:2], iris$Species, p.method = "bonf")
| |
# GRAFICA.
library(tidyverse)
iris %>%
group_by(Species) %>%
mutate(L = mean(Sepal.Length), A = mean(Sepal.Width)) %>%
ggplot(aes(Sepal.Length, Sepal.Width, color = Species)) + geom_point() + geom_point(aes(x = L,
y = A), size = 4) + geom_segment(aes(x = Sepal.Length, y = Sepal.Width, xend = L,
yend = A)) + theme_classic()
13
4.5
4.0
3.5
Species
Sepal.Width
setosa
versicolor
3.0 virginica
2.5
2.0
5 6 7 8
Sepal.Length
library(ggplot2)
library(reshape)
ggplot(melt(iris[, c(1, 2, 5)]), aes(variable, value, fill = Species)) + geom_boxplot() +
theme_classic() + scale_fill_brewer(palette = "Set2")
14
8
Species
value
setosa
versicolor
virginica
4
Sepal.Length Sepal.Width
variable
El test permutacional reflejó que el factor especie resulta significativo para afirmar que hay diferencias en la
distribución de los centroide de las medidas de los sépalos entre las especies, F (4, 147) = 65.878, p = 0.001,
determinando con la estadística pillai con ajuste bonferroni en las comparaciones multiples empleando que
todas las especies muestran diferencias en la estructura de sus sépalos, p = 0.003.
Práctica
Replique a manera de práctica el análisis apropiado para comparar la estructura de las flores de las tres
especies de lirios (todas las medidas) y con ello responda:
15