因子分析を使用する上で最も重要な問題の1つは、その解釈です。因子分析では、解釈を強化するために因子ローテーションがよく使用されます。満足のいく回転の後、回転した因子負荷行列L 'は相関行列を表す同じ機能を持ち、回転していない行列Lの代わりに因子負荷行列として使用できます。
回転の目的は、回転した因子負荷行列にいくつかの望ましい特性を持たせることです。使用される方法の1つは、回転する行列が単純な構造になるように因子負荷行列を回転させることです。
LL Thurstoneは、因子回転の一般的なガイドとして、単純構造の原理を導入しました。
単純な構造基準:
- 因子行列の各行には少なくとも1つのゼロが含まれている必要があります
- 共通因子がm個ある場合、因子行列の各列には少なくともm個のゼロが必要です
- 因子行列の列のすべてのペアについて、1つの列ではエントリがゼロに近づくが、他の列ではエントリに近づかない変数がいくつかあるはずです。
- 因子行列のすべての列のペアについて、4つ以上の因子がある場合、変数の大部分は両方の列でゼロに近いエントリを持つ必要があります
- 因子行列の列のペアごとに、両方の列にゼロ以外のエントリを持つ少数の変数のみが存在する必要があります
理想的なシンプルな構造は次のようなものです。
- 各アイテムには、1つの要素のみで高い、または意味のある負荷があり、
- 各要素には、一部の項目のみの高い、または意味のある負荷があります。
問題は、回転メソッドのいくつかの組み合わせと、それぞれが受け入れるパラメーター(特に、斜めのパラメーターの場合)を試すと、候補行列の数が増え、上記の基準をどれがより適切に満たすかを確認することが非常に難しいことです。
最初にその問題に直面したとき、私はそれらを単に「見る」だけでは最良の一致を選択することができず、決定を助けるためのアルゴリズムが必要であることに気付きました。プロジェクトの締め切りのストレス下で、私ができることのほとんどは、MATLABで次のコードを書くことでした。これは、一度に1つの回転行列を受け入れ、各基準が満たされているかどうかを(いくつかの仮定の下で)返します。新しいバージョン(アップグレードしようとした場合)は、3dマトリックス(2dマトリックスのセット)を引数として受け入れ、アルゴリズムは上記の基準により適合するものを返す必要があります。
これらの基準からアルゴリズムをどのように抽出しますか?私はあなたの意見(メソッド自体の有用性についての批判もあったと思います)とおそらくローテーションマトリックス選択問題へのより良いアプローチを求めています。
また、FAを実行したいソフトウェアを教えてください。Rの場合、どのパッケージを使用しますか?(私がFAをしなければならなかった場合、私は再びSPSSに目を向けることを認めなければなりません)。誰かがコードを提供したい場合は、RまたはMATLABを使用します。
上記PSザ・シンプルな構造基準製剤は、本の中で見つけることができる「因子分析の感覚を作る」 PETT、M.、ラッキー、N.、SULLIVAN、J.によって
PS2(同じ本から):「成功した因子分析のテストは、元のコアマトリックスを再現できる範囲です。斜めの解法も使用した場合は、すべての中で最高および最低因子の最大数を生成したものを選択してください。ローディング。」 これは、アルゴリズムが使用できる別の制約のように聞こえます。
PS3この質問はここでも尋ねられました。しかし、私はそれがこのサイトによりよく合うと思います。
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