Adaptado al paquete MVN: Es un paquete R para evaluar la normalidad univariante y multivariante.
CONTENIDO
Introduccción
Consecuencias de la falta de normalidad
Implementación del paquete MVN
Función MVN
Normalidad univariante
5.1 Representación grafica de datos
5.2 tests de normalidad univariante
Test de normalidad multivariante
Gráficas de perspectiva y contorno datos bivariados
valores atipicos multivariantes
Análisis de subconjuntos
Interfaz web para el paquete MVN
Normalidad para una sola variable
referencias bibliograficas
1. Introducción
Los análisis de normalidad, también llamados contrastes de normalidad, tienen como objetivo analizar cuánto difiere la distribución de los datos observados respecto a lo esperado si procediesen de una distribución normal con la misma media y desviación típica.
Para su análisis pueden diferenciarse tres estrategias:
Mediante representaciones gráficas
Mediante métodos analíticos y
Test de hipótesis.
El test de hipotesis bajo consideración es:
Hipotesis estadística
Ho: los datos siguen una distribución normal
Ha: los datos no siguen una distribución normal
Nivel de significancia α=0.05 o 0.01
Prueba estadística: shapiro-wilks, kolmogorov, otro
Decisión: si p<α, la prueba estadística es significativa, no existiría normalidad en los datos
2. Consecuencias de la falta de normalidad
El hecho de no poder asumir la normalidad influye principalmente en los test de hipótesis paramétricos (t-test, anova,…) y en los modelos de regresión. Las principales consecuencias de la no normalidad son:
El teorema del límite central requiere que la población o poblaciones de las que proceden las muestras tengan una distribución normal, no que la tengan las muestras. Si las muestras se distribuyen de forma normal, se puede aceptar que así lo hacen las poblaciones de origen. En el caso de que las muestras no se distribuyan de forma normal, pero se tenga certeza de que las poblaciones de origen sí lo hacen, entonces, los resultados obtenidos por los contrastes paramétricos sí son válidos. El teorema del límite central, permite reducir los requerimientos de normalidad cuando las muestras suficientemente grandes.
3. Implementación del paquete MVN.
El paquete MVN contiene funciones en la clase S3 para evaluar la normalidad uni y multivariante, para ello los datos deben acomodarse como clase “data.frame” o “matrix” , es decir para su uso necesita mínimo 2 variables.
4. Función MVN
Esta función incluye todos los argumentos para evaluar la normalidad multivariada mediante pruebas de normalidad multivariante, gráficos multivariados, detección de valores atípicos multivariado, pruebas de normalidad univariante y gráficas univariadas.
mvn(data, subset = NULL, mvnTest = c(“mardia”, “hz”, “royston”, “dh”, “energy”), covariance = TRUE, tol = 1e-25, alpha = 0.5, scale = FALSE, desc = TRUE, transform = “none”, R = 1000, univariateTest = c(“SW”, “CVM”, “Lillie”, “SF”, “AD”), univariatePlot = “none”, multivariatePlot = “none”, multivariateOutlierMethod = “none”, showOutliers = FALSE, showNewData = FALSE)
Para recrear el tema se usan ejemplos del conjunto de datos Iris.
5. Normalidad univariante
Consiste en representar los datos mediante un histograma y superponer la curva de una distribución normal con la misma media y desviación estándar que muestran los datos.
Representaciones graficas de los datos
Cargando el paquete de datos iris desde la base de datos R
# importando la data Iris de R
data(iris)
head(iris) # muestra los primeros 6 datos
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
Podemos observar 4 variables cuantitativas y una cualitativa (Species), note que, para analizar la normalidad en datos, requerimos de variables medidas cuantitativamente.
names(iris) # muestra los rotulos de las variables
## [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
dim(iris) # muestra numero de filas y comlumnas
## [1] 150 5
El conjunto de datos Iris tiene 150 muestras tomadas en grupos de 50 (especies de plantas: setosa, virginica y versicolor) y para cada especie se midieron la Sepal.Length, Sepal.Width, Petal.Length, Petal.Width en centímetros.
Observando el tipo de datos:
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
La salida indica que tenemos 4 variables numéricas(cuantitativas) y una Factor (cualitativa).
Observando el tipo de data.
class(iris)
## [1] "data.frame"
Al observar la normalidad puede suceder que, si los datos tienen una distribución normal multivariante, entonces, cada una de las variables tiene una distribución normal univariante; pero lo opuesto no tiene que ser verdad. Por lo tanto, el control de gráficos y pruebas univariadas podría ser muy útil para diagnosticar el motivo de la desviación. Podemos verificar esta suposición a través de argumentos UnivariatePlot y univariateTest de la función MVN. Establezca el argumento UnivariatePlot “qq” para gráficos Q-Q, “histogram” para histogramas con curvas normales, “box” para diagramas de caja y “scatter” para matrices de diagramas de dispersión.
A continuación, se muestra el análisis solamente para el tipo de flor setosa (setosa tiene 4 tipos de medición).
# create univariate graphs
library(MVN)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## sROC 0.1-2 loaded
# setosa subset of the Iris data
setosa <- iris[1:50, 1:4]
# create univariate box, histogram and Q-Q plots
x11()
Result <- mvn(data=setosa, mvnTest="royston", univariatePlot="box")
## Warning in uniPlot(data, type = univariatePlot): Box-Plots are based on
## standardized values (centered and scaled).
Figura 1. Diagramas de cajas para el tipo de flor setosa
# create univariate histograms
Result<- mvn(data=setosa, mvnTest="royston", univariatePlot="histogram")
Figura 2: Histogramas para setosa
Como se ve en la Figura 2, Petal.Width tiene una distribución sesgada a la derecha mientras que otras variables tienen distribuciones aproximadamente normales. Por lo tanto, podemos concluir que los problemas con la normalidad multivariante surgen de la distribución sesgada de Petal.Width.
El gráfico de Q-Q, donde “Q” representa cuantil, es un enfoque gráfico ampliamente utilizado para evaluar el acuerdo entre dos distribuciones de probabilidad. Cada eje se refiere a los cuantiles de distribuciones de probabilidad a comparar, donde uno de los ejes indica cuantiles teóricos (cuantiles hipotéticos) y el otro indica los cuantiles observados. Si los datos observados cumplen con la distribución hipotética (normalidad), los puntos en el gráfico Q-Q se encontrarán aproximadamente en la línea y = x. MVN tiene la capacidad de crear tres gráficos multivariables. Uno puede usar la opción multivariatePlot = “qq” en la función mvn, para crear un gráfico Q-Q chi-cuadrado.
Podemos crear este gráfico para el conjunto de datos de setosa para ver si hay alguna desviación de la normalidad multivariante. La muestra el gráfico de chi-cuadrado Q-Q de las primeras 50 filas de datos de Iris, que son flores de setosa
# create univariate Q-Q plots
result<-mvn(data=setosa, mvnTest = "royston", univariatePlot = "qqplot")
Figura 3: Gráfico Chi-Cuadrado Q-Q para conjunto de datos de setosa
Se puede ver en la Figura que hay algunas desviaciones de la línea recta y esto indica posibles desviaciones de una distribución normal multivariada especialmente en Petal.Width. Como resultado, podemos concluir que este conjunto de datos no satisface las suposiciones de normalidad multivariante, el gráfico de chi-cuadrado Q-Q indica desviaciones de la distribución normal multivariable.
Test de normalidad univariantes
A continuación, se muestran los test de hipótesis más empleados para analizar la normalidad de los datos. En todos ellos, se considera como hipótesis nula que los datos sí proceden de una distribución normal y como hipótesis alternativa que no lo hacen. El p-value de estos test indica la probabilidad de obtener una distribución como la observada si los datos proceden realmente de una población con una distribución normal.
Cuando estos test se emplean con la finalidad de verificar las condiciones de métodos paramétricos, por ejemplo, un t-test o un ANOVA, es importante tener en cuenta que, al tratarse de p-values, cuanto mayor sea el tamaño de la muestra más poder estadístico tienen y más fácil es encontrar evidencias en contra de la H0 (normalidad). Al mismo tiempo, cuanto mayor sea el tamaño de la muestra, menos sensibles son los métodos paramétricos a la falta de normalidad. Por esta razón, es importante no basar las conclusiones únicamente en el p-value del test, sino también considerar la representación gráfica y el tamaño de la muestra.
La función mvn. Proporciona varias pruebas de normalidad univariante ampliamente utilizadas, incluido “SW” (no aplique la prueba de Shapiro-Wilk, si el conjunto de datos incluye más de 5000 casos o menos de 3 casos) para la prueba de Shapiro-Wilk, “CVM” para Cramer-von Mises test, test “Lillie” para la prueba de Lilliefors, “SF” para la prueba de Shapiro-Francia y la prueba de “AD” Anderson-Darling.
Este test se emplea para contrastar normalidad cuando el tamaño de la muestra es menor de 50. Para muestras grandes es equivalente al test de kolmogorov-Smirnov (Lilliefors).
# test de normalidad univariante
# Test de Shapiro-Wilks
result <- mvn(data = setosa, univariateTest = "SW", desc = TRUE)
result
## $multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 25.6643445196298 0.177185884467652 YES
## 2 Mardia Kurtosis 1.29499223711605 0.195322907441935 YES
## 3 MVN <NA> <NA> YES
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Shapiro-Wilk Sepal.Length 0.9777 0.4595 YES
## 2 Shapiro-Wilk Sepal.Width 0.9717 0.2715 YES
## 3 Shapiro-Wilk Petal.Length 0.9550 0.0548 YES
## 4 Shapiro-Wilk Petal.Width 0.7998 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th Skew Kurtosis
## Sepal.Length 50 5.006 0.3524897 5.0 4.3 5.8 4.8 5.200 0.11297784 -0.4508724
## Sepal.Width 50 3.428 0.3790644 3.4 2.3 4.4 3.2 3.675 0.03872946 0.5959507
## Petal.Length 50 1.462 0.1736640 1.5 1.0 1.9 1.4 1.575 0.10009538 0.6539303
## Petal.Width 50 0.246 0.1053856 0.2 0.1 0.6 0.2 0.300 1.17963278 1.2587179
A partir de los resultados anteriores, podemos ver que todas las variables, excepto Petal.Width con p(0.001)<α(0.05) en el conjunto de datos setosa, tienen distribuciones normales univariadas en el nivel de significación 0.05. Igualmente, los promedios difieren entre sí.
Nota: para mostrar las pruebas estadísticas, cortaremos las salidas descriptivas ya que estas se repiten en cada corrida.
result <- mvn(data = setosa, mvnTest = "royston", univariateTest = "CVM", desc = TRUE)
result
## $multivariateNormality
## Test H p value MVN
## 1 Royston 31.51803 2.187653e-06 NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Cramer-von Mises Sepal.Length 0.0718 0.2597 YES
## 2 Cramer-von Mises Sepal.Width 0.0754 0.2324 YES
## 3 Cramer-von Mises Petal.Length 0.1897 0.0069 NO
## 4 Cramer-von Mises Petal.Width 0.9769 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th Skew Kurtosis
## Sepal.Length 50 5.006 0.3524897 5.0 4.3 5.8 4.8 5.200 0.11297784 -0.4508724
## Sepal.Width 50 3.428 0.3790644 3.4 2.3 4.4 3.2 3.675 0.03872946 0.5959507
## Petal.Length 50 1.462 0.1736640 1.5 1.0 1.9 1.4 1.575 0.10009538 0.6539303
## Petal.Width 50 0.246 0.1053856 0.2 0.1 0.6 0.2 0.300 1.17963278 1.2587179
El test de Kolmogorov-Smirnov permite estudiar si una muestra procede de una población con una determinada distribución (media y desviación típica), no está limitado únicamente a la distribución normal. A pesar de que continuamente se alude al test Kolmogorov-Smirnov como un test válido para contrastar la normalidad, esto no es del todo cierto. El Kolmogorov-Smirnov asume que se conoce la media y varianza poblacional, lo que en la mayoría de los casos no es posible. Esto hace que el test sea muy conservador y poco potente. Para solventar este problema, se desarrolló una modificación del Kolmogorov-Smirnov conocida como test Lilliefors. El test Lilliefors asume que la media y varianza son desconocidas, estando especialmente desarrollado para contrastar la normalidad. Es la alternativa al test de Shapiro-Wilk cuando el número de observaciones es mayor de 50.
result <- mvn(data = setosa, mvnTest = "royston", univariateTest = "Lillie", desc = TRUE)
result
## $multivariateNormality
## Test H p value MVN
## 1 Royston 31.51803 2.187653e-06 NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Lilliefors (Kolmogorov-Smirnov) Sepal.Length 0.1149 0.0969 YES
## 2 Lilliefors (Kolmogorov-Smirnov) Sepal.Width 0.1047 0.1863 YES
## 3 Lilliefors (Kolmogorov-Smirnov) Petal.Length 0.1534 0.0049 NO
## 4 Lilliefors (Kolmogorov-Smirnov) Petal.Width 0.3488 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th Skew Kurtosis
## Sepal.Length 50 5.006 0.3524897 5.0 4.3 5.8 4.8 5.200 0.11297784 -0.4508724
## Sepal.Width 50 3.428 0.3790644 3.4 2.3 4.4 3.2 3.675 0.03872946 0.5959507
## Petal.Length 50 1.462 0.1736640 1.5 1.0 1.9 1.4 1.575 0.10009538 0.6539303
## Petal.Width 50 0.246 0.1053856 0.2 0.1 0.6 0.2 0.300 1.17963278 1.2587179
result <- mvn(data = setosa, mvnTest = "royston", univariateTest = "SF", desc = TRUE)
result
## $multivariateNormality
## Test H p value MVN
## 1 Royston 31.51803 2.187653e-06 NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Shapiro-Francia Sepal.Length 0.9817 0.5357 YES
## 2 Shapiro-Francia Sepal.Width 0.9641 0.1181 YES
## 3 Shapiro-Francia Petal.Length 0.9490 0.0324 NO
## 4 Shapiro-Francia Petal.Width 0.7952 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th Skew Kurtosis
## Sepal.Length 50 5.006 0.3524897 5.0 4.3 5.8 4.8 5.200 0.11297784 -0.4508724
## Sepal.Width 50 3.428 0.3790644 3.4 2.3 4.4 3.2 3.675 0.03872946 0.5959507
## Petal.Length 50 1.462 0.1736640 1.5 1.0 1.9 1.4 1.575 0.10009538 0.6539303
## Petal.Width 50 0.246 0.1053856 0.2 0.1 0.6 0.2 0.300 1.17963278 1.2587179
result <- mvn(data = setosa, mvnTest = "royston", univariateTest = "AD", desc = TRUE)
result
## $multivariateNormality
## Test H p value MVN
## 1 Royston 31.51803 2.187653e-06 NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Anderson-Darling Sepal.Length 0.4080 0.3352 YES
## 2 Anderson-Darling Sepal.Width 0.4910 0.2102 YES
## 3 Anderson-Darling Petal.Length 1.0073 0.0108 NO
## 4 Anderson-Darling Petal.Width 4.7148 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th Skew Kurtosis
## Sepal.Length 50 5.006 0.3524897 5.0 4.3 5.8 4.8 5.200 0.11297784 -0.4508724
## Sepal.Width 50 3.428 0.3790644 3.4 2.3 4.4 3.2 3.675 0.03872946 0.5959507
## Petal.Length 50 1.462 0.1736640 1.5 1.0 1.9 1.4 1.575 0.10009538 0.6539303
## Petal.Width 50 0.246 0.1053856 0.2 0.1 0.6 0.2 0.300 1.17963278 1.2587179
También podemos obtener solo pruebas de normalidad multivariante
6. Test de normalidad multivariante
Para simplificar, tomemos un subconjunto del paquete de datos iris que contiene 50 muestras de flores setosa y verifiquemos la suposición de normalidad multivariada utilizando las pruebas de Mardia, Royston, Henze-Zirkler y Energy test que se encuentran dentro del paquete MVN.
# tomando el subconjunto de datos setosa
setosa <- iris[1:50, 1:4] # primeros 50 datos, primeras 4 variables
head(setosa)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.1 3.5 1.4 0.2
## 2 4.9 3.0 1.4 0.2
## 3 4.7 3.2 1.3 0.2
## 4 4.6 3.1 1.5 0.2
## 5 5.0 3.6 1.4 0.2
## 6 5.4 3.9 1.7 0.4
6.1 Prueba de Mardia con MVN.
El argumento mvnTest = “mardia” en la función mvn se usa para calcular los coeficientes de asimetría multivariado y curtosis de Mardia, así como su significación estadística correspondiente. Esta función también puede calcular la versión corregida del coeficiente de asimetría para el tamaño de muestra pequeño (n <20).
# test de normalidad
# test de Mardia en MVN
result <- mvn(data = setosa, mvnTest = "mardia")
result$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 25.6643445196298 0.177185884467652 YES
## 2 Mardia Kurtosis 1.29499223711605 0.195322907441935 YES
## 3 MVN <NA> <NA> YES
Si ambas pruebas indican una normalidad multivariante, los datos siguen una distribución normal multivariada con un nivel de significación de 0.05, como es el caso del ejemplo: Skewness: p(0.177)>α(0.05) y Kurtosis: p(0.1953)>α(0.05)
6.2 Test Henze-Zirkler con MVN
Se puede usar mvnTest = “hz” en la función mvn para realizar la prueba de Henze-Zirkler.
# Henze-Zirkler's MVN test
result <- mvn(data = setosa, mvnTest = "hz")
result$multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 0.9488453 0.04995356 NO
La última columna indica que los datos NO siguen una normalidad multivariada al nivel 5% de significación. p(0.04995)<α(0.05)
6.3 Test Royston con MVN
Para llevar a cabo la prueba de Royston, establezca el argumento mvnTest = “royston” en la función mvn de la siguiente manera:
# Royston's MVN test
result <- mvn(data = setosa, mvnTest = "royston")
result$multivariateNormality
## Test H p value MVN
## 1 Royston 31.51803 2.187653e-06 NO
La última columna indica que los datos NO siguen una normalidad multivariada al 5% de significancia. p(0.00000218)<α(0.05). NOTA: No aplique la prueba de Royston, si el conjunto de datos incluye más de 5000 casos o menos de 3 casos, ya que depende de la prueba de Shapiro-Wilk.
6.4 Test de Doornik-Hansen con MVN
Para llevar a cabo la prueba de Doornik-Hansen, establezca el argumento mvnTest = “dh” en la función mvn de la siguiente manera:
# Doornik-Hansen's MVN test
result <- mvn(data = setosa, mvnTest = "dh")
result$multivariateNormality
## Test E df p value MVN
## 1 Doornik-Hansen 126.5584 8 1.460761e-23 NO
La última columna que el conjunto de datos NO sigue una normalidad multivariada en el nivel de significación 0.05. p(0.00000)<α(0.05)
6.5 Energy test
Para llevar a cabo la prueba de Doornik-Hansen, establezca el argumento mvnTest = “energía” en la función mvn de la siguiente manera:
# Energy test
result <- mvn(data = setosa, mvnTest = "energy")
result$multivariateNormality
## Test Statistic p value MVN
## 1 E-statistic 1.203397 0.029 NO
La última columna indica que el conjunto de datos NO sigue una normalidad multivariada en el nivel de significación 0.05. p(0.033)<α(0.05). Como ya lo hemos descrito la variable Petal.With no tiende a la normal, excluyamos esta variable:
6.6 Normalidad excluyendo la variable Petal.With
Ahora podemos excluir Petal.With de los datos setosa y volver a verificar la normalidad multivariable.
setosa1 <- iris[1:50, 1:3] # primeros 50 datos, primeras 3 variables
head (setosa1) # solo la data setosa
## Sepal.Length Sepal.Width Petal.Length
## 1 5.1 3.5 1.4
## 2 4.9 3.0 1.4
## 3 4.7 3.2 1.3
## 4 4.6 3.1 1.5
## 5 5.0 3.6 1.4
## 6 5.4 3.9 1.7
# prueba MVN de Mardia
result <- mvn(data = setosa1, mvnTest = "mardia")
result$multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 11.2494200312663 0.338419002210318 YES
## 2 Mardia Kurtosis 1.28731356507177 0.197985017332943 YES
## 3 MVN <NA> <NA> YES
# Henze-Zirkler's MVN test
result <- mvn(data = setosa1, mvnTest = "hz")
result$multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 0.5243923 0.8310472 YES
# Royston's MVN test
result <- mvn(data = setosa1, mvnTest = "royston")
result$multivariateNormality
## Test H p value MVN
## 1 Royston 7.254588 0.06025685 YES
# Doornik-Hansen's MVN test
result <- mvn(data = setosa1, mvnTest = "dh")
result$multivariateNormality
## Test E df p value MVN
## 1 Doornik-Hansen 64.97364 6 4.367761e-12 NO
# Energy test
result <- mvn(data = setosa1, mvnTest = "energy")
result$multivariateNormality
## Test Statistic p value MVN
## 1 E-statistic 0.7856238 0.629 YES
De acuerdo con los resultados de la prueba MVN la data setosa sin Petal.Width tiene una distribución normal multivariada a un nivel de significación de 0.05 (excepto con la prueba Doornik-Hansen).
7. Gráficas de perspectiva y contorno para datos bivariados
Si bien la gráfica Q-Q es un enfoque general para evaluar la MVN en todos los tipos de conjuntos de datos numéricos multivariados, las gráficas de perspectiva y contorno solo se pueden usar para datos bivariados. Para demostrar la aplicabilidad de estos dos enfoques, utilizaremos un subconjunto de datos de Iris, llamado setosa2, que incluye las variables longitud del sépalo y ancho de sépalo de la especie setosa.
Perspectiva y gráficos de contorno
Las densidades marginales normales univariadas son una condición necesaria pero no suficiente para la MVN. Por lo tanto, además de las representaciones univariadas, será útil crear gráficos de perspectiva y contorno. El diagrama de perspectiva es una extensión de la curva de distribución de probabilidad univariada en una superficie de distribución de probabilidad tridimensional relacionada con distribuciones bivariadas. También proporciona información sobre dónde se recopilan los datos y cómo se correlacionan dos variables entre sí. Consiste en tres dimensiones donde dos dimensiones se refieren a los valores de las dos variables y la tercera dimensión, que es probable en casos univariables, es el valor de la función de densidad de probabilidad normal multivariable. Otro gráfico alternativo, que se llama la “gráfica de contorno”, implica la proyección de la gráfica de perspectiva en un espacio bidimensional y esto puede usarse para verificar la suposición de normalidad multivariado. Para datos distribuidos normalmente bivariados, esperamos obtener un gráfico en forma de campana tridimensional a partir de la gráfica de perspectiva. Del mismo modo, en la gráfica de contorno, podemos observar un patrón similar. Para construir una perspectiva y un diagrama de contorno, podemos usar el argumento MultivariatePlot en la función mvn. En los siguientes códigos, usamos multivariatePlot = “persp” para crear un gráfico de perspectiva. También es posible crear un gráfico de contorno de los datos. Los gráficos de contorno son muy útiles ya que brindan información sobre la normalidad y la correlación al mismo tiempo. La Figura tambien muestra la gráfica de contorno de las flores de setosa, cuando establecemos multivariatePlot = “contour”. Como se puede ver en el gráfico, esto es simplemente una vista superior de la gráfica de perspectiva donde la tercera dimensión se representa con líneas de contorno elipsoidales. A partir de este gráfico, podemos decir que existe una correlación positiva entre las medidas de los sépalos de las flores ya que las líneas de contorno se encuentran alrededor de la diagonal principal. Si la correlación fuera cero, las líneas de contorno serían circulares en lugar de elipsoidales.
# Graficos de perspectiva y contorno para datos bivariados
setosa2 <- iris[1:50, 1:2]
head(setosa2)
## Sepal.Length Sepal.Width
## 1 5.1 3.5
## 2 4.9 3.0
## 3 4.7 3.2
## 4 4.6 3.1
## 5 5.0 3.6
## 6 5.4 3.9
# perspective plot
result <- mvn(setosa2, mvnTest = "hz", multivariatePlot = "persp")
# contour plot
result <- mvn(setosa2, mvnTest = "hz", multivariatePlot = "contour")
Figure 4: grafico de perspectiva y contorno para la data setosa2
8. Valores atípicos multivariantes (Multivariate outliers)
Los valores atípicos multivariados son la razón común para violar la suposición de MVN. En otras palabras, la suposición de MVN requiere la ausencia de valores atípicos multivariados. Por lo tanto, es crucial verificar si los datos tienen valores atípicos multivariantes, antes de comenzar con el análisis multivariado. La MVN incluye dos métodos de detección de valores atípicos multivariados que se basan en distancias robustas de Mahalanobis (rMD (x)). La distancia de Mahalanobis es una métrica que calcula qué tan lejos está cada observación del centro de distribución de la articulación, que se puede considerar como el centroide en el espacio multivariable. Las distancias robustas se estiman a partir de estimadores determinantes de covarianza mínima en lugar de la covarianza de la muestra [7]. Estos dos enfoques, definidos como la distancia Mahalanobis y la distancia Mahalanobis ajustada en el paquete, detectan valores atípicos multivariados como se indica a continuación,
Distancia Mahalanobis:
Calcule distancias robustas de Mahalanobis (rMD (xi)),
Calcule el cuantil del 97.5 por ciento (Q) de la distribución de chi-cuadrado,
Declare rMD (xi)> Q como posible valor atípico.
Distancia ajustada de Mahalanobis:
Calcule distancias robustas de Mahalanobis (rMD (xi)),
Calcule el cuantil ajustado de 97.5 por ciento (AQ) de la distribución de chi-Cuadrado,
Declare rMD (xi)> AQ como posible valor atípico.
El argumento multivariateOutlierMethod como “quan” para el método de cuantiles basado en la distancia de Mahalanobis y como “adj” para el método cuantil ajustado basado en la distancia de Mahalanobis para detectar valores atípicos multivariados como se indica a continuación. También devuelve un nuevo conjunto de datos en el que se eliminan los valores atípicos declarados. Además, este argumento crea gráficos Q-Q para la inspección visual de los posibles valores atípicos.
Para este ejemplo, usaremos otro subconjunto de los datos de Iris, que son flores versicolor, con las primeras tres variables.
# Valores atipicos multivariantes (Multivariate outliers)
versicolor <- iris[51:100, 1:3]
# Mahalanobis distance
result <- mvn(data = versicolor, mvnTest = "hz", multivariateOutlierMethod = "quan")
Figura 5. Detección de valores atípicos. Distancia de Mahalanobis
# Adjusted Mahalanobis distance
result <- mvn(data=versicolor,mvnTest="hz",multivariateOutlierMethod="adj")
Figura 6. Detección de valores atípicos. Distancia ajustad de Mahalanobis
De la Figura 5 y 6, la distancia de Mahalanobis declara 2 observaciones como valor atípico multivariado, mientras que la distancia Mahalanobis ajustada no declara ninguna. Ver [8] para más información sobre valores atípicos multivariados.
9. Análisis de subconjuntos
También se puede realizar un análisis de subgrupos utilizando la función mvn. Vamos a usar todo el conjunto de datos Iris una vez más para este propósito.
En el conjunto de datos, hay una variable de grupo (Especies), que define la especie de la flor.
# Análisis de subconjuntos.
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
result <- mvn(data = iris, subset = "Species", mvnTest = "hz")
result$multivariateNormality
## $setosa
## Test HZ p value MVN
## 1 Henze-Zirkler 0.9488453 0.04995356 NO
##
## $versicolor
## Test HZ p value MVN
## 1 Henze-Zirkler 0.8388009 0.2261991 YES
##
## $virginica
## Test HZ p value MVN
## 1 Henze-Zirkler 0.7570095 0.4970237 YES
De acuerdo con los resultados de la prueba de Henze-Zirkler, el conjunto de datos para setosa no sigue una distribución normal multivariada, mientras que el conjunto de datos versicolor y virginica siguen una distribución normal multivariante.
10. Interfaz web para el paquete MVN
El objetivo del paquete es proporcionar pruebas MVN junto con enfoques gráficos para evaluar MVN. Además, este paquete ofrece pruebas y gráficos univariados y detección de valores atípicos multivariados para verificar supuestos de MVN a través de R. Sin embargo, el uso de códigos R puede ser un desafío para los nuevos usuarios de R. Por lo tanto, también desarrollamos una aplicación web fácil de usar mediante el uso de shiny [9]. Esta herramienta web, que es una aplicación interactiva, tiene todas las características que tiene el paquete MVN. Está disponible públicamente a través de
http://www.biosoft.hacettepe.edu.tr/MVN/.
11. Normalidad para datos simples.
# normalidad para datos simples
# Ejemplo: verifique la normalidad para los siguientes datos:
# 12,13,12,13,1,2,34,45,46,57,45,23,22,22,13,46
# ingresando datos
a <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
b <- c(12,13,12,13,1,2,34,45,46,57,45,23,22,22,13,46)
data=data.frame(a,b)
data
## a b
## 1 1 12
## 2 2 13
## 3 3 12
## 4 4 13
## 5 5 1
## 6 6 2
## 7 7 34
## 8 8 45
## 9 9 46
## 10 10 57
## 11 11 45
## 12 12 23
## 13 13 22
## 14 14 22
## 15 15 13
## 16 16 46
boxplot(data$b)
Figura 7. Diagrama de cajas
hist(data$b)
Figura 8. histograma de frecuencias
shapiro.test(x = data$b) # Shapiro
##
## Shapiro-Wilk normality test
##
## data: data$b
## W = 0.90519, p-value = 0.09737
ks.test(x = data$b,"pnorm", mean(data$b), sd(data$b)) #Kolmogorov
## Warning in ks.test(x = data$b, "pnorm", mean(data$b), sd(data$b)): ties should
## not be present for the Kolmogorov-Smirnov test
##
## One-sample Kolmogorov-Smirnov test
##
## data: data$b
## D = 0.19568, p-value = 0.5725
## alternative hypothesis: two-sided
library("nortest")
lillie.test(x = data$b) # Lilliefors
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: data$b
## D = 0.19568, p-value = 0.104
library("tseries")
## Registered S3 method overwritten by 'xts':
## method from
## as.zoo.xts zoo
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
jarque.bera.test(x = data$b) # Jarque vera
##
## Jarque Bera Test
##
## data: data$b
## X-squared = 1.2837, df = 2, p-value = 0.5263
12. Referencias Bibliograficas
[1] S Korkmaz, D Goksuluk, and G Zararsiz. Mvn: An r package for assessing multivariate normality. The R Journal, 6(2):151–162, 2014.
[2] R. A. Fisher. The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7(2):179–188, 1936. [3] Edgar Anderson. The species problem in Iris. Missouri Botanical Garden Press, 23(3):457–509, 1936.
[4] Tom Burdenski. Evaluating univariate, bivariate, and multivariate normality using graphical and statistical procedures. Multiple Linear Regression Viewpoints, 26(2):15–28, 2000.
[5] James P Stevens. Applied multivariate statistics for the social sciences. Routledge, 2012.
[6] Robert E Kass, Uri T Eden, and Emery N Brown. Analysis of Neural Data. Springer, 2014.
[7] P. J. Rousseeuw and A. M. Leroy. Robust Regression and Outlier Detection. John Wiley & Sons, Inc., New York, NY, USA, 1987.
[8] Peter Filzmoser, Robert G. Garrett, and Clemens Reimann. Multivariate outlier detection in exploration geochemistry. Computers & Geosciences, 31(5):579–587, 2005.
[9] RStudio, Inc. shiny: Web Application Framework for R, 2014. R package version 0.10.1.
[10] Selcuk Korkmaz1, Dincer Goksuluk and Gokmen Zararsiz. MVN: An R Package for Assessing Multivariate Normality. Trakya University, Faculty of Medicine, Department of Biostatistics, Edirne, TURKEY