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:
- Cada linha da matriz fatorial deve conter pelo menos um zero
- Se houver m fatores comuns, cada coluna da matriz de fatores deve ter pelo menos m zeros
- 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
- 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
- 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:
- cada item tem uma carga alta ou significativa em apenas um fator e
- 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