1. El archivo anexo1.csv contiene los datos de una muestra de vectores aleatorios de 3 componentes, X1, X2, …, X40.

a. Evalue la normalidad multivariada de la muestra dada.

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)\)).

b. Si el vector de medias poblacionales es \(\boldsymbol{\mu} = \begin{bmatrix} 0.1 & -0.2 & 0.05 \end{bmatrix}^t\) y \(\mathbf{S}\) es la matriz de varianzas-covarianzas muestrales, ¿cuál es la distribución aproximada de

\[ 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.

c. Usando la distancia cuadrada generalizada establezca si existen valores atípicos.

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.

2. Los datos 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.

a. Determine y analice el vector de medias y la matriz de covarianzas muestrales para las diferentes regiones.

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")

i. Vector de medias

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.

ii. Matriz de covarianzas

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.

b. Calcule la media de las variables por regiones ¿que puede decir al respecto?

# 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.

c. Intente construir grupos de paises usando representaciones pictóricas (gráficos de estrellas o caras de Chernoff).

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.

d. Utilice las herramientas gráficas más adecuadas para verificar normalidad multivariada.

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.

e.Realice la prueba de Mardia para verificar las hipótesis:

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.

f.Verifique si hay outliers (multivariados) e identifíquelos.

# 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.

g.Pruebe las hipótesis

\[ \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

i. Prueba univariada usando t-Student

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\).

ii. Prueba multivariada usando Hotelling’s \(T^2\)

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.