FA: Elección de la matriz de rotación, basada en "Criterios de estructura simple"

8

Una de las cuestiones más importantes al usar el análisis factorial es su interpretación. El análisis factorial a menudo usa la rotación de factores para mejorar su interpretación. Después de una rotación satisfactoria, el factor de carga girada matriz L' tendrá la misma capacidad para representar la matriz de correlación y puede ser utilizado como la matriz de factor de carga, en vez de la matriz sin girar L .

El propósito de la rotación es hacer que la matriz de carga del factor rotado tenga algunas propiedades deseables. Uno de los métodos utilizados es rotar la matriz de carga de factores de manera que la matriz rotada tenga una estructura simple .

LL Thurstone presentó el Principio de Estructura Simple, como una guía general para la rotación de factores:

Criterios de estructura simple:

  1. Cada fila de la matriz de factores debe contener al menos un cero
  2. Si hay m factores comunes, cada columna de la matriz de factores debe tener al menos m ceros
  3. Para cada par de columnas en la matriz de factores, debe haber varias variables para las cuales las entradas se acercan a cero en una columna pero no en la otra
  4. Para cada par de columnas en la matriz de factores, una gran proporción de las variables debe tener entradas cercanas a cero en ambas columnas cuando hay cuatro o más factores
  5. Para cada par de columnas en la matriz de factores, debe haber solo un pequeño número de variables con entradas distintas de cero en ambas columnas

La estructura simple ideal es tal que:

  1. cada elemento tiene una carga alta o significativa solo en un factor y
  2. cada factor tiene cargas altas o significativas para solo algunos de los elementos.

El problema es que, al probar varias combinaciones de métodos de rotación junto con los parámetros que cada uno acepta (especialmente para los oblicuos), aumenta el número de matrices candidatas y es muy difícil ver cuál cumple mejor los criterios anteriores.

Cuando me enfrenté a ese problema por primera vez, me di cuenta de que no podía seleccionar la mejor coincidencia simplemente "mirándolos" y que necesitaba un algoritmo que me ayudara a decidir. Bajo el estrés de los plazos del proyecto, lo máximo que pude hacer fue escribir el siguiente código en MATLAB, que acepta una matriz de rotación a la vez y devuelve (bajo algunos supuestos) si cada criterio se cumple o no. Una nueva versión (si alguna vez intentara actualizarla) aceptaría una matriz 3d (un conjunto de matrices 2d) como argumento, y el algoritmo debería devolver la que mejor se ajuste a los criterios anteriores.

¿Cómo extraerías un algoritmo de esos criterios? Solo pido sus opiniones (también creo que ha habido críticas sobre la utilidad del método en sí mismo) y quizás mejores enfoques para el problema de selección de la matriz de rotación.

Además, me gustaría saber qué software prefiere realizar FA. Si es R, ¿qué paquete usas? (Debo admitir que si tuviera que hacer FA, volvería a SPSS nuevamente). Si alguien quiere proporcionar algún código, preferiría R o MATLAB.

PD La formulación de Criterios de Estructura Simple anterior se puede encontrar en el libro "Making Sense of Factor Analysis" de PETT, M., LACKEY, N., SULLIVAN, J.

PS2 (del mismo libro): "Una prueba de análisis factorial exitoso es la medida en que puede reproducir la matriz corr original. Si también usó soluciones oblicuas, entre todas seleccione la que generó la mayor cantidad de factor más alto y más bajo cargas ". Esto suena como otra restricción que el algoritmo podría usar.

PS3 Esta pregunta también se ha hecho aquí . Sin embargo, creo que encaja mejor en este sitio.

function [] = simple_structure_criteria (my_pattern_table)
%Simple Structure Criteria
%Making Sense of Factor Analysis, page 132

disp(' ');
disp('Simple Structure Criteria (Thurstone):');
disp('1. Each row of the factor matrix should contain at least one zero');
disp( '2. If there are m common factors, each column of the factor matrix should have at least m zeros');
disp( '3. For every pair of columns in the factor matrix, there should be several variables for which entries approach zero in the one column but not in the other');
disp( '4. For every pair of columns in the factor matrix, a large proportion of the variables should have entries approaching zero in both columns when there are four or more factors');
disp( '5. For every pair of columns in the factor matrix, there should be only a small number of variables with nonzero entries in both columns');
disp(' ');
disp( '(additional by Pedhazur and Schmelkin) The ideal simple structure is such that:');
disp( '6. Each item has a high, or meaningful, loading on one factor only and');
disp( '7. Each factor have high, or meaningful, loadings for only some of the items.');

disp('')
disp('Start checking...')

%test matrix
%ct=[76,78,16,7;19,29,10,13;2,6,7,8];
%test it by giving: simple_structure_criteria (ct)

ct=abs(my_pattern_table);

items=size(ct,1);
factors=size(ct,2);
my_zero = 0.1;
approach_zero = 0.2;
several = floor(items / 3);
small_number = ceil(items / 4);
large_proportion = 0.30;
meaningful = 0.4;
some_bottom = 2;
some_top = floor(items / 2);

% CRITERION 1
disp(' ');
disp('CRITERION 1');
for i = 1 : 1 : items
    count = 0;
    for j = 1 : 1 : factors
        if (ct(i,j) < my_zero)
            count = count + 1;
            break
        end
    end
    if (count == 0)
        disp(['Criterion 1 is NOT MET for item ' num2str(i)])
    end
end


% CRITERION 2
disp(' ');
disp('CRITERION 2');
for j = 1 : 1 : factors 
    m=0;
    for i = 1 : 1 : items
        if (ct(i,j) < my_zero)
            m = m + 1;
        end
    end
    if (m < factors)
        disp(['Criterion 2 is NOT MET for factor ' num2str(j) '. m = ' num2str(m)]);
    end
end

% CRITERION 3
disp(' ');
disp('CRITERION 3');
for c1 = 1 : 1 : factors - 1
    for c2 = c1 + 1 : 1 : factors
        test_several = 0;
        for i = 1 : 1 : items
            if ( (ct(i,c1)>my_zero && ct(i,c2)<my_zero) || (ct(i,c1)<my_zero && ct(i,c2)>my_zero) ) % approach zero in one but not in the other
                test_several = test_several + 1;
            end
        end
        disp(['several = ' num2str(test_several) ' for factors ' num2str(c1) ' and ' num2str(c2)]);
        if (test_several < several)
            disp(['Criterion 3 is NOT MET for factors ' num2str(c1) ' and ' num2str(c2)]);
        end
    end
end

% CRITERION 4
disp(' ');
disp('CRITERION 4');
if (factors > 3)
    for c1 = 1 : 1 : factors - 1
        for c2 = c1 + 1 : 1 : factors
            test_several = 0;
            for i = 1 : 1 : items
                if (ct(i,c1)<approach_zero && ct(i,c2)<approach_zero) % approach zero in both
                    test_several = test_several + 1;
                end
            end
            disp(['large proportion = ' num2str((test_several / items)*100) '% for factors ' num2str(c1) ' and ' num2str(c2)]);
            if ((test_several / items) < large_proportion)
                pr = sprintf('%4.2g',  (test_several / items) * 100 );
                disp(['Criterion 4 is NOT MET for factors ' num2str(c1) ' and ' num2str(c2) '. Proportion is ' pr '%']);
            end
        end
    end
end

% CRITERION 5
disp(' ');
disp('CRITERION 5');
for c1 = 1 : 1 : factors - 1
    for c2 = c1 + 1 : 1 : factors
        test_number = 0;
        for i = 1 : 1 : items
            if (ct(i,c1)>approach_zero && ct(i,c2)>approach_zero) % approach zero in both
                test_number = test_number + 1;
            end
        end
        disp(['small number = ' num2str(test_number) ' for factors ' num2str(c1) ' and ' num2str(c2)]);
        if (test_number > small_number)
            disp(['Criterion 5 is NOT MET for factors ' num2str(c1) ' and ' num2str(c2)]);
        end
    end
end

% CRITERION 6
disp(' ');
disp('CRITERION 6');
for i = 1 : 1 : items
    count = 0;
    for j = 1 : 1 : factors
        if (ct(i,j) > meaningful)
            count = count + 1;
        end
    end
    if (count == 0 || count > 1)
        disp(['Criterion 6 is NOT MET for item ' num2str(i)])
    end
end

% CRITERION 7
disp(' ');
disp('CRITERION 7');
for j = 1 : 1 : factors 
    m=0;
    for i = 1 : 1 : items
        if (ct(i,j) > meaningful)
            m = m + 1;
        end
    end
    disp(['some items = ' num2str(m) ' for factor ' num2str(j)]);
    if (m < some_bottom || m > some_top)
        disp(['Criterion 7 is NOT MET for factor ' num2str(j)]);
    end
end
disp('')
disp('Checking completed.')
return
George Dontas
fuente

Respuestas:

6

El paquete R psych incluye varias rutinas para aplicar el Análisis Factorial (ya sea basado en PCA, ML o FA), pero vea mi breve reseña sobre fantástico . La mayoría de las técnicas de rotación habituales están disponibles, así como algoritmos basados ​​en criterios de estructura simple; es posible que desee echar un vistazo al artículo de W. Revelle sobre este tema, Estructura muy simple: un procedimiento alternativo para estimar el número óptimo de factores interpretables (MBR 1979 (14)) y la VSS()función.

Muchos autores están utilizando la rotación ortogonal (VARIMAX), considerando cargas superiores a, digamos 0.3 o 0.4 (lo que equivale a 9 o 16% de la varianza explicada por el factor), ya que proporciona estructuras más simples para fines de interpretación y puntuación (por ejemplo, en calidad de investigación de la vida); otros (por ejemplo, Cattell, 1978; Kline, 1979) recomendarían rotaciones oblicuas ya que "en el mundo real, no es irracional pensar que los factores, como determinantes importantes del comportamiento, estarían correlacionados" (estoy citando a Kline, Intelligence. The Psychometric View , 1991, p. 19).

Que yo sepa, los investigadores generalmente comienzan con FA (o PCA), usando un diagrama de pantalla junto con datos simulados (análisis paralelo) para ayudar a elegir el número correcto de factores. A menudo encontré que el análisis de agrupamiento de ítems y VSS complementan muy bien dicho enfoque. Cuando uno está interesado en los factores de segundo orden, o para continuar con métodos basados ​​en SEM, entonces obviamente necesita usar la rotación oblicua y factorizar la matriz de correlación resultante.

Otros paquetes / software:

  • lavaan , para análisis de variables latentes en R;
  • OpenMx basado en Mx , un software de propósito general que incluye un intérprete de álgebra matricial y un optimizador numérico para el modelado de ecuaciones estructurales.

Referencias
1. Cattell, RB (1978). El uso científico del análisis factorial en ciencias del comportamiento y de la vida. Nueva York, Plenum.
2. Kline, P. (1979). Psicometría y psicología. Londres, Academic Press.

chl
fuente
3

Me encuentro rutinariamente usando análisis paralelos (O'Connor, 2000). Esto resuelve el problema de cuántos factores extraer bien.

Ver: https://people.ok.ubc.ca/brioconn/nfactors/nfactors.html

O'Connor, BP (2000). Programas SPSS y SAS para determinar el número de componentes utilizando análisis paralelos y la prueba MAP de Velicer. Métodos de investigación de comportamiento, instrumentación y computadoras, 32, 396-402.


fuente
(+1) Me encontré con el sitio web de O'Connor hace algunos años y tiene muchos recursos útiles. Es bueno que lo vincules aquí.
chl
3

Tendría que secundar la sugerencia de chl del paquete psicológico, es extremadamente útil y tiene implementaciones del MAP y criterios de análisis paralelos para varios factores. En mi propia experiencia, he descubierto que si crea soluciones de análisis factorial para todos los números entre los devueltos por MAP y el análisis paralelo, normalmente puede encontrar una solución relativamente óptima.

También recomendaría el uso de OpenMx para el análisis factorial confirmatorio, ya que parece dar los mejores resultados de todos ellos, y es mucho, mucho mejor para las matrices con mal comportamiento (como lo es el mío). La sintaxis también es bastante agradable, una vez que te acostumbras. El único problema que tengo con él es que el optimizador no es de código abierto y, por lo tanto, no está disponible en CRAN. Aparentemente están trabajando en una implementación de código abierto del optimizador, por lo que puede no ser un problema por mucho más tiempo.

richiemorrisroe
fuente
(+1) Gracias por compartir tu experiencia. A menudo observé que se encuentra un buen compromiso simplemente mirando el diagrama de pantalla mientras se considera la regla de Kayser como un límite inferior y los datos simulados como un límite superior. Lo que me gusta psyches que muestra gráficos de pantalla simulados de PCA y FA.
chl
2

Gran pregunta Esta no es realmente una respuesta, sino solo unos pocos pensamientos.

En la mayoría de las aplicaciones donde he usado el análisis factorial, permitir factores correlacionados tiene más sentido teórico. Tiendo a confiar en el método de rotación proxmax. Solía ​​hacer esto en SPSS y ahora uso la factanalfunción en R.

Jeromy Anglim
fuente