Suponga que la muestra fue extraída de una población (\(\textbf{X}\)), entonces el interés es probar las hipótesis:
Con el fin de evaluar la normalidad multivariada bajo el supuesto de que los datos fueron extraidos de una población \(\textbf{X} \sim N_p(\mu,\Sigma)\) se efectuó la prueba de Mardia.
# Cargar los datos del CSV
anexo1 <- read.table("C:/Users/jusec/Downloads/anexo1.csv",header = TRUE, sep = ";")
# Convertir las columnas X1, X2 y X3 a numéricas
anexo1$X1 <- as.numeric(gsub(",", ".", anexo1$X1))
anexo1$X2 <- as.numeric(gsub(",", ".", anexo1$X2))
anexo1$X3 <- as.numeric(gsub(",", ".", anexo1$X3))
# Convertir los datos de 'anexo1' en una matriz
dfM <- anexo1 %>% as.matrix()
# Prueba de normalidad multivariada usando el test de Mardia
mvn_test_result <- mvn(dfM, mvnTest = "mardia")
# Mostrar los resultados de normalidad multivariada en una tabla
kable(as.data.frame(mvn_test_result$multivariateNormality))
| Test | Statistic | p value | Result |
|---|---|---|---|
| Mardia Skewness | 3.44263279082527 | 0.969010425206423 | YES |
| Mardia Kurtosis | -0.959974119510589 | 0.337068240452895 | YES |
| MVN | NA | NA | YES |
El test de normalidad de Mardia sugiere que los datos provienen de una poblacion distribuida de manera normal multivariada. Esto implica que hay suficiente informarción para rechazar la hipotesis alternativa (\(H_1: \textbf{X} \nsim \ N(\mu,\Sigma)\)).
\[ 40 \left( \bar{\mathbf{X}} - \begin{bmatrix} 0.1 & -0.2 & 0.05 \end{bmatrix}^t \right)^t \mathbf{S}^{-1} \left( \bar{\mathbf{X}} - \begin{bmatrix} 0.1 & -0.2 & 0.05 \end{bmatrix}^t \right)? \]
Dados los supuestos de \({\mu} = [0.1, −0.2, 0.05]t\), y \(S\) como la matriz de varianzas-covarianzas muestrales, podemos decir que la expresion tiene la siguiente forma: \(n\left(\mathbf{X} - \boldsymbol{\mu}\right)^\top \mathbf{S}^{-1} \left(\mathbf{X} - \boldsymbol{\mu}\right)\), dado el tamaño de muestra \(n = 40\) se puede afirmar que una muestra grande ya que \(n > p\) esto significa que \(S\) converge en probablidad a \(\Sigma\), por ende la expresión sigue aproximadamente una distribución \(\chi^2_{p}\) con \(p = 3\) grados de libertad.
Para determinar cuales son los valores atipicos dentro del conjunto de datos, es apropiado utilizar un “Ajusted Chi-Square Q-Q Plot”.
# Identificación de outliers multivariados usando el método ajustado (adj)
Out <- mvn(anexo1, mvnTest = "mardia", multivariateOutlierMethod = "adj")
Las observaciones 29, 21 y 36 están notoriamente separadas del resto de los datos, lo que indica que estas observaciones son considerablemente diferentes en el espacio multivariado. Esto puede deberse a que estas observaciones tienen valores atípicos en una o más variables.
Protein del paquete
MultBiplotR contienen información sobre datos nutricionales
de 9 diferentes fuentes de proteínas para los habitantes de 25 países
europeos alrededor de 1970:Estos datos fueron colectados inicialmente para entender las diferencias nutricionales entre los países europeos.
Inicialmente se cargarón los datos provenientes de la libreria “MultBiplotR”
# Cargar los datos del objeto Protein
df <- Protein
# Excluir la variable categórica 'Comunist'
df <- df %>% select(-"Comunist")
El vector de medias en el análisis multivariado proporciona el promedio de cada variable, lo que permite centrar los datos para eliminar el efecto de la ubicación de los datos y enfocarse en su variabilidad.
# Calcular el vector de medias muestrales excluyendo la columna 'Region'
kable(colMeans(df %>% select(-"Region")))
| x | |
|---|---|
| Red_Meat | 9.828 |
| White_Meat | 7.896 |
| Eggs | 2.936 |
| Milk | 17.112 |
| Fish | 4.284 |
| Cereal | 32.248 |
| Starch | 4.276 |
| Nuts | 3.072 |
| Fruits_Vegetables | 4.136 |
Cereal (32.248) y Milk (17.112) tienen los valores más altos en comparación con los otros alimentos, lo que sugiere que estos son los productos más consumidos en la dieta promedio de la población analizada. Red_Meat (9.828) y White_Meat (7.896) también muestran un consumo considerable, indicando una presencia significativa de carne en la dieta.
Eggs (2.936), Fish (4.284), y Nuts (3.072) tienen consumos más bajos, lo que podría reflejar que estos alimentos son menos preferidos o menos accesibles en la dieta diaria.
Starch (4.276) y Fruits_Vegetables (4.136) están en un rango medio-bajo, lo que podría sugerir un menor enfoque en carbohidratos y productos frescos en comparación con el consumo de cereales y leche.
Por su lado, la matriz de covarianzas, describe la variabilidad conjunta entre las variables, indicando cómo se correlacionan entre sí. Su analisis es fundamental para entender las relaciones entre las variables, ya que ayuda a identificar patrones y dependencias en los datos.
# Calcular la matriz de covarianzas
kable(cov(df %>% select(-"Region")), format = "latex", digits = 4, booktabs = TRUE) %>%
kable_styling(latex_options = c("scale_down"), full_width = TRUE)
En general, países con dietas ricas en proteínas animales (Red_Meat, White_Meat, Milk) tienden a mostrar covarianzas positivas entre estos grupos de alimentos, sugiriendo una dieta en la que estos alimentos se consumen conjuntamente.
Los países con altos consumos de Starch (almidones) y Cereal tienden a tener un consumo más bajo de alimentos como Nuts y Fruits_Vegetables, lo que puede reflejar diferencias en patrones dietéticos basados en la disponibilidad de alimentos o preferencias culturales.
Los países con un consumo alto de Red_Meat también muestran consumos elevados de otros tipos de carne (White_Meat) y en menor medida de productos como la leche, lo que podría reflejar dietas orientadas a proteínas animales.
# Calcular el vector de medias para cada región
kable(df %>% group_by(Region) %>% summarise_all(mean))
| Region | Red_Meat | White_Meat | Eggs | Milk | Fish | Cereal | Starch | Nuts | Fruits_Vegetables |
|---|---|---|---|---|---|---|---|---|---|
| North | 9.85000 | 7.05000 | 3.150000 | 26.67500 | 8.225000 | 22.67500 | 4.5500 | 1.175000 | 2.125000 |
| Center | 11.17692 | 10.40769 | 3.546154 | 18.34615 | 3.130769 | 28.94615 | 5.0000 | 2.246154 | 4.207692 |
| South | 7.62500 | 4.23750 | 1.837500 | 10.32500 | 4.187500 | 42.40000 | 2.9625 | 5.362500 | 5.025000 |
Diferencias Regionales: Las diferentes regiones muestran patrones distintos de consumo para cada tipo de alimento. Por ejemplo, el North consume más Milk y Fish, mientras que el South tiene un consumo relativamente alto de Fruits_Vegetables y Nuts.
stars(df %>% select(-"Region"),main = "Gráfico de Estrellas para Países", full = TRUE,
scale = TRUE, key.loc = c(1,13),draw.segments = TRUE, cex = 0.7,
mar = c(4, 6, 4, 6) + 0.1)
El gráfico de estrellas revela patrones claros de consumo de alimentos que permiten agrupar países con similitudes dietéticas.
Los países nórdicos como Dinamarca, Finlandia, y Suecia muestran un alto consumo de leche y cereales, mientras que los países mediterráneos como España, Italia y Grecia se destacan por un mayor consumo de carnes rojas y blancas. Los países del Este de Europa, como Bulgaria y Polonia, tienden a una dieta rica en cereales y almidones.
En menor medida paises como Reino Unido, Finalandia, Italia, Noruega y Grecia son los menos consumidores de White_Meat.
Estos patrones sugieren la posibilidad de agrupar los países en categorías basadas en su dieta predominante, proporcionando una base sólida para un análisis más profundo mediante técnicas como clustering o PCA.
El Q-Qplot es una de las herramientas eficaces para verificar la normalidad multivariada porque compara las distancias de Mahalanobis de los datos con una distribución \((X − \mu)^T(\Sigma^{-1})(X − \mu) \sim \chi^2_p\) esperada. Si los datos siguen una distribución normal multivariada, los puntos del gráfico deben alinearse en una línea recta. Desviaciones significativas indican posibles valores atípicos o desviaciones de la normalidad multivariada.
# --- QQplot normal multivariada ---
# Convertir los datos en una matriz y calcular la matriz de covarianza
X <- as.matrix(df %>% select(-"Region"))
S <- cov(df %>% select(-"Region"))
# Calcular las distancias de Mahalanobis
dm <- mahalanobis(X, colMeans(df %>% select(-"Region")), S)
# Generar los cuantiles teóricos para el QQplot
cuantiles <- qchisq(ppoints(nrow(X)), df = ncol(X))
# Crear el QQplot para verificar la normalidad multivariada
qqplot(cuantiles, dm, main = "QQ-Plot de Mahalanobis")
abline(0, 1, col = "red")
En el análisis del Q-Q plot indicaría que la mayoría de los puntos siguen la línea diagonal, los datos probablemente se distribuyen de manera normal multivariada. En el caso generado, se observa que la mayoría de los puntos siguen la línea recta, excepto un par de valores que se categorizan como atípicos, lo que en conjuto nos lleva a poder sospechar normalidad.
El test de Mardia evalúa la normalidad multivariada mediante la asimetría y la curtosis de los datos.
# Prueba de normalidad multivariada usando el test de Mardia
mvnResponse <- mvn(X, mvnTest = "mardia")
kable(mvnResponse$multivariateNormality)
| Test | Statistic | p value | Result |
|---|---|---|---|
| Mardia Skewness | 168.086605971262 | 0.41858425807236 | YES |
| Mardia Kurtosis | -0.523571666842164 | 0.600576492382074 | YES |
| MVN | NA | NA | YES |
Los resultados muestran p-valores altos (0.418 y 0.600), indicando que no se rechaza la hipótesis de normalidad multivariada. Esto sugiere que los datos son adecuados para análisis multivariados que asumen normalidad
Mardia sugiere que los datos parecen provenir de una distribución normal multivariada. Sin embargo, algunas variables como “Cereal”, “Nuts”, y “Fruits_Vegetables” no son univariadamente normales.
# Identificación de outliers multivariados con el método ajustado
Out <- mvn(df %>% select(-"Region"), mvnTest = "mardia", multivariateOutlierMethod = "adj")
España (Spain) como Outlier Extremo: España tiene una distancia cuadrada de Mahalanobis mucho mayor que cualquier otro país, lo que sugiere que, en el espacio multivariado, sus características son muy diferentes comparadas con las de los otros países.
Otros Outliers: Países como Portugal, Italia, Dinamarca, Albania, Francia, Grecia, y Polonia también son outliers, aunque en menor medida. Estos países tienen diferencias significativas en algunas de sus variables multivariadas.
\[ \begin{aligned} H_0 &: \, \mu = \mu_0 \\ H_1 &: \, \mu \neq \mu_0 \end{aligned} \]
donde \(\mu_0 = \begin{bmatrix} 9, & 7, & 2, & 15, & 5, & 30, & 4, & 3, & 4 \end{bmatrix}^\top\)
Comente los resultados
Se realiza una prueba t de Student para comparar las medias de dos grupos y determinar si hay una diferencia significativa entre ellas. Es útil cuando se tiene una sola variable dependiente y se quiere evaluar si las medias de dos muestras difieren significativamente.
Donde \(\mu_0\) es un valor ( No un vector de valores )
# Definir el vector de medias hipotético µ0
mu0 <- c(9, 7, 2, 15, 5, 30, 4, 3, 4)
# Obtener el número de columnas de la matriz
n_cols <- ncol(as.matrix(df %>% select(-"Region")))
# Inicializar un vector para almacenar los valores p
p_values <- numeric(n_cols)
# Realizar la prueba t para cada componente individual utilizando un bucle for
for (i in 1:n_cols) {
p_values[i] <- t.test(as.matrix(df %>% select(-"Region"))[, i], mu = mu0[i])$p.value
}
# Asignar los nombres de las variables a los valores p
names(p_values) <- colnames(as.matrix(df %>% select(-"Region")))
# Mostrar los valores p con kable
knitr::kable(as.data.frame(p_values))
| p_values | |
|---|---|
| Red_Meat | 0.2280914 |
| White_Meat | 0.2370278 |
| Eggs | 0.0003278 |
| Milk | 0.1502482 |
| Fish | 0.3032063 |
| Cereal | 0.3159699 |
| Starch | 0.4067248 |
| Nuts | 0.8576562 |
| Fruits_Vegetables | 0.7095156 |
Eggs (p = 0.0003277511): Este valor p es muy bajo, lo que indica una fuerte evidencia en contra de la hipótesis nula. La media de la variable Eggs es significativamente diferente de su valor en mu0.
Otras variables como Milk, Red_Meat, White_Meat, etc., tienen valores p más altos, lo que sugiere que no hay suficiente evidencia para rechazar la hipótesis nula. Es decir, las medias de estas variables no son significativamente diferentes de sus respectivos valores en \(\mu_0\).
Se require realizar una prueba de Hotelling \(T^2\), está se aplica para comparar las medias de nuestro conjunto de variables multivariadas para comprobar si el vector de medias del grupo de variables se desvía significativamente del vector de medias hipotético.
Donde: \(\mu = [\mu_1,\mu_2,\mu_3,..,\mu_9]^T\) y \(\mu_0 = [9, 7, 2, 15, 5, 30, 4, 3, 4]^T\)
# Repetir el vector de medias hipotético para cada observación en X
mu0_matrix <- matrix(rep(mu0, nrow(as.matrix(df %>% select(-"Region"))))
,nrow = nrow(as.matrix(df %>% select(-"Region"))), byrow = TRUE)
# Realizar la prueba de Hotelling T^2
result <- hotelling.test(as.matrix(df %>% select(-"Region")), mu0_matrix)
# Mostrar los # Mostrar los # Mostrar los resultados de la prueba de Hotelling T^2
print(result)
## Test stat: 64.842
## Numerator df: 9
## Denominator df: 40
## P-value: 2.732e-05
Valor p (2.732e-05): El valor p es extremadamente bajo (mucho menor que 0.05), lo que indica que hay una fuerte evidencia en contra de la hipótesis nula (\(H_0:\mu = \mu_0\)). Es decir, la media multivariada observada es significativamente diferente de la media hipotética.