Eines der wichtigsten Probleme bei der Verwendung der Faktoranalyse ist ihre Interpretation. Die Faktoranalyse verwendet häufig eine Faktorrotation, um ihre Interpretation zu verbessern. Nach einer zufriedenstellenden Drehung hat die gedrehte Faktorladematrix L ' die gleiche Fähigkeit, die Korrelationsmatrix darzustellen, und sie kann anstelle der nicht gedrehten Matrix L als Faktorladematrix verwendet werden .
Der Zweck der Rotation besteht darin, dass die gedrehte Faktor-Ladematrix einige wünschenswerte Eigenschaften aufweist. Eine der verwendeten Methoden besteht darin, die Faktorladematrix so zu drehen, dass die gedrehte Matrix eine einfache Struktur aufweist .
LL Thurstone führte das Prinzip der einfachen Struktur als allgemeinen Leitfaden für die Faktorrotation ein:
Einfache Strukturkriterien:
- Jede Zeile der Faktormatrix sollte mindestens eine Null enthalten
- Wenn es m gemeinsame Faktoren gibt, sollte jede Spalte der Faktormatrix mindestens m Nullen haben
- Für jedes Spaltenpaar in der Faktormatrix sollten mehrere Variablen vorhanden sein, für die Einträge in der einen Spalte gegen Null gehen, in der anderen jedoch nicht
- Für jedes Spaltenpaar in der Faktormatrix sollte ein großer Teil der Variablen Einträge haben, die in beiden Spalten gegen Null gehen, wenn vier oder mehr Faktoren vorhanden sind
- Für jedes Spaltenpaar in der Faktormatrix sollte es nur eine kleine Anzahl von Variablen mit Einträgen ungleich Null in beiden Spalten geben
Die ideale einfache Struktur ist so, dass:
- Jeder Gegenstand hat eine hohe oder bedeutungsvolle Belastung nur für einen Faktor und
- Jeder Faktor hat nur für einige der Elemente hohe oder sinnvolle Belastungen.
Das Problem ist, dass beim Ausprobieren mehrerer Kombinationen von Rotationsmethoden zusammen mit den Parametern, die jede akzeptiert (insbesondere für schräge), die Anzahl der Kandidatenmatrizen zunimmt und es sehr schwierig ist zu erkennen, welche die oben genannten Kriterien besser erfüllt.
Als ich zum ersten Mal mit diesem Problem konfrontiert wurde, stellte ich fest, dass ich nicht in der Lage war, die beste Übereinstimmung auszuwählen, indem ich sie nur "ansah", und dass ich einen Algorithmus brauchte, der mir bei der Entscheidung half. Unter dem Druck der Projektfristen konnte ich höchstens den folgenden Code in MATLAB schreiben, der jeweils eine Rotationsmatrix akzeptiert und (unter bestimmten Annahmen) zurückgibt, ob jedes Kriterium erfüllt ist oder nicht. Eine neue Version (falls ich jemals versuchen würde, sie zu aktualisieren) würde eine 3D-Matrix (eine Reihe von 2D-Matrizen) als Argument akzeptieren, und der Algorithmus sollte diejenige zurückgeben, die den oben genannten Kriterien besser entspricht.
Wie würden Sie einen Algorithmus aus diesen Kriterien extrahieren? Ich frage nur nach Ihrer Meinung (ich denke auch, dass die Nützlichkeit der Methode an sich kritisiert wurde) und vielleicht nach besseren Ansätzen für das Problem der Auswahl der Rotationsmatrix.
Außerdem würde ich gerne wissen, welche Software Sie bevorzugen, um FA durchzuführen. Wenn es R ist, welches Paket verwenden Sie? (Ich muss zugeben, wenn ich FA machen müsste, würde ich mich wieder an SPSS wenden). Wenn jemand Code bereitstellen möchte, würde ich R oder MATLAB bevorzugen.
PS Die obige Formulierung für einfache Strukturkriterien findet sich in dem Buch "Making Sense of Factor Analysis" von PETT, M., LACKEY, N., SULLIVAN, J.
PS2 (aus demselben Buch): "Ein Test für eine erfolgreiche Faktoranalyse ist das Ausmaß, in dem die ursprüngliche Korrelationsmatrix reproduziert werden kann. Wenn Sie auch schräge Lösungen verwendet haben, wählen Sie unter allen diejenige aus, die die größte Anzahl des höchsten und niedrigsten Faktors generiert hat Ladungen. " Dies klingt nach einer weiteren Einschränkung, die der Algorithmus verwenden könnte.
PS3 Diese Frage wurde auch hier gestellt . Ich denke jedoch, dass es besser auf diese Seite passt.
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