Se realiza un estudio de analisis de las variables que influyen en los sueldos de los trabajadores en una empresa.
Las variables a estudiar son la siguientes :
Asumimos que las variables provienen de una Distribución Normal Multivariante.
Actividad previa: iniciamos el entorno R y referenciando a librerias:
# Para limpiar el workspace, por si hubiera algun dataset
# o informacion cargada
rm(list = ls())
#Referenciando el paquete de matrices
library(MASS)
#Referenciando el paquete de multivariado
#install.packages("MVN",dependencies = TRUE )
library(MVN)
#Refenciando el paquete para verificar si matriz es definida positiva
library(matrixcalc)
Definimos una Población Normal Bivariada, verificando que la matriz de varianzas y covarianzas sea simétrica y definida positiva.
#----CREANDO LA POBLACION BIVARIADA
#Numero de variables y cantidad de observaciones
N = 500000
p = 2
n = 50
#Creando el vector de medias poblacional
U = matrix(c(2191.149915 ,4.662904),nrow = p, ncol = 1)
U
## [,1]
## [1,] 2191.149915
## [2,] 4.662904
#Creando la matriz de varianzas y covarianzas
V = matrix(c(2711321.073,3083.095,3083.095,19.265652),nrow = p, ncol = p)
V
## [,1] [,2]
## [1,] 2711321.073 3083.09500
## [2,] 3083.095 19.26565
#Validando matriz V sea simetrica y definida postiva
if (identical(V,t(V))==TRUE) {
print("La Matriz es Simétrica")
} else {
print("La Matriz es No es Simétrica")
}
## [1] "La Matriz es Simétrica"
if (is.positive.definite(V) == TRUE ){
print("La Matriz es Definida Positiva")
} else {
print("La Matriz es No es Definida Positiva")
}
## [1] "La Matriz es Definida Positiva"
Generamos la Población Norma Bivariada de tamaño N = 500000 y mostramos el histrograma de cada una de variables
# Configuramos la semilla de generación de aleatorios
set.seed(1)
#Generamos la población de tamaño N
T = mvrnorm(N,U, V)
head(T)
## [,1] [,2]
## [1,] 3222.6695 10.122491
## [2,] 1888.7639 1.899650
## [3,] 3567.0967 12.188312
## [4,] -435.6548 2.597481
## [5,] 1648.5805 3.154567
## [6,] 3542.1378 8.609249
hist(T[,1],main= 'Histograma X1', xlab = 'X1', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(T[,1]),col="red")
hist(T[,2],main= 'Histograma X2', xlab = 'X2', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(T[,2]),col="blue")
Se observa que el histograma de las variables X1 y X2 de la población corresponde a una curva normal.
Generamos la muestra de tamaño 50 y mostramos la 6 primeras fila
#----TOMANDO UNA MUESTRA LA POBLACION BIVARIADA
set.seed(1)
M = T[sample(1:N,n,replace=F),]
head(M)
## [,1] [,2]
## [1,] 3693.467 2.894912
## [2,] 3556.567 2.646271
## [3,] 1815.180 4.514337
## [4,] 5401.018 8.109380
## [5,] 2751.476 13.715344
## [6,] 4789.793 8.244346
hist(M[,1],main= 'Histograma X1', xlab = 'X1', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(M[,1]),col="red")
hist(M[,2],main= 'Histograma X2', xlab = 'X2', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(M[,2]),col="blue")
Nótese que los histogramas de las variables X1 y X2 generan curvas con sesgo casi central y platicurticas.
#Vector de medias
X = colMeans(M)
X
## [1] 2260.339743 3.580762
#Matriz de covarianza
S = cov(M)
S
## [,1] [,2]
## [1,] 2694302.361 3962.82720
## [2,] 3962.827 27.94453
#Matriz de correlación
R = cor(M)
R
## [,1] [,2]
## [1,] 1.0000000 0.4567027
## [2,] 0.4567027 1.0000000
#Varianza Generalizada
det(S)
## [1] 59587001
Se puede observar que el vector de medias muestral y la varianza muestral se aproxima a la poblacional.
#Distancia de Mahalanobis
d2M = mahalanobis(M,X,S)
d2M
## [1] 1.11520280 0.98856857 0.18762054 3.66137952 4.09522481 2.41491810
## [7] 2.70910131 0.45073511 0.63122462 1.52050375 0.08057830 5.37136960
## [13] 4.22788572 2.94342195 0.29869836 3.43480427 0.84886851 0.22911557
## [19] 4.51562444 1.75165558 2.98391768 0.56158553 2.08816149 5.48021547
## [25] 1.45510552 2.56131254 4.17112404 1.19968343 1.39104025 8.11952927
## [31] 0.24971625 2.43437395 0.49110722 1.99030073 0.00900876 2.06269587
## [37] 3.35918597 1.97441073 0.14127664 1.32462682 0.49980885 3.83529424
## [43] 2.42966178 0.79789307 1.48547771 1.75234713 0.15845717 0.52605287
## [49] 0.04886660 0.94126100
#Multinormalidad Test gráfico Q-Q Plot
plot(qchisq(((1:nrow(M)) - 1/2)/nrow(M),df=p),sort( d2M ) )
abline(a=0, b=1,col="red")
Graficamente se visualiza que el cuadrado de la distancia de Mahalanobis se ajusta una distribución Chi2, en consecuencia es muy probable que la muestra provenga de una distribución normal multivariada.
#Multinormalidad Test Sesgo de Mardia
mvn(M,subset = NULL,mvn = "mardia", covariance = FALSE,showOutliers = FALSE)
## $multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 1.54300753341728 0.818996887825243 YES
## 2 Mardia Kurtosis -1.08908015020925 0.276118542449808 YES
## 3 MVN <NA> <NA> YES
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Shapiro-Wilk Column1 0.9900 0.9467 YES
## 2 Shapiro-Wilk Column2 0.9769 0.4304 YES
##
## $Descriptives
## n Mean Std.Dev Median Min Max
## 1 50 2260.339743 1641.433021 2142.05963 -1223.733866 5841.97542
## 2 50 3.580762 5.286258 3.17326 -7.945419 16.18597
## 25th 75th Skew Kurtosis
## 1 1105.026297 3532.06353 0.03492158 -0.6403271
## 2 1.249477 7.35956 0.08734077 -0.1038849
Es Test indica que la muestra proviene de una distribución normal. Tanto el Test de Sesgo indica como el Test de Kurtosis indican que provienen de una distribución normal.
#----CREANDO LA POBLACION BIVARIADA
#Numero de variables y cantidad de observaciones
N = 500000
p = 4
n = 250
f = 0.3
#Creando el vector de medias poblacional
U = matrix(c(2191.149915,4.662904,33.434251 ,18.896082 ),nrow = p, ncol = 1)
U
## [,1]
## [1,] 2191.149915
## [2,] 4.662904
## [3,] 33.434251
## [4,] 18.896082
#Creando la matriz de varianzas y covarianzas
V = matrix( ,nrow = p, ncol = p)
V[1,1] = 2711321.073
V[1,2] = 3083.095
V[1,3] = 7904.764
V[1,4] = 1503.618
V[2,1] = 3083.095
V[2,2] = 19.265652
V[2,3] = 20.088258
V[2,4] = 1.881349
V[3,1] = 7904.764
V[3,2] = 20.088258
V[3,3] = 60.720102
V[3,4] = 4.917222
V[4,1] = 1503.618
V[4,2] = 1.881349
V[4,3] = 4.917222
V[4,4] = 4.185428
V
## [,1] [,2] [,3] [,4]
## [1,] 2711321.073 3083.095000 7904.764000 1503.618000
## [2,] 3083.095 19.265652 20.088258 1.881349
## [3,] 7904.764 20.088258 60.720102 4.917222
## [4,] 1503.618 1.881349 4.917222 4.185428
#Validando matriz V sea simetrica y definida postiva
if (identical(V,t(V))==TRUE) {
print("La Matriz es Simétrica")
} else {
print("La Matriz es No es Simétrica")
}
## [1] "La Matriz es Simétrica"
if (is.positive.definite(V) == TRUE ){
print("La Matriz es Definida Positiva")
} else {
print("La Matriz es No es Definida Positiva")
}
## [1] "La Matriz es Definida Positiva"
Se verifica que la matriz de varianza y covarianza s simetrica y definida postiva.
Generamos una población normal multivariado de tamano N = 500000 y mostramos el histograma de cada una de las variables.
#Generamos la población de tamaño N
set.seed(1)
T = mvrnorm(N,U, V)
hist(T[,1],main= 'Histograma X1', xlab = 'X1', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(T[,1]),col="red")
hist(T[,2],main= 'Histograma X2', xlab = 'X2', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(T[,2]),col="blue")
hist(T[,3],main= 'Histograma X3', xlab = 'X3', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(T[,3]),col="green")
hist(T[,4],main= 'Histograma X4', xlab = 'X4', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(T[,4]),col="yellow")
Observamos que las variables X1, X2, X3 y X4 se ajustan a una curva normal.
#----TOMANDO UNA MUESTRA LA POBLACION BIVARIADA
set.seed(1)
M = T[sample(1:N,n,replace=F),]
head(M)
## [,1] [,2] [,3] [,4]
## [1,] 688.8541 -2.226566 25.05052 17.70339
## [2,] 825.7563 2.533415 23.38260 16.32519
## [3,] 2567.1176 5.396072 34.89823 19.09926
## [4,] -1018.7171 3.638471 22.60512 17.87042
## [5,] 1630.7713 9.617298 44.40410 19.04934
## [6,] -407.4966 7.333977 24.63084 16.69613
hist(M[,1],main= 'Histograma X1', xlab = 'X1', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(M[,1]),col="red")
hist(M[,2],main= 'Histograma X2', xlab = 'X2', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(M[,2]),col="blue")
hist(M[,3],main= 'Histograma X3', xlab = 'X3', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(M[,3]),col="red")
hist(M[,4],main= 'Histograma X4', xlab = 'X4', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(M[,4]),col="blue")
Se observa que las variables X1, X2, X3 y X4 se aproximan a una curva normal sin llegar a serlo.
#Vector de medias
X = colMeans(M)
X
## [1] 2238.18857 4.93132 33.55510 19.01999
#Matriz de covarianza
S = cov(M)
S
## [,1] [,2] [,3] [,4]
## [1,] 2295195.555 2004.830954 6159.164084 1173.723213
## [2,] 2004.831 16.028448 16.120738 1.333562
## [3,] 6159.164 16.120738 56.276155 3.513265
## [4,] 1173.723 1.333562 3.513265 4.088677
#Matriz de correlación
R = cor(M)
R
## [,1] [,2] [,3] [,4]
## [1,] 1.0000000 0.3305386 0.5419381 0.3831461
## [2,] 0.3305386 1.0000000 0.5367561 0.1647313
## [3,] 0.5419381 0.5367561 1.0000000 0.2316100
## [4,] 0.3831461 0.1647313 0.2316100 1.0000000
G = det(S)
G
## [1] 3612572274
El vector de medias y varianza muestral se aproxima a la poblacional.
#Distancia de Mahalanobis
d2M = mahalanobis(M,X,S)
head(d2M)
## [1] 3.4515009 2.9854564 0.0552654 5.2213606 4.3882178 5.8336460
#Multinormalidad Test gráfico Q-Q Plot
plot(qchisq(((1:nrow(M)) - 1/2)/nrow(M),df=p),sort( d2M ) )
abline(a=0, b=1,col="red")
Graficamente se visualiza que el cuadrado de la distancia de Mahalanobis se aproxima una distribución Chi2, en consecuencia es muy probable que la muestra provenga de una distribución normal multivariada.
#Multinormalidad Test gráfico Q-Q Plot
mvn(M,subset = NULL,mvn = "mardia", covariance = FALSE,showOutliers = FALSE)
## $multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 10.6908018656011 0.953850190417407 YES
## 2 Mardia Kurtosis -0.976249029472967 0.328941071829227 YES
## 3 MVN <NA> <NA> YES
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Shapiro-Wilk Column1 0.9953 0.6483 YES
## 2 Shapiro-Wilk Column2 0.9950 0.5961 YES
## 3 Shapiro-Wilk Column3 0.9928 0.2621 YES
## 4 Shapiro-Wilk Column4 0.9939 0.4029 YES
##
## $Descriptives
## n Mean Std.Dev Median Min Max
## 1 250 2238.18857 1514.990282 2275.283940 -1568.809816 6036.80154
## 2 250 4.93132 4.003554 5.282085 -6.573834 16.11905
## 3 250 33.55510 7.501743 33.815368 17.006538 54.88107
## 4 250 19.01999 2.022048 19.062111 14.408722 24.41366
## 25th 75th Skew Kurtosis
## 1 1155.774426 3273.49718 -0.007446467 -0.3599870
## 2 2.227946 7.60682 -0.112476801 -0.2425099
## 3 28.249977 38.63460 0.130933546 -0.3212622
## 4 17.598079 20.52005 0.050267033 -0.5221880
Es Test indica que la muestra proviene de una distribución normal.Tanto en el Test de Sesgo y el de Test de Kurtosis indica que si.
#Contaminando el f=30% de la muestra
a = matrix(,nrow = n*f, ncol = p)
a[,1] = sample(1:1000,1,replace=FALSE)
a[,2] = sample(1:5,1,replace=FALSE)
a[,3] = sample(1:30,1,replace=FALSE)
a[,4] = sample(1:10,1,replace=FALSE)
head(a)
## [,1] [,2] [,3] [,4]
## [1,] 472 3 27 10
## [2,] 472 3 27 10
## [3,] 472 3 27 10
## [4,] 472 3 27 10
## [5,] 472 3 27 10
## [6,] 472 3 27 10
#seleccionado las filas a contamina
set.seed(1)
i= sample(1:n,n*f,replace=FALSE)
i
## [1] 249 68 167 129 162 215 43 14 210 187 51 225 85 21 106 182 74
## [18] 7 73 79 213 37 105 217 110 165 34 236 126 89 172 207 33 84
## [35] 163 70 234 42 166 111 148 156 20 44 121 87 245 206 40 220 25
## [52] 119 198 122 39 179 230 134 24 160 243 130 45 146 22 115 104 204
## [69] 183 184 103 75 13 202 176
#Copiamos la matriz de datos
MC = M
#Contaminamos
MC[i,] = M[i,] + a
#Verificamos la correcta contaminación
head(MC - M)
## [,1] [,2] [,3] [,4]
## [1,] 0 0 0 0
## [2,] 0 0 0 0
## [3,] 0 0 0 0
## [4,] 0 0 0 0
## [5,] 0 0 0 0
## [6,] 0 0 0 0
hist(MC[,1],main= 'Histograma X1', xlab = 'X1', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(MC[,1]),col="red")
hist(MC[,2],main= 'Histograma X2', xlab = 'X2', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(MC[,2]),col="blue")
hist(MC[,3],main= 'Histograma X3', xlab = 'X3', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(MC[,3]),col="red")
hist(MC[,4],main= 'Histograma X4', xlab = 'X4', ylab = 'Densidad',probability = TRUE,breaks = 100)
lines(density(MC[,4]),col="blue")
Se puede observar que algunas variables contaminadas son bimodales o asimetricas, por lo tanto distan de ser normales.
#Vector de medias
XC = colMeans(MC)
XC
## [1] 2379.78857 5.83132 41.65510 22.01999
#Matriz de covarianza
SC = cov(MC)
SC
## [,1] [,2] [,3] [,4]
## [1,] 2326526.738 2283.376613 8469.37845 1985.809675
## [2,] 2283.377 18.303570 35.34664 8.177476
## [3,] 8469.378 35.346641 218.05757 60.941188
## [4,] 1985.810 8.177476 60.94119 24.435641
#Matriz de correlación
RC = cor(MC)
RC
## [,1] [,2] [,3] [,4]
## [1,] 1.0000000 0.3499094 0.3760209 0.2633733
## [2,] 0.3499094 1.0000000 0.5594930 0.3866691
## [3,] 0.3760209 0.5594930 1.0000000 0.8348596
## [4,] 0.2633733 0.3866691 0.8348596 1.0000000
#varianza Global
GC = det(SC)
GC
## [1] 37813649762
#Distancia de Mahalanobis
d2MC = mahalanobis(MC,XC,SC)
head(d2MC)
## [1] 3.8119923 1.9655878 0.4384603 5.6893067 3.1971435 5.8565515
#Multinormalidad Test gráfico Q-Q Plot
plot(qchisq(((1:nrow(MC)) - 1/2)/nrow(MC),df=p),sort( d2MC ) )
abline(a=0, b=1,col="red")
#Multinormalidad Test Sesgo de Mardia
mvn(MC,subset = NULL,mvn = "mardia", covariance = FALSE,showOutliers = FALSE)
## $multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 32.334380087388 0.0398630569740468 NO
## 2 Mardia Kurtosis -1.72584981794673 0.084374434663089 YES
## 3 MVN <NA> <NA> NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Shapiro-Wilk Column1 0.9953 0.6428 YES
## 2 Shapiro-Wilk Column2 0.9960 0.7689 YES
## 3 Shapiro-Wilk Column3 0.9287 <0.001 NO
## 4 Shapiro-Wilk Column4 0.8974 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max
## 1 250 2379.78857 1525.295623 2402.578874 -1568.809816 6508.80154
## 2 250 5.83132 4.278267 6.027674 -6.573834 17.15741
## 3 250 41.65510 14.766773 37.528879 17.546708 75.73119
## 4 250 22.01999 4.943242 20.343486 14.505751 34.41366
## 25th 75th Skew Kurtosis
## 1 1257.241562 3356.558444 0.05433157 -0.3020213
## 2 3.185285 8.707033 -0.06662191 -0.2269379
## 3 29.565471 53.599932 0.57951416 -0.8315993
## 4 18.218991 26.725507 0.69431288 -0.8196847
Es Test Mardia indica que la muestra contaminada no se ajusta a una Distribucion Nornal Multivariada.
Para generar una Población Normal Multivariada se debe verificar que la matriz de varianza y covariaza sea simetrica y definida positiva.
El Test de Mardia es más potente cuando el tamaño de la muestra es más grande.
El Test gráfico no es 100% concluyente cuando la d2M se ajusta a la Chi2.
El test de Mardia requiere que tanto es Test de Sesgo como el Test de Kurtosis No Rechacen Ho para concluir que la muestra proviene de una Distribución Normal Multivariado.