En la practica anterior se uso la base de datos sunspots, la cual contenía los números mensuales promedio relativos de manchas solares desde 1749 hasta 1983. Recolectados en el Observatorio Federal Suizo, Zurich hasta 1960, y luego en el Observatorio Astronómico de Tokio.
Para esta muestra de la función, no se usará la anterior, ya que las variables solo corresponden a los meses del año y puede ser muy redundante las agrupaciones de los meses, a menos que indiquen temporalidades del año pero, para estas mediciones y esta base, no se da este caso.
Para este ejemplo, se usará la base de datos psych::bfi; el correspondiente paquete ya esta incluido en la misma carga del archivo donde se encuentran las funciones para este análisis.
la base bfi contiene 25 elementos de autoinforme de personalidad tomados del Grupo Internacional de Artículos de Personalidad (ipip.ori.org) como parte del proyecto de evaluación de la personalidad basado en la Evaluación de la Apertura Sintética (SAPA).2800 sujetos son incluidos y también se incluyen tres variables demográficas adicionales (sexo, educación y edad).
Para este análisis, se altarará la base original para que se tenga un mejor entendimiento de las variables en juego.
source("RFA.R")
source("ProfilingV2.R")
bfi_data <- bfi
bfi_data <- bfi_data %>%
rename(
indifferent_feelings=A1,
ask_welfare= A2,
know_comfort=A3,
love_children=A4,
make_feel_at_ease=A5,
exacting_work=C1,
continue_to_perfect=C2,
according_to_plan=C3,
things_halfway_manner=C4,
waste_my_time=C5,
not_talk_a_lot=E1,
difficult_to_approach_others=E2,
know_captivate_people=E3,
make_friends_easily=E4,
take_charge=E5,
get_angry_easily=N1,
get_irritated_easily=N2,
frequent_mood_swings=N3,
often_feel_blue=N4,
panic_easily=N5,
full_of_ideas=O1,
difficult_reading=O2,
conversation_to_higher_level=O3,
reflecting_on_things=O4,
will_not_probe_subject=O5
)
bfi_data %>% head(10)
De manera rápida, un análisis exploratorio sobre esta nueva base
Profiling$general_view
Entonces, las restantes son variables numéricas:
Profiling$First_glance_numerical
Realmente no hay mucho que decir de manera general; la mayoría tiene un 2.5% de datos únicos, casi todas las variables tienen valores perdidos; omitiendo la edad, educación y genero, había un escala del 1 al 6 para todas las preguntas y la mayoría de las personas a las que se le realizo el estudio tenían 20 años.
Profiling$missin_numbers
Profiling$missin_percent
Como ya vimos, existen valores perdidos, y como estos representan menos del 1% de los datos, omitiremos estas observaciones, al menos para continuar con el análisis de factores, que es lo que nos interesa esta vez.
Finalmente, para ver la relación que tienen las variables entre si, se da un correlograma.
Profiling$correlogram
Las preguntas no se relacionaban directamente con otras y si tenían relación, al menos lineal, era muy poca para todas las variables.
Pero, entre algunas variables se tienen correlaciones mayores a .30 y solo entre ellas.
datos <- bfi_data[complete.cases(bfi_data),]
Apartir de aquí, se tienen los resultados de las funciones de RFA.R
Hay dos funciones en RFA.R:
fa_general(datos, Estimate, n_factors, Factor_scores)datos: datos con los que se van a trabajarEstimate: Método de estimación de los parámetros (pueden ser Método de ejes principales ó máxima verosimilitud)n_factors: Número de factores que proponemosFactor_scores: Método del cálculo de scores o puntuaciones que tiene cada variable sobre el factor (pueden ser por regresión ó Bartlett)by_rotation(factor_analysis, n_factors)factor_analysis: recibe algún tipo de análisis de factores dado por la función anterior, uno por cada rotación none, varimax, quartimax y obliminPrimero, se muestran algunas estadísticas y pruebas para determinar si es factible usar un análisis de factores.
Determinante de la matriz de correlación: Si este determinante está cercano a cero, indicará que existe una estructura de correlación considerable entre las variables, y el análisis factorial puede ser aplicado.
Prueba de esfericidad de Bartlett: Esta prueba, a groso modo, determina que la matriz de correlación sea distinta a la identidad; hay que notar que esta prueba asume que las variables tienen una distribución normal multivariada, por lo que a veces se usa solo como referencia.
primer_intento <- fa_general(datos = datos, Estimate = params$Estimate, n_factors = params$N_factors, Factor_scores = params$Factor_scores)
primer_intento$test$d_Bar
Para este caso, el determinante nos indica que hay una correlación considerable entre las variables por lo que hacer este tipo de análisis resulta benéfico para encontrar las variables latentes.
Ahora, veamos que lo relacionado a la prueba de Bartlett, se dan valores no favorables, pero hay que recordar que no necesariamente las variables pueden tener una distribución normal bivariada.
primer_intento$test$KMO
Como vemos, todas las variables, tal vez excepto para el nivel educativo, tienen un índice alto, y de manera general se tiene un buen indicador de que las variables están correlacionadas, por lo que, nuevamente, un análisis de factores resulta adecuado para esta base.
Se da ahora el estadístico y p-value de una prueba de bondad y ajuste (\(\chi_2\)) aunque hay que recordar que la prueba asume que la matriz de datos X tiene una distribución normal multivariada, por lo que hay que tener cuidado, y tal vez solo tomar como referencia, con los resultados de esta prueba y posiblemente considerar a este como un buen indicador pero no estricto sobre el modelo.
primer_intento$Goodness_of_fit
Al igual que paso con la prueba de esfericidad de Bartlett, esta prueba de bondad y ajuste falla por el supuesto de normalidad multivariada.
Dado que en las rotaciones no se modifica la comunalidad de cada variable, es decir, la rotación no se ha corregido de la solución factorial; Aunque la matriz factorial cambia, las especificidades no cambian y, en consecuencia, las comunidades permanecen invariantes. Sin embargo, la varianza explicada por cada uno de los factores cambia al cambiar la rotación y, por lo tanto, los nuevos factores se ordenan de acuerdo a la información de su varianza.
primer_intento$Commonality
Las variables que menos se relacionan con las demás son la edad, el nivel educativo y el género, por lo que no sería de sorprender que estas variables no se tomen en cuenta para la elección de las variables que crearan cada variable latente.
Ahora, para cada tipo de rotación, hacemos un heatmap, a manera de que nos ayude a distinguir cuál es la mejor rotación para este modelo y nos ayude a tener un mejor agrupamiento de las variables.
primer_intento$heatmaps$N_Vari
primer_intento$heatmaps$Q_Obli
Con estos Heatmaps, podemos notar que las mejores rotaciones son varimax y oblimin, las cuales producen, visualmente, un mejor agrupamiento de los datos; pero varimax proporciona una mejor interpretación de las variables latentes:
Lo siguiente, dan un análisis por cada tipo de rotación. Aunque, de manera general:
Recordemos que los loadings nos ayudan a ver que tan relacionado esta la variable con el factor
segundo <- by_rotation(factor_analysis = primer_intento$fanalysis$none, n_factors = params$N_factors)
segundo$loadings %>% as_data_frame() %>% mutate(Observation = row_number())
segundo$V_Explication %>% as_data_frame() %>% mutate(Type = row.names(segundo$V_Explication))
Una representación gráfica de parte de lo anterior
segundo$Graph_variances
Ya considerando que los factores representan las variables latentes en el modelo, se dan los puntajes sobre cada observación
segundo$scores
Los eigenvalores son la suma de columnas de los loadings al cuadrado por cada factor, conceptualmente representa esa cantidad de variación explicada por un factor. Además algunos autores sugieren como un método de elección sobre el número de factores, que los valores propios son mayores que 1
segundo$eigen_values
## PA1 PA2 PA3 PA4 PA5
## 4.5615065 2.3143862 1.5742451 1.3161565 0.9718885
Recordemos que los loadings nos ayudan a ver que tan relacionado esta la variable con el factor
segundo <- by_rotation(factor_analysis = primer_intento$fanalysis$varimax, n_factors = params$N_factors)
segundo$loadings %>% as_data_frame() %>% mutate(Observation = row_number())
segundo$V_Explication %>% as_data_frame() %>% mutate(Type = row.names(segundo$V_Explication))
Una representación gráfica de parte de lo anterior
segundo$Graph_variances
Ya considerando que los factores representan las variables latentes en el modelo, se dan los puntajes sobre cada observación
segundo$scores
Los eigenvalores son la suma de columnas de los loadings al cuadrado por cada factor, conceptualmente representa esa cantidad de variación explicada por un factor. Además algunos autores sugieren como un método de elección sobre el número de factores, que los valores propios son mayores que 1
segundo$eigen_values
## PA1 PA2 PA3 PA5 PA4
## 2.816006 2.740265 2.015708 1.647376 1.518828
Recordemos que los loadings nos ayudan a ver que tan relacionado esta la variable con el factor
segundo <- by_rotation(factor_analysis = primer_intento$fanalysis$quartimax, n_factors = params$N_factors)
segundo$loadings %>% as_data_frame() %>% mutate(Observation = row_number())
segundo$V_Explication %>% as_data_frame() %>% mutate(Type = row.names(segundo$V_Explication))
Una representación gráfica de parte de lo anterior
segundo$Graph_variances
Ya considerando que los factores representan las variables latentes en el modelo, se dan los puntajes sobre cada observación
segundo$scores
Los eigenvalores son la suma de columnas de los loadings al cuadrado por cada factor, conceptualmente representa esa cantidad de variación explicada por un factor. Además algunos autores sugieren como un método de elección sobre el número de factores, que los valores propios son mayores que 1
segundo$eigen_values
## PA1 PA2 PA3 PA4 PA5
## 3.291912 2.740763 1.933393 1.555447 1.216669
Recordemos que los loadings nos ayudan a ver que tan relacionado esta la variable con el factor
segundo <- by_rotation(factor_analysis = primer_intento$fanalysis$oblimin, n_factors = params$N_factors)
segundo$loadings %>% as_data_frame() %>% mutate(Observation = row_number())
segundo$V_Explication %>% as_data_frame() %>% mutate(Type = row.names(segundo$V_Explication))
Una representación gráfica de parte de lo anterior
segundo$Graph_variances
Ya considerando que los factores representan las variables latentes en el modelo, se dan los puntajes sobre cada observación
segundo$scores
Los eigenvalores son la suma de columnas de los loadings al cuadrado por cada factor, conceptualmente representa esa cantidad de variación explicada por un factor. Además algunos autores sugieren como un método de elección sobre el número de factores, que los valores propios son mayores que 1
segundo$eigen_values
## PA2 PA1 PA3 PA5 PA4
## 2.637058 2.437153 2.106274 1.877047 1.680650