La base de datos se puede descargar aquí notasestudiantes

library(openxlsx) #Librería que interactúa con MSExcel
library(corrplot) #Librería para el gráfico de correlaciones
## corrplot 0.84 loaded
library(corrr) #Otra opción de librería para el cálculo y gráfico de correlaciones
## Warning: package 'corrr' was built under R version 4.0.3
library(readxl)
estudiantes <- read_excel("E:/notasestudiantes.xlsx")
## New names:
## * `` -> ...1
View(estudiantes)
matriz_correlaciones<-cor(estudiantes[,2:6], use = "pairwise.complete.obs")
matriz_correlaciones
##                   CienciasNaturales Matematicas  Geografia Literatura    Fisica
## CienciasNaturales         1.0000000  0.65614980 0.49706742  0.4203412 0.5839847
## Matematicas               0.6561498  1.00000000 0.09908375  0.2295101 0.3171157
## Geografia                 0.4970674  0.09908375 1.00000000  0.8133904 0.8408104
## Literatura                0.4203412  0.22951010 0.81339038  1.0000000 0.7662285
## Fisica                    0.5839847  0.31711567 0.84081035  0.7662285 1.0000000
corrplot(cor(estudiantes[,2:6]), order = "hclust", tl.col='black', tl.cex=1) #Gráfico de las correlaciones

estudiantes_correlaciones <- correlate(estudiantes[,2:6])  #Cálculo de un objeto de correlaciones
## 
## Correlation method: 'pearson'
## Missing treated using: 'pairwise.complete.obs'
rplot(estudiantes_correlaciones, legend = TRUE, colours = c("firebrick1", "black", 
    "darkcyan"), print_cor = TRUE)  #Opción gráfica de las correlaciones
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.
## Don't know how to automatically pick scale for object of type noquote. Defaulting to continuous.

## PROCESO DEL ANÁLISIS FACTORIAL:

Aquí vamos a empezar con las pruebas estadísticas antes de empezar con el AF:

# Se puede conocere la presencia de multicolinealidad al evaluar la
# Determinante de la matriz de correlaciones de las variables ingresadas al
# estudio:
det(matriz_correlaciones)
## [1] 0.02585506

EXPLICACIÓN:

Un determinante bajo, es decir, cercano a 0, indica alta multicolinealidad entre las variables. De ser igual a cero (matriz no singular), esto indicaría que algunas de las variables son linealmente dependientes y no se podrían realizar ciertos cálculos necesarios para los procedimientos multivariados. En este caso observamos que es muy cercano a 0, lo que sugiere un alto nivel de colinealidad en el conjunto de variables involucradas en la matriz.

#Por consiguiente vamos a ubicar el cálculo de los estimadores del Test de Bartlett y el MSA(KMO):
bartlett.test(estudiantes)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  estudiantes
## Bartlett's K-squared = 130.27, df = 5, p-value < 2.2e-16

Ahora bien la explicación del Test de Bartlett es muy similar a la prueba Chi Cuadrado, es decir a valores pequeños de K-squared expresa que existe una homogeneidad en las varianzas y por lo consiguiente existen un buen número de correlaciones positivas entre las variables y el p-valor y se puede corroborarlo fijando un \(H_0\): Las varianzas son homogéneas (correlaciones aceptables), con un alfa=0.05. Otra explicación es que dicho test proporciona la probabilidad de que la matriz de correlación de las variables sea una matriz identidad.

NOTA IMPORTANTE: Las variables que intervienen para el cálculo del Test de Bartlett son provenientes de una distribución Chi Cuadrado.

# Test MSA o KMO:
library(psych)
KMO(estudiantes[,2:6])
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = estudiantes[, 2:6])
## Overall MSA =  0.67
## MSA for each item = 
## CienciasNaturales       Matematicas         Geografia        Literatura 
##              0.65              0.42              0.63              0.76 
##            Fisica 
##              0.81

La medida de adecuación de la muestra MSA o KMO (Kaiser-Meyer-Olkin) contrasta si las correlaciones parciales entre las variables son suficientemente pequeñas. El estadístico KMO varía entre 0 y 1. Los valores pequeños indican que el análisis factorial puede no ser una buena idea, dado que las correlaciones entre los pares de variables no pueden ser explicadas por otras variables. Los menores que 0.5 indican que no debe utilizarse el AF con la matriz de datos que se están analizando

Popularmente para el AF existe la librería stats que es propia del R Base

library(stats)  #Librería del sistema base
# Por consiguiente vamos a ubicar el cálculo de los estimadores del Test de
# Bartlett y el MSA(KMO)

fac=factanal(estudiantes[,2:6], factors = 2, rotation = "varimax")

NOTA IMPORTANTE: Para la elección de los factores propios de un AF bastará con seleccionar 2, y a partir de este número hacer las pruebas necesarias de acuerdo al Prueba Chi Cuadrado que me arroja el output, debido a que esta prueba estadística me determinará si son suficientes o no el número de factores.

INTERPRETACIÓN:

UNICIDAD (Uniquenesses): Es el porcentaje de varianza que no ha sido explicada por el Factor y es igual a: 1 - Comunalidad.

COMUNALIDAD (Loadings-Saturaciones): Porcentaje de la variabilidad de la variable explicada por ese Factor.

FACTOR1 - FACTOR2: Algebraicamente, un factor se estima mediante una combinación lineal de variables observadas. Cuando se encuentran los factores de “mejor ajuste”, debe recordarse que estos factores no son únicos. Se puede demostrar que cualquier rotación de los factores que mejor se ajuste es también el mejor factor. La rotación de factores se utiliza para ajustar la varianza que explicará el Factor.

Si todos los factores explican conjuntamente un gran porcentaje de varianza en una variable dada, esa variable tiene una alta comunalidad (y por lo tanto una singularidad baja)

SS loadings: La saturación acumulada

Proportion Var: Proporción de la varianza

Cumulative Var: Varianza acumulada

CÁLCULO DE LAS PUNTUACIONES: Ahora es importante saber que existen puntuaciones o pesos que son considerados como las saturaciones por cada observación de las variables ingresadas al cálculo del AF:

factanal(estudiantes[,2:6], factors = 2, rotation = "varimax", scores = "regression")$scores
##          Factor1    Factor2
##  [1,] -0.5519388  1.0606318
##  [2,]  0.2411859 -0.5732179
##  [3,] -0.4972764  0.2544335
##  [4,] -0.6054475  1.8438539
##  [5,]  0.4209731  0.2270842
##  [6,]  0.5043295 -1.3738132
##  [7,] -0.4325901 -0.5341611
##  [8,] -0.6535761  0.2583643
##  [9,]  1.1234432 -0.6066717
## [10,]  0.4024976 -0.5683468
## [11,] -0.6351005  1.0537954
## [12,] -1.4041747 -0.4933694
## [13,]  0.1815116  0.2241785
## [14,]  2.1319789  0.9433987
## [15,] -0.5097811  1.0525619
## [16,] -1.3269838 -2.0800924
## [17,]  1.5007289 -1.4031279
## [18,]  1.2312461  0.1814214
## [19,] -1.4463324 -0.4852995
## [20,]  0.3253066  1.0183762

EXPLICACIÓN: Y son estos valores que podrán tomarse como el peso para el cálculo de un índice que explica por cada i-ésima fila la variabilidad de todo el conjunto de datos, pero necesamiente tendrán que ser normalizados con la siguiente fórmula:

\[ Normalizacion=\frac{X_{ij}-X_{min}}{X_{max}-X_{min}}\]

puntuaciones <- factanal(estudiantes[,2:6], factors = 2, rotation = "none", scores = "regression")$scores
estudiantes <- cbind(estudiantes[,2:6], puntuaciones)
estudiantes$Factor1 <- round(((estudiantes$Factor1 - min(estudiantes$Factor1))/(max(estudiantes$Factor1) - 
    min(estudiantes$Factor1))), 2)
estudiantes
hist(estudiantes$Factor1, freq = TRUE, main = "Gráfico de la Distribución del Factor 1", 
    xlab = "Factor 1", ylab = "Frecuencia", col = "#009ACD")

DETERMINAR EL NÚMERO DE FACTORES

Una decisión crucial en el AF es determinar el número de factores a extraerse. El paquet nFactors ofrece un conjunto de rutinas para direccionar esta decisión. Desde luego, cualquier solución factorial debe ser interpretable para ser de utilidad.

library(nFactors)
## Warning: package 'nFactors' was built under R version 4.0.5
## Loading required package: lattice
## 
## Attaching package: 'nFactors'
## The following object is masked from 'package:lattice':
## 
##     parallel
ev <- eigen(cor(estudiantes[,2:6])) # Obtención de los autovalores
ap <- parallel(subject=nrow(estudiantes[,2:6]),var=ncol(estudiantes[,2:6]),rep=100,cent=.05)
nS <- nScree(x=ev$values, aparallel=ap$eigen$qevpea)
plotnScree(nS,xlab = "Número de Componentes",ylab = "Autovalores",
           main = "Solución por autovalores para determinar
           el número de factores o componentes")

#LIBRERIAS
library(readxl)
library(GPArotation)
## Warning: package 'GPArotation' was built under R version 4.0.3
library(Matrix)
library(nFactors)
library(paran)
## Warning: package 'paran' was built under R version 4.0.5
## Loading required package: MASS
library(descr)
## Warning: package 'descr' was built under R version 4.0.5
library(foreign)
library(psych)
library(haven)
library(MVN)
## Warning: package 'MVN' was built under R version 4.0.3
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## sROC 0.1-2 loaded
library(openxlsx)
library(readxl)
library(tidyverse)
## -- Attaching packages ---------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.3     v dplyr   1.0.2
## v tidyr   1.1.2     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts ------------------------------------------------- tidyverse_conflicts() --
## x ggplot2::%+%()   masks psych::%+%()
## x ggplot2::alpha() masks psych::alpha()
## x tidyr::expand()  masks Matrix::expand()
## x dplyr::filter()  masks stats::filter()
## x dplyr::lag()     masks stats::lag()
## x tidyr::pack()    masks Matrix::pack()
## x dplyr::select()  masks MASS::select()
## x tidyr::unpack()  masks Matrix::unpack()
library(psych)
fap=fa.parallel(cor(estudiantes[,2:6]),fa="fa",cor = "cor")
## Warning in fa.parallel(cor(estudiantes[, 2:6]), fa = "fa", cor = "cor"): It
## seems as if you are using a correlation matrix, but have not specified the
## number of cases. The number of subjects is arbitrarily set to be 100
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.

## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.
## Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : An
## ultra-Heywood case was detected. Examine the results carefully
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.
## Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : An
## ultra-Heywood case was detected. Examine the results carefully

## Parallel analysis suggests that the number of factors =  2  and the number of components =  NA
fap
## Call: fa.parallel(x = cor(estudiantes[, 2:6]), fa = "fa", cor = "cor")
## Parallel analysis suggests that the number of factors =  2  and the number of components =  NA 
## 
##  Eigen Values of 
## 
##  eigen values of factors
## [1]  3.42  0.30 -0.01 -0.04 -0.26
## 
##  eigen values of simulated factors
## [1]  0.74  0.16  0.06 -0.05 -0.16
## 
##  eigen values of components 
## [1] 3.57 1.05 0.24 0.14 0.00
## 
##  eigen values of simulated components
## [1] NA
#library(psych)
#fa.diagram(fac,nfactors=2, e.size=.05,rsize=4.5)
paran(estudiantes[,2:6], iterations=5000,graph=TRUE,color=TRUE, width=1000, height=1000) 
## 
## Using eigendecomposition of correlation matrix.
## Computing: 10%  20%  30%  40%  50%  60%  70%  80%  90%  100%
## 
## 
## Results of Horn's Parallel Analysis for component retention
## 5000 iterations, using the mean estimate
## 
## -------------------------------------------------- 
## Component   Adjusted    Unadjusted    Estimated 
##             Eigenvalue  Eigenvalue    Bias 
## -------------------------------------------------- 
## 1           2.885990    3.569581      0.683590
## -------------------------------------------------- 
## 
## Adjusted eigenvalues > 1 indicate dimensions to retain.
## (1 components retained)

modelo_varimax<-fa(matriz_correlaciones,nfactors = 2,rotate = "varimax",
              fa="minres")
fa.diagram(modelo_varimax)

print(modelo_varimax$loadings,cut=0) 
## 
## Loadings:
##                   MR1   MR2  
## CienciasNaturales 0.438 0.640
## Matematicas       0.039 0.997
## Geografia         0.974 0.073
## Literatura        0.814 0.173
## Fisica            0.861 0.297
## 
##                  MR1   MR2
## SS loadings    2.546 1.527
## Proportion Var 0.509 0.305
## Cumulative Var 0.509 0.815
print(fac$loadings,cut=0)
## 
## Loadings:
##                   Factor1 Factor2
## CienciasNaturales 0.463   0.638  
## Matematicas       0.043   0.997  
## Geografia         0.978   0.057  
## Literatura        0.819   0.194  
## Fisica            0.846   0.282  
## 
##                Factor1 Factor2
## SS loadings      2.560   1.521
## Proportion Var   0.512   0.304
## Cumulative Var   0.512   0.816
print(modelo_varimax)
## Factor Analysis using method =  minres
## Call: fa(r = matriz_correlaciones, nfactors = 2, rotate = "varimax", 
##     fa = "minres")
## Standardized loadings (pattern matrix) based upon correlation matrix
##                    MR1  MR2   h2     u2 com
## CienciasNaturales 0.44 0.64 0.60 0.3990 1.8
## Matematicas       0.04 1.00 1.00 0.0042 1.0
## Geografia         0.97 0.07 0.95 0.0461 1.0
## Literatura        0.81 0.17 0.69 0.3070 1.1
## Fisica            0.86 0.30 0.83 0.1712 1.2
## 
##                        MR1  MR2
## SS loadings           2.55 1.53
## Proportion Var        0.51 0.31
## Cumulative Var        0.51 0.81
## Proportion Explained  0.63 0.37
## Cumulative Proportion 0.63 1.00
## 
## Mean item complexity =  1.2
## Test of the hypothesis that 2 factors are sufficient.
## 
## The degrees of freedom for the null model are  10  and the objective function was  3.66
## The degrees of freedom for the model are 1  and the objective function was  0.1 
## 
## The root mean square of the residuals (RMSR) is  0.02 
## The df corrected root mean square of the residuals is  0.07 
## 
## Fit based upon off diagonal values = 1
## Measures of factor score adequacy             
##                                                    MR1 MR2
## Correlation of (regression) scores with factors   0.98   1
## Multiple R square of scores with factors          0.97   1
## Minimum correlation of possible factor scores     0.93   1
fac$uniquenesses
## CienciasNaturales       Matematicas         Geografia        Literatura 
##        0.37805342        0.00500000        0.03984286        0.29101097 
##            Fisica 
##        0.20519019
fac$loadings
## 
## Loadings:
##                   Factor1 Factor2
## CienciasNaturales 0.463   0.638  
## Matematicas               0.997  
## Geografia         0.978          
## Literatura        0.819   0.194  
## Fisica            0.846   0.282  
## 
##                Factor1 Factor2
## SS loadings      2.560   1.521
## Proportion Var   0.512   0.304
## Cumulative Var   0.512   0.816
modelo_varimax$communalities
## CienciasNaturales       Matematicas         Geografia        Literatura 
##         0.6009843         0.9950000         0.9539002         0.6929323 
##            Fisica 
##         0.8287368