Amos の Factor score

Amos では回帰推定法による因子得点(潜在変数得点)を計算するための回帰係数を算出することができる.因子得点は出力された回帰係数と観測変数との線形結合である.
通常,因子得点は平均0,分散は因子と観測変数との重相関係数2乗に基準化される.因子分析モデルでは因子の分散は1であるが,データとモデルが完全に一致しない限り「推定された」(あるいは回帰予測された)因子得点の分散は1より小さく,重相関係数2乗となる.この事情は重回帰分析における予測値の分散と同じである.

SASやSPSSが出力する重み係数(Amosのマニュアルでは回帰係数とかウエートなどと呼んでいる)は,平均0,分散1に基準化した観測変数にかけるべき数値である.その結果は平均0,分散SMCの因子得点を得る.

Amosが出力する係数はSASやSPSSとは異なり,平均を引いた観測変数にかけるべき係数である.つまり共分散行列を基礎にした係数となっている(SASやSPSSは相関行列を基礎にしていることになる).

Amosで因子得点を求めるときに注意すべきことがある.モデル識別のための制約の仕方によって重み係数が異なることである(ただし,両者の因子得点は同値である).Amosのデフォルトでは1個の潜在変数につき,1個パス係数を1に固定する.しかし因子得点の計算用係数を得るためには,因子の分散を1に固定するような制約法にしなければいけない.こうすることでSASやSPSSと同じ結果を得られる.

たとえばAmosのマニュアルのデータ( Holzinger & Swineford(1939) )のうち少年データを使って簡単な1因子3変数モデル(視覚能力因子のみ)で確認すると,「SMC=0.887」なのに,計算された因子得点の分散は「0.899」となっている.これはAmosがデフォルトでは不偏分散共分散行列を使わないからである.SASやSPSSと同じ結果を得るには「分析のプロパティ」で不偏分散を分析するように指定する.Amos 4.0 User's Guide, p.302 にあるように,Amosは入力データが共分散行列お場合は「不偏」とみなし,多変量データ行列の場合は「不偏でない」共分散行列を分析対象とするのである.後者は他の多くのソフトウエアと異なるデフォルト設定である.

整理すると,

■推定法

「回帰推定法」が一般的.SPSSは複数の推定法が用意されており,他に Bartlett法と, Anderson-Rubin法がある.回帰推定法で重み行列Wを求めるには,相関行列Rと因子負荷の標準解(=因子負荷行列)Lから,

W = inv( R ) * L


■固定母数

因子の分散を1に固定し,因子から指標へのパス係数をすべて自由母数にすると,SASやSPSSによる因子得点と同じ結果を得ることができる.
因子の分散を推定すべき自由母数とし,指標へのパス係数のうち1個だけを1に固定すると,因子得点の分散はSMCにはならない.
Amosのデフォルトによる制約方法は後者である(1個のパス係数を1に固定).因子得点は本質的には同じであるが,値そのものは一般にかなり異なる.

■重みベクトル(因子得点係数)と分析行列

SASやSPSSでは相関行列を分析対象としている.このことは観測変数が,平均0,分散1に標準化されていることに相当するから,算出された重みベクトルを,標準化データに対して線形結合して求める.
Amosでは共分散行列を分析対象としている.このことは観測変数の平均が引いてあることに相当する.重みベクトルは平均偏差データに対して線形結合して求める.すなわち共分散行列をC,因子負荷の非標準解をAとすれば,

W = inv( C ) * A


■不偏分散か標本分散か

データ数(N)が小さい場合,Amosと他ソフトウエア(例えば,SAS, SPSS)による因子得点はわずかに異なる.Amosの場合は多変量データ行列を入力とするとデフォルトでは不偏でない標本分散共分散行列を分析するのが原因である.他のソフトウエアでは不偏分散共分散行列を分析する.

■数値例とプログラム例で確認


/*------------------------------

  Amos の因子得点係数の確認

------------------------------*/

/* Amosの出力した係数 */
data coef1 ; /* 因子の分散=1 */
    input Lw Cw Vw ;
cards ;
0.104930274122 0.011135165192 0.008771773763
;
run ;
data coef2 ; /* パスの分散=1 */
    input Lw Cw Vw ;
cards ;
0.842746281092 0.089431904744 0.070450363523

;
run ;

/* 分析データセット */
data x ;
    infile 'd:\amosjob\nkimage\boys.txt' dlm = '09'x firstobs = 2 ;
    input V C L P S W SPSS_F1 ;
run ;

/* SASによる因子得点 */
proc factor data = x m = ml out = fscore outstat = fstat n = 1 res ;
    var V C L ;
run ;

/* 平均0のデータセットY作成 */
proc standard data = x out = y m = 0 ;
    var v c l ;
run ;

/* Amos係数による線形結合 */
data amos1 ;
    if _n_ = 1 then set coef1 ;
    set x ;
    amos1_F1 = Lw * L + Cw * C + Vw * V ;
    label amos1_F1 = "FVar.raw" ;
run ;
data amos2 ;
    if _n_ = 1 then set coef2 ;
    set x ;
    amos2_F1 = Lw * L + Cw * C + Vw * V ;
    label amos2_F1 = "Path.raw" ;
run ;
data amos3 ;
    if _n_ = 1 then set coef1 ;
    set y ;
    amos3_F1 = Lw * L + Cw * C + Vw * V ;
    label amos3_F1 = "FVar.m=0" ;
run ;
data amos4 ;
    if _n_ = 1 then set coef2 ;
    set y ;
    amos4_F1 = Lw * L + Cw * C + Vw * V ;
    label amos4_F1 = "Path.m=0" ;
run ;

data amosx ;
    merge fscore amos1( keep = amos1_F1 spss_F1 ) amos2( keep = amos2_F1 )
                 amos3( keep = amos3_F1         ) amos4( keep = amos4_F1 ) ;
run ;

proc means data = amosx maxdec = 3 n mean var ;
    var amos:  spss_f1 factor1 ;
run ;
proc corr data = amosx noprob nosimple ;
    with  amos: ;
    var   spss_f1 factor1 ;
run ;

%print( amosx, obs=10)


proc corr data = x cov out = c ;
    var v c l ;
run ;
data cov ;
    set c ;
    if _type_ = 'COV' ;
    keep v c l ;
run ;
data corr ;
    set c ;
    if _type_ = 'CORR' ;
    keep v c l ;
run ;
%print(corr)

data lamda ;
    set fstat ;
    if _type_ = 'PATTERN' ;
    keep v c l ;
run ;
%print( lamda )

proc iml ;
    use cov ;
    read all var{ v c l } into COV ;
    close cov ;

    use corr ;
    read all var{ v c l } into corr ;
    close corr ;

    use lamda ;
    read all var{ v c l } into A ;
    close lamda ;
    A = A` ;
    W = inv( CORR ) * A ;
    print W ;
quit ;