factorial.analysis.fnc

Copy, Paste and Adapts

factorial.analysis.fnc(dat, variables=1:25, n.factors=3, type='af', rotation='oblimin', graphic=T)

dat2 = factorial.analysis.fnc(dat, matcor='mi.matriz', n.factors=3,type='af', rotation='oblimin', save.fs=T)

Objetive

Perform factor analysis and principal components (PC) of an array of data on user-defined variables. Orthogonal rotations can be requested: varimax and quartimax and nonorthogonal: oblimin, promax and simplimax. By default the model is estimated from the correlation matrix. The user can request the analysis from the polychoric correlation matrix(ordinal variables in measuring underlying continuous latent variable) or tetrachoric (dichotomous variables).

The database iqitems from library psych (installed by default in the toolbox) contains scores of 1000 subject to 14 questionnaire items SAPA (Synthetic Aperture Personality Assessment).

head(iqitems)

reason.4 reason.16 reason.17 reason.19 letter.7 letter.33 letter.34

5 3 3 6 3 5 3 5

6 3 3 4 4 6 2 4

7 3 4 4 2 6 5 3

8 4 0 6 1 5 1 4

9 0 4 4 5 5 3 3

10 4 4 4 6 6 3 4

Principal Components

Utilizaremos la función factorial.analysis.fnc y dado que no incluimos otros argumentos llevará a cabo un análisis de componentes principales con rotación ortogonal sobre todas las variables de la base de datos iqitems.

factorial.analysis.fnc(iqitems)

Lo que en este ejemplo es idéntico a solicitar:

factorial.analysis.fnc(iqitems,variables=1:14,

type='cp', rotation='varimax')

#---------------------------------------------------------------------------------

# ANALISIS FACTORIAL

#---------------------------------------------------------------------------------

----------------------------------------------------------------------------------

*** WARNING. Tus datos parecen ordinales y tienen menos de 10 valores posibles.

*** Es altamente recomendable que utilices la matriz de correlaciones policorica

*** como matriz de estimacion del modelo. Incluye el argumento policorica=T

----------------------------------------------------------------------------------

-----------------------------------------------------------------------------------

*** Analisis Paralelo para determinar el numero de factores ***

Parallel analysis suggests that the number of factors = 4 and the number of

components = 2

*** Repite el analisis incluyendo el argumento n.factores ***

*** Ej. analisis.factorial.fnc(datos, n.factores=3) ***

-----------------------------------------------------------------------------------

En la salida anterior te informa de que tus datos tienen aparentemente una escala ordinal y te recomienda estimar el modelo a partir de la matriz de correlaciones policórica incluyendo en la siguiente llamada a la función el argumento policoric=T. Puedes ver además que si no incluyes el argumento n.factors (número de factores o componentes a retener) lleva a cabo la técnica conocida como Análisis Paralelo con el objetivo de determinar el número óptimo de componentes o factores a retener. Si observas la figura anterior verás que si vas a realizar una estimación de componentes principales el número adecuado para tus datos es 2, mientras que si vas a realizar un análisis factorial son cuatro. Repetiremos la llamada a la función con los argumentos propuestos.

factorial.analysis.fnc(iqitems,variables=1:14,

type='cp', rotation='varimax', graphic=T,

n.factors=2)

res.factorial.varimax

grafica de correlaciones

grafica de cargas en las comp.

modelo de medida de las comp.

Has podido comprobar que la estimación de la matriz de correlaciones policórica es computacionalmente muy demandante. Una solución mucho mas eficiente y rápida consiste en estimar dicha matriz mediante la función correlation.fnc y utilizar la matriz de salida como input para el análisis factorial mediante la inclusión del argumento matcor.

cor.dat = correlation.fnc(iqitems, variables=1:14,

type='policoric', silent=T)

Fíjate en dos aspectos muy importantes:

1.- Hemos asignado la salida al objeto (nombre arbitrario) cor.dat

2.- Con silent=T pedimos que genere exclusivamente la matriz de correlaciones.

Ahora podemos solicitar el análisis factorial incluyendo dicha matriz en la llamada a la función. Como esta contiene los nombres de las variables a analizar ya no es necesario incluir ese argumento y por supuesto debe omitirse también el argumento policoric (ya la has calculado).

factorial.analysis.fnc(iqitems, matcor=cor.dat,

type='cp', graphic=T,

n.factors=2)

Otra rotación ortogonal que puede solicitarse es quartimax (minimiza el número de componentes necesarias para explicar las variables)

factorial.analysis.fnc(iqitems, matcor=cor.dat,

type='cp', graphic=T,

n.factors=2, rotation='quartimax')

SAVING FACTOR SCORES:

Si deseas guardar las puntuaciones factoriales junto al resto de variables de la base de datos debes incluir el argumento save.fs=T y además deberás asignar la salida de la función al objeto que desees: o la base de datos original u otra de nuevo nombre.

iqitems=factorial.analysis.fnc(iqitems,variables=1:14,

type='cp', rotation='varimax', graphic=T,

n.factors=2, save.fs=T)

Una observación muy importante es que dado que solicitamos las puntuaciones factoriales para cada sujeto, es crítico ASIGNAR la salida de la función a un objeto (en este caso se ha elegido la misma base de datos iqitems).

La salida de esta estimación es obviamente idéntica a la anterior. Solo que ahora además generará un histograma suavizado para cada variable de puntuaciones factoriales generada, donde además se proyectará encima la distribución normal que correspondería a esos datos.

*** Estos son los 6 primeros valores de las variables a analizar ***

*** y de las puntuaciones factoriales generadas y guardadas. ***

iq1 iq8 iq10 iq15 iq20 iq44 iq47 iq2 iq11 iq16 iq32 iq37 iq43 iq49 PC1 PC2

1 4 4 2 2 4 1 1 2 1 4 1 5 1 1 -1.3548365 0.5290798

2 4 1 0 1 4 1 1 5 1 4 3 1 1 1 -1.7984690 0.2869199

3 4 4 3 3 4 1 1 3 1 4 1 1 1 1 -1.1409520 0.3831052

4 4 4 3 1 4 1 1 3 1 4 4 2 1 1 -0.9793961 0.1176616

5 4 4 3 1 4 1 1 3 1 3 1 4 1 1 -1.4034499 0.2936429

6 4 4 1 2 4 1 1 2 6 3 6 5 1 1 1.0479446 -0.8950524

*** Has solicitado guardar las puntuaciones factoriales por sujeto. ***

*** Para que se guarden de hecho asegurate de haber ASIGNADO de forma ***

*** adecuada la salida de esta funcion a un objeto cualquiera. ***

*** Ej. datos=analisis.factorial.fnc(datos, n.factores=3, guarda.pf=T) ***

*********** PULSA C PARA CONTINUAR o A para ABORTAR ***********

DATA SIMULATION FROM EXTERNAL CORRELACION MATRIXS

Una situación muy común es querer reproducir una análisis factorial publicado en un artículo científico a partir de la matriz de correlaciones expuesta en alguna de las tablas de dicho artículo. Esta matriz suele ser la triangular inferior. Vamos a simular esta situación en la que hemos copiado dicha triangular inferior (matriz_triangular.xls) Exel o Calc de OpenOffice. Fíjate que la primera fila está formada por los nombres de las variables que forman la matriz de correlaciones.

correla=read.file.fnc("matriz_triangular.xls")

Matriz triangular inferior Calc LibreOffice

Matriz triangular inferior en Excel

factorial.analysis.fnc(matcor=correla, n.factors=2, graphic=T)

La función construirá la matriz completa de correlación y llevará a cabo el análisis factorial de componentes principales y rotación varimax (se han omitido los argumentos type y rotation). Si deseas crear una muestra aleatoria de tamaño n introduce los argumentos simula=T y n=500 si deseas 500 sujetos (si se omite el argumento n se generará una muestra de 200 registros) y se estimarán las puntuaciones factoriales o de componentes principales para cada uno de los nxp sujetos en la r dimensiones retenidas (La función te recordará que debes asignar entonces la salida a algún objeto).

dat=factorial.analysis.fnc(matcor=correla, n.factors=2,

graphic=T, simula=T, n=500)

NON ORTOGONALS ROTATIONS

Las rotaciones no ortogonales disponibles son: oblimin, promax y simplimax.

factorial.analysis.fnc(iqitems,variables=1:14,

type='cp', rotation='oblimin', graphic=T,

n.factors=2, save.fs=T)

Pedimos componentes principales (estimación por defecto) con rotación no ortogonal (oblícua) de los componentes.

DICOTOMIC VARIABLES

La base de datos dicotomicas.Rdata contiene las respuestas ficticias de 100 sujetos a un cuestionario de 12 items donde las respuestas posibles son Si (1) y No (0). La naturaleza dicotómica de la variable hace sumamente conveniente el uso de la matriz de correlaciones tetracórica y no la correlación de Pearson para estimar el modelo de componentes principales o factorial.

dicotomic=read.file.fnc('dicotomicas.Rdata')

head(dicotomic)

X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12

1 0 0 1 1 0 0 0 0 1 1 0 0

2 1 1 1 1 1 1 1 1 1 1 1 1

3 1 1 0 0 1 1 1 1 0 0 1 1

4 1 0 0 0 1 1 0 0 0 0 1 1

5 1 0 0 0 1 1 0 0 0 1 1 0

6 1 1 1 1 0 0 1 1 1 1 0 0

factorial.analysis.fnc(dicotomic)

--------------------------------------------------------------------------------------

*** WARNING. Tus datos parecen dicotomicos. Es altamente recomendable que utilices ***

*** la matriz de correlaciones tetracorica como matriz de estimacion del modelo ***

*** Incluye el argumento tetracorica=T ***

--------------------------------------------------------------------------------------

Parallel analysis suggests that the number of factors = 3

and the number of components = 3

Nos avisa de que nuestros datos son dicotómicos y nos recomienda incluir el argumento tetracorica=T en la próxima llamada a la función. Además nos sugiere una solución de 3 componentes o de 3 factores si deseamos realizar análisis factorial y no componentes principales. En el gráfico scree de los autovalores que se genera puedes ver claramente los autovalores para nuestros datos frente a los que se generan sobre datos aleatorios (línea puntuada de color rojo).

Repetimos el análisis con las recomendaciónes propuestas.

factorial.analysis.fnc(dicotomic, tetracoric=T,

n.factors=3, graphic=T)

Factorial Analysis (MINRES)

Por su sencillez los usuarios suelen preferir el análisis de componentes principales en su estrategia de reducción de la dimensionalidad multivariada exploratoria. Sin embargo una solución más estable y coherente con el significado que se pretende dar a las combinaciones lineales estimadas: "la variable latente no observable es quien explica la covarianza existente entre las p variables observables" es el análisis factorial mediante ejes principales. El toolbox estima este tipo de modelos incluyendo en la función el argumento type='af'. Recuerda que el análisis paralelo recomendaba una solución con 4 factores para estos datos.

iqitems = factorial.analysis.fnc(iqitems,variables=1:14,

type='af', rotation='oblimin', grafica=T,

n.factors=4, policoric=T, save.fs=T)

res.analisis.factorial.minres