FA: Escolhendo a matriz de rotação, com base em "Critérios de estrutura simples"


8

Uma das questões mais importantes no uso da análise fatorial é sua interpretação. A análise fatorial geralmente usa rotação fatorial para aprimorar sua interpretação. Após uma rotação satisfatória, a matriz de carga fatorada rotada L ' terá a mesma capacidade de representar a matriz de correlação e pode ser usada como matriz de carga fatorial, em vez da matriz L não rotacionada .

O objetivo da rotação é fazer com que a matriz de carga fatorial rotacionada tenha algumas propriedades desejáveis. Um dos métodos utilizados é rotacionar a matriz de carga fatorial, de modo que a matriz rotacionada tenha uma estrutura simples .

LL Thurstone introduziu o Princípio da Estrutura Simples, como um guia geral para rotação de fatores:

Critérios de estrutura simples:

  1. Cada linha da matriz fatorial deve conter pelo menos um zero
  2. Se houver m fatores comuns, cada coluna da matriz de fatores deve ter pelo menos m zeros
  3. Para cada par de colunas na matriz fatorial, deve haver várias variáveis ​​para as quais as entradas se aproximam de zero em uma coluna, mas não na outra
  4. Para cada par de colunas na matriz de fatores, uma grande proporção das variáveis ​​deve ter entradas próximas de zero nas duas colunas quando houver quatro ou mais fatores
  5. Para cada par de colunas na matriz de fatores, deve haver apenas um pequeno número de variáveis ​​com entradas diferentes de zero nas duas colunas

A estrutura simples ideal é tal que:

  1. cada item tem uma carga alta ou significativa em apenas um fator e
  2. cada fator possui cargas altas ou significativas para apenas alguns dos itens.

O problema é que, ao tentar várias combinações de métodos de rotação juntamente com os parâmetros que cada um aceita (especialmente os oblíquos), o número de matrizes candidatas aumenta e é muito difícil ver qual delas atende melhor aos critérios acima.

Quando enfrentei esse problema, percebi que não conseguia selecionar a melhor correspondência apenas 'olhando' para elas e que precisava de um algoritmo para me ajudar a decidir. Sob o estresse dos prazos do projeto, o máximo que pude fazer foi escrever o código a seguir no MATLAB, que aceita uma matriz de rotação por vez e retorna (sob algumas suposições) se cada critério é atendido ou não. Uma nova versão (se eu tentasse atualizá-la) aceitaria uma matriz 3d (um conjunto de matrizes 2D) como argumento, e o algoritmo retornaria a que melhor se encaixa nos critérios acima.

Como você extrairia um algoritmo desses critérios? Estou apenas pedindo suas opiniões (também acho que houve críticas à utilidade do método por si só) e talvez melhores abordagens para o problema de seleção da matriz de rotação.

Além disso, gostaria de saber qual software você prefere executar FA. Se for R, qual pacote você usa? (Devo admitir que, se eu tivesse que fazer FA, voltaria ao SPSS novamente). Se alguém quiser fornecer algum código, eu preferiria R ou MATLAB.

PS A formulação dos Critérios de Estrutura Simples acima pode ser encontrada no livro "Making Sense of Factor Analysis" de PETT, M., LACKEY, N., SULLIVAN, J.

PS2 (do mesmo livro): "Um teste de análise fatorial bem-sucedida é a extensão em que ela pode reproduzir a matriz corr original. Se você também usou soluções oblíquas, entre todas as opções, selecione aquela que gerou o maior número de fatores mais alto e mais baixo carregamentos ". Isso soa como outra restrição que o algoritmo poderia usar.

PS3 Esta pergunta também foi feita aqui . No entanto, acho que se encaixa melhor neste site.

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

Respostas:


6

O pacote R psych inclui várias rotinas para aplicar a Análise Fatorial (seja baseada em PCA, ML ou FA), mas veja minha breve resenha sobre crantastica . A maioria das técnicas usuais de rotação está disponível, bem como algoritmos baseados em critérios simples de estrutura; você pode dar uma olhada no artigo de W. Revelle sobre este tópico, Estrutura Muito Simples: Um Procedimento Alternativo para Estimar o Número Ideal de Fatores Interpretáveis (MBR 1979 (14)) e a VSS()função.

Muitos autores estão usando rotação ortogonal (VARIMAX), considerando cargas maiores que, digamos 0,3 ou 0,4 (o que equivale a 9 ou 16% da variação explicada pelo fator), pois fornece estruturas mais simples para fins de interpretação e pontuação (por exemplo, em qualidade de pesquisa de vida); outros (por exemplo, Cattell, 1978; Kline, 1979) recomendariam rotações oblíquas, já que "no mundo real, não é razoável pensar que fatores, como importantes determinantes do comportamento, estariam correlacionados" (estou citando Kline, Intelligence. The Psychometric View , 1991, p. 19).

Que eu saiba, os pesquisadores geralmente começam com FA (ou PCA), usando um scree-plot junto com dados simulados (análise paralela) para ajudar a escolher o número certo de fatores. Frequentemente, descobri que a análise de cluster de itens e o VSS complementam muito bem essa abordagem. Quando alguém está interessado em fatores de segunda ordem ou continua com métodos baseados em MEV, obviamente você precisa usar rotação oblíqua e fatorar a matriz de correlação resultante.

Outros pacotes / software:

  • lavaan , para análise de variáveis ​​latentes em R;
  • OpenMx baseado em Mx , um software de uso geral, incluindo um interpretador de álgebra matricial e otimizador numérico para modelagem de equações estruturais.

Referências
1. Cattell, RB (1978). O uso científico da análise fatorial em ciências do comportamento e da vida. Nova York, Plenum.
2. Kline, P. (1979). Psicometria e Psicologia. London, Academic Press.


3

Encontro-me rotineiramente usando análise paralela (O'Connor, 2000). Isso resolve o problema de quantos fatores extrair bem.

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

O'Connor, BP (2000). Programas SPSS e SAS para determinar o número de componentes usando análise paralela e teste MAP da Velicer. Behavior Research Methods, Instrumentation, and Computers, 32, 396-402.


(+1) Encontrei o site da O'Connor há alguns anos e ele tem muitos recursos úteis. É bom que você o vincule aqui.
chl 22/01

3

Eu precisaria da segunda sugestão do pacote psych, que é extremamente útil e tem implementações do MAP e critérios de análise paralela para vários fatores. Na minha própria experiência, descobri que, se você criar soluções de análise fatorial para todos os números entre os retornados pelo MAP e a análise paralela, normalmente poderá encontrar uma solução relativamente ótima.

Eu também enfatizaria o uso do OpenMx para análise fatorial confirmatória, pois parece dar os melhores resultados de todos eles e é muito, muito melhor para matrizes mal comportadas (como as minhas tendem a ser). A sintaxe também é bastante agradável, depois que você se acostuma. O único problema que tenho é que o otimizador não é de código aberto e, portanto, não está disponível no CRAN. Aparentemente, eles estão trabalhando em uma implementação de código aberto do otimizador, para que isso não seja um problema por muito mais tempo.


(+1) Obrigado por compartilhar sua experiência. Eu sempre observei que um bom compromisso é encontrado apenas olhando o gráfico de seixos, considerando a regra de Kayser como um limite inferior e os dados simulados como um limite superior. O que eu gosto psyché que ele exibe gráficos de seixos simulados do PCA e do FA.
chl 22/01

2

Ótima pergunta. Esta não é realmente uma resposta, mas apenas alguns pensamentos.

Na maioria das aplicações em que utilizei a análise fatorial, permitir fatores correlatos faz mais sentido teórico. Eu costumo confiar no método de rotação proxmax. Eu costumava fazer isso no SPSS e agora uso a factanalfunção em R.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.