FA:「単純構造基準」に基づく回転行列の選択


8

因子分析を使用する上で最も重要な問題の1つは、その解釈です。因子分析では、解釈を強化するために因子ローテーションがよく使用されます。満足のいく回転の後、回転した因子負荷行列L 'は相関行列を表す同じ機能を持ち、回転していない行列Lの代わりに因子負荷行列として使用できます。

回転の目的は、回転した因子負荷行列にいくつかの望ましい特性を持たせることです。使用される方法の1つは、回転する行列が単純な構造になるように因子負荷行列を回転させることです。

LL Thurstoneは、因子回転の一般的なガイドとして、単純構造の原理を導入しました。

単純な構造基準:

  1. 因子行列の各行には少なくとも1つのゼロが含まれている必要があります
  2. 共通因子がm個ある場合、因子行列の各列には少なくともm個のゼロが必要です
  3. 因子行列の列のすべてのペアについて、1つの列ではエントリがゼロに近づくが、他の列ではエントリに近づかない変数がいくつかあるはずです。
  4. 因子行列のすべての列のペアについて、4つ以上の因子がある場合、変数の大部分は両方の列でゼロに近いエントリを持つ必要があります
  5. 因子行列の列のペアごとに、両方の列にゼロ以外のエントリを持つ少数の変数のみが存在する必要があります

理想的なシンプルな構造は次のようなものです。

  1. 各アイテムには、1つの要素のみで高い、または意味のある負荷があり、
  2. 各要素には、一部の項目のみの高い、または意味のある負荷があります。

問題は、回転メソッドのいくつかの組み合わせと、それぞれが受け入れるパラメーター(特に、斜めのパラメーターの場合)を試すと、候補行列の数が増え、上記の基準をどれがより適切に満たすかを確認することが非常に難しいことです。

最初にその問題に直面したとき、私はそれらを単に「見る」だけでは最良の一致を選択することができず、決定を助けるためのアルゴリズムが必要であることに気付きました。プロジェクトの締め切りのストレス下で、私ができることのほとんどは、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

回答:


6

R psychパッケージには、因子分析(PCAベース、MLベース、またはFAベース)を適用するためのさまざまなルーチンが含まれていますが、crantasticに関する私の短いレビューを参照してください。通常のローテーション手法のほとんどと、単純な構造基準に依存するアルゴリズムを使用できます。このトピックに関するW. Revelleの論文「非常に単純な構造:解釈可能な因子の最適な数を推定するための代替手順(MBR 1979(14))」とそのVSS()関数をご覧になることをお勧めします。

多くの著者は直交回転(VARIMAX)を使用しています。たとえば、0.3または0.4(これは、因子によって説明される分散の9または16%に相当します)よりも高い負荷を考慮しています。生命研究の); 他の人(例えば、Cattell、1978、Kline、1979)は、「現実の世界では、行動の重要な決定要因としての要因が相関していると考えることは不合理ではない」(私はKline、Intelligenceを引用しています)。心理測定図、1991、p。19)。

私の知る限りでは、研究者は一般にFA(またはPCA)から始め、適切な数の因子を選択するのに役立つシミュレーションデータ(並列分析)と共にスクリープロットを使用します。アイテムクラスタ分析とVSSは、このようなアプローチをうまく補完することがよくありました。2次因子に関心がある場合、またはSEMベースの方法を続行する場合は、明らかに斜め回転を使用して、結果の相関行列を除外する必要があります。

その他のパッケージ/ソフトウェア:

  • lavaan、Rの潜在変数分析用。
  • OpenMxMxに基づいています。これは、構造方程式モデリング用の行列代数インタープリターと数値オプティマイザーを含む汎用ソフトウェアです。

参考文献
1. Cattell、RB(1978)。行動科学および生命科学における因子分析の科学的使用。ニューヨーク、プレナム。
2. Kline、P.(1979)。心理測定学と心理学。ロンドン、学術出版局。


3

私は日常的に並列分析を使用しています(O'Connor、2000)。これは、いくつの要素をうまく抽出するかという問題を解決します。

参照:https : //people.ok.ubc.ca/brioconn/nfactors/nfactors.html

O'Connor、BP(2000)。並列分析とVelicerのMAPテストを使用してコンポーネントの数を決定するためのSPSSおよびSASプログラム。Behavior Research Methods、Instrumentation、and Computers、32、396-402。


(+1)数年前にO'Connorのウェブサイトに出会いましたが、そこには多くの有用なリソースがあります。ここにリンクしてください。
chl

3

私は2番目のchlによるpsychパッケージの提案をしなければなりません。これは非常に有用であり、MAPの実装といくつかの要因の並列分析基準があります。私自身の経験では、MAPと並列分析によって返された数値の間のすべての数値について因子分析ソリューションを作成すると、通常は比較的最適なソリューションを見つけられることがわかりました。

OpenMxを確認因子分析に使用することも2番目に考えます。これは、それらすべての中で最良の結果が得られるようであり、(私の傾向として)動作不良のマトリックスに対してはるかに優れているためです。使い慣れた構文は非常に優れています。私が持っている唯一の問題は、オプティマイザがオープンソースではないため、CRANでは利用できないことです。どうやら彼らはオプティマイザのオープンソース実装に取り​​組んでいるので、それがずっと問題になることはないでしょう。


(+1)あなたの経験を共有してくれてありがとう。カイザーの法則を下限、シミュレーションしたデータを上限として、スクリープロットを見ただけで良い妥協点が見つかることがよくありました。私が気に入っているのpsychは、PCAとFAの両方からのシミュレートされたスクリープロットが表示されることです。
chl

2

すばらしい質問です。これは実際には答えではなく、いくつかの考えです。

私が因子分析を使用したほとんどのアプリケーションでは、相関する因子を許可することはより理論的に理にかなっています。私はプロキシマックス回転法に依存する傾向があります。以前はSPSSでこれを行っていましたが、今factanalではR の関数を使用しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.