SPSS ときど記(101〜110)
SPSSを使っていてトラぶったところや変な出力や裏技表技の便利な使い方を中心に書き留めてみる。何回話題があるかわからですが,時々書きます。(Keizo Hori)
最終更新日:
(2001/6/17から)
(91)〜(100) ときど記(メニュー)へ
(111)〜(120)
- SPSS ときど記(110) 2001/ 9/25 因子分析 猪原・狩野非反復因子分析法 excel vba
- SPSS ときど記(109) 2001/ 9/19 因子分析 因子数決定 script
- SPSS ときど記(108) 2001/ 9/ 2 因子分析 Gorsuchの Extension macro
- SPSS ときど記(107) 2001/ 9/ 2 因子分析 因子数決定法 Standard error Scree macro
- SPSS ときど記(106) 2001/ 9/ 2 因子分析 因子数決定法 Velicer の MAP macro
- SPSS ときど記(105) 2001/ 9/ 2 因子分析 因子数決定法 parallel analysis
- SPSS ときど記(104) 2001/ 7/23 因子分析 Thurstone の57能力テスト
- SPSS ときど記(103) 2001/ 6/24 因子分析 この行列は正値行列ではありません。
- SPSS ときど記(102) 2001/ 6/23 因子分析 続)欠損値のペアワイズの削除が行われたため、行列が正値行列ではありません。
- SPSS ときど記(101) 2001/ 6/17 因子分析 欠損値のペアワイズの削除が行われたため、行列が正値行列ではありません。
因子分析 猪原・狩野非反復因子分析法 excel vba
SPSSに直接関係ないが、猪原・狩野非反復因子分析法のexcel vba を公開した。正定値でない場合も解を求めることができる。最尤法では不適解になる場合にも解を求めることができる。いろいろ便利にしているので是非使ってみてください。
メニューへ トップへ (111)へ
因子分析 因子数決定 script
O'Conner 氏のマクロを参考にして、map, pa, SE scree を一度に求めてしまスクリプトを作ってしまった。
データ・ウィンドウにあるデータに対応する、因子数を求める。変数選択もできるのでとても便利です。データが相関行列であっても変数選択ができます。
スクリプトはこちら。
メニューへ トップへ (110)へ
因子分析 Gorsuchの Extension macro
O'Conner 氏の Extension Analysis のマクロはなかなかの力作である。因子分析を行列言語でやってしまう。高次因子も求めてしまう。これらは、Gorsuch(1997a)において薦められている方法である。しかもGorsuch(1997b)の因子分析の拡張もやってしまう。因子分析の拡張は因子分析に使っていない変数を因子分析のなかに組み込んでしまうものである。
(106),(105)に書いた修正が必要。
Gorsuch, R. L. (1997a). Exploratory factor analysis: Its role in item analysis. Journal of Personality Assessment, 68, 532-560.
Gorsuch, R. L. (1997b). New procedure for extension analysis in exploratory factor analysis. Educational and Psychological Measurement, 57, 725-740.
ps. このマクロをスクリプトにした。2003.3.18
SPSS ときど記(132) 2003/03/18 因子分析 拡張因子分析・高次因子分析 extension script
メニューへ トップへ (109)へ
因子分析 因子数決定法 Standard error Scree macro
O'Conner 氏のマクロ Extension Analysis の中にいくつか因子数決定法が埋め込まれている。その中の一つにStandard error Scree というのがある。スクリーテストの概念を計算によって実現しようという試みの一つである。 Zoski and Jurs(1996)の開発した方法であるが、視覚によるスクリーテストに近い結果がでている。
これをO'Connor 氏の他のマクロと同じようにする。
*seScree.sps-----------------------.
set printback=none width=80
* There are two ways of running this program:
* Method 1: You can enter a correlation matrix directly
into the program (i.e., without having SPSS save and then
read a matrix out file), as in the example below for
Harman's data. Simply use the command COMPUTE CR =
to enter and name the data, as in the example.
* Method 2: You can have the program read a correlation
matrix that was saved by an SPSS procedure, as in the
following examples:
* correlation v1 to v21
/ matrix out ('C:\data.cor') / missing = listwise.
* factor var= var1 to var25
/ matrix out (cor = 'C:\data.cor').
* You must then use the same MATRIX OUT filename
(e.g., 'C:\data.cor') in the MGET command within the
program itself. These commands are now merely
comments and will not run unless the "*"s in the
first collumns are removed. Any other COMPUTE CR =
statements must also be removed from the program
(e.g., remove Harman's data in the example below).
matrix.
* activate the next MGET command to read a correlation
matrix created by SPSS.
* MGET /type= corr /file=*. /*'c:\data.cor' .
* Harman's data (1967, p 80).
compute cr = {
1.00 ,0.65 ,0.65 ,0.65 ,0.65 ,0.50 ,0.50 ,0.50 ,0.50 ;
0.65 ,1.00 ,0.65 ,0.65 ,0.65 ,0.50 ,0.50 ,0.50 ,0.50 ;
0.65 ,0.65 ,1.00 ,0.65 ,0.65 ,0.50 ,0.50 ,0.50 ,0.50 ;
0.65 ,0.65 ,0.65 ,1.00 ,0.65 ,0.50 ,0.50 ,0.50 ,0.50 ;
0.65 ,0.65 ,0.65 ,0.65 ,1.00 ,0.50 ,0.50 ,0.50 ,0.50 ;
0.50 ,0.50 ,0.50 ,0.50 ,0.50 ,1.00 ,0.60 ,0.60 ,0.60 ;
0.50 ,0.50 ,0.50 ,0.50 ,0.50 ,0.60 ,1.00 ,0.60 ,0.60 ;
0.50 ,0.50 ,0.50 ,0.50 ,0.50 ,0.60 ,0.60 ,1.00 ,0.60 ;
0.50 ,0.50 ,0.50 ,0.50 ,0.50 ,0.60 ,0.60 ,0.60 ,1.00
}.
* Standard Error Scree (Zoski & Jurs, 1996, EPM, p 443).
compute evals = eval(cr).
compute nevals = nrow(evals).
compute rootnum = t(1:nevals).
compute sesdata = { rootnum , evals }.
compute nfSCREE = 0.
compute find=0.
compute arbiter = 1 / nevals.
compute ses = make(nrow(cr)-2,2,-9999).
loop #loop = 1 to nevals-2.
compute y = sesdata(#loop:nevals,2) .
compute n = nrow(y).
compute x = { make(n,1,1) , sesdata( #loop:nevals ,1) }.
compute b = inv( t(x) * x) * t(x) * y.
compute pred = x * b.
compute sse = msum ( (y - pred)&**2 ).
compute sderest = sqrt( sse / (n - 2) ).
compute ses(#loop,:)={#loop,sderest}.
do if ( sderest > arbiter and find=0).
compute nfSCREE = nfSCREE + 1.
else.
compute find=1.
end if.
end loop.
compute nfactors = nfSCREE.
compute mark=make(nrow(cr)-2,1," ").
compute mark(nfactors,1)={" *"}.
print /title="Scree Plot: Standard Error Scree (Zoski & Jurs, 1996, EPM, p 443):".
*print evals /title="Eigenvalues" /format "f12.6".
print {ses,evals(1:nrow(ses))}/title="Standard Error Scree"/format "f12.6"/rnames=mark/clabels=" ","se", "EigenVal".
print arbiter/title="compared to "/format "f12.6".
print nfactors /title="The number of components is".
end matrix.
*----end.
Zoski, K. W., and Jurs, S. (1996). An objective counterparts to teh visual scree test for factor analysis: The standard error scree. Educational and Psychological Measurement, 56,443-451.
メニューへ トップへ (108)へ
因子分析 因子数決定法 Velicer の MAP macro
Zwick and Velicer(1986)が因子数決定法の最強力としている Velicer のMAP(minimum average partial) を求めSPSSマクロをO'Connor氏が作っている。
因子数がこれより少なくならないという点でも因子数決定に使うべき指標である。
なお、途中までしかMAPを求められない場合のために、
compute fm = make(nrow(cr),2,-9999).
を
compute fm = make(nrow(cr),2,9999).
にしておくこと。
参考文献等はこっちを参照してください。
メニューへ トップへ (107)へ
因子分析 因子数決定法 parallel analysis macro
因子分析の因子数決定法の最有力の方法 parallel analysis のSPSSマクロが公表されている。O'Connor氏のところである。このままではちょっと使いにくい感じがするが、対角1のときと対角SMCのときのPAを求めることができる。また、SPSSでは対角SMCの非反復因子分析ができないので、このときの固有値を求めるプログラムもついている。
実は、excelのvbaを使って、parallel analysis ができるようにしたのだが、その後で気づいた。parallel analysis の説明を別に書いた。これを読んでください。また、PAをどう使うのかはexcel に書いたので、こっちも参照してください。
O'Connor 氏のプログラムの最初の乱数発生の初期値の設定が固定しているのはいただけない。
set mxloops=9000 printback=off width=80 seed = 1953125.
を
set mxloops=9000 printback=off width=80 seed = random.
と変えたほうがいい。
メニューへ トップへ (106)へ
因子分析 Thurstone の57能力テスト
L. L. Thurstone の57能力テストのデータを鈴木督久氏が公開している。
2000/11/15の[fpr 1848] PMA でも話題にしていた。
データがあるので、分析したところ、固有値に負の値がある。SPSSでは直接分析ができないタイプのものである。つまり、「因子分析 欠損値のペアワイズの削除が行われたため、行列が正値行列ではありません。」SPSS ときど記(101) 2001/ 6/17および SPSS ときど記(102) 2001/ 6/23 タイプのものである。
最後の3つの固有値を示すと次のようになる。
55 | 56 | 57 |
-0.257153989 | -0.273096704 | -0.444917005 |
このタイプのデータはSPSSでは主成分分析さえできない。SPSSプログラム があるので、試してみてください。なお、このファイルに含まれている2つ目のプログラムはセントロイド解の因子負荷量を分析するプログラムです。セントロイド解が欲しい場合はこのプログラムからとってください。
SASでは主成分分析をすることができる。また、対角に相関係数の最大値をいれ、反復をしない主因子分析を行うこともできる。
さて、セントロイド解であるが、statistica にある。これとは別に芝祐順『因子分析法第2版』東京大学出版会 に載っているプログラムをvbaに移植し、エクセルで分析できるようにした。この2つの解がちがっているので、チェックをいれた。芝のp57にある16テストの因子負荷の表と比較すると、エクセルでの結果は一致した。statistica は.100 以上の差がある負荷量も複数あり、許容範囲を超えた違いがあった。
statistica がセントロイド法において言及している2冊の本のうちの1冊、Harman(1976)の p172 table 8.15 と比較してみると、エクセルでの結果は芝のときよりも差が大きくなっているが、許してもいい範囲にある。一方、statisitica の結果は第1因子は許容範囲内の結果であるが、第2、第3因子は大きく違っていて、許せる範囲とはいえない。
ということで、どうやらstatistica のセントロイド解は使い物にならない。計算の精度は0.01から0.0001に変更している。
statistica 恐るべし。
エクセル(芝 1979移植) | statistica 98 edition | Harman p172 |
| a(1) | a(2) | a(3) | | 1 | 2 | 3 | Test | 1 | 2 | 3 |
v1 | 0.59 | 0.05 | 0.41 | V1 | 0.61 | 0.29 | 0.38 | 1 | 0.61 | -0.06 | -0.44 |
v2 | 0.37 | -0.05 | 0.29 | V2 | 0.35 | 0.12 | 0.27 | 2 | 0.36 | 0.04 | -0.27 |
v3 | 0.42 | -0.16 | 0.42 | V3 | 0.41 | 0.09 | 0.34 | 3 | 0.42 | 0.15 | -0.43 |
v4 | 0.50 | -0.09 | 0.32 | V4 | 0.48 | 0.06 | 0.32 | 4 | 0.48 | 0.08 | -0.29 |
v5 | 0.74 | -0.27 | -0.27 | V5 | 0.73 | -0.35 | -0.05 | 5 | 0.73 | 0.26 | 0.24 |
v6 | 0.71 | -0.37 | -0.20 | V6 | 0.71 | -0.39 | 0.07 | 6 | 0.71 | 0.35 | 0.17 |
v7 | 0.71 | -0.35 | -0.27 | V7 | 0.72 | -0.47 | -0.05 | 7 | 0.72 | 0.37 | 0.26 |
v8 | 0.71 | -0.19 | -0.09 | V8 | 0.70 | -0.16 | 0.00 | 8 | 0.71 | 0.20 | 0.06 |
v9 | 0.69 | -0.38 | -0.27 | V9 | 0.69 | -0.49 | 0.03 | 9 | 0.70 | 0.41 | 0.25 |
v10 | 0.46 | 0.48 | -0.38 | V10 | 0.46 | 0.23 | -0.62 | 10 | 0.46 | -0.48 | 0.40 |
v11 | 0.55 | 0.42 | -0.16 | V11 | 0.53 | 0.20 | -0.27 | 11 | 0.54 | -0.39 | 0.15 |
v12 | 0.49 | 0.57 | -0.05 | V12 | 0.49 | 0.47 | -0.35 | 12 | 0.49 | -0.55 | 0.03 |
v13 | 0.66 | 0.37 | 0.16 | V13 | 0.68 | 0.39 | -0.08 | 13 | 0.67 | -0.37 | -0.14 |
2乗和 | 4.643 | 1.429 | 0.997 | 説明済 | 4.618 | 1.344 | 1.022 | | 4.620 | 1.392 | 0.954 |
寄与率 | 0.357 | 0.110 | 0.077 | 寄与率 | 0.355 | 0.103 | 0.079 | | 0.666 | 0.201 | 0.138 |
累積寄与率 | 0.357 | 0.467 | 0.544 | | | | | | | | |
ps 2001/7/26
56テストの57得点でした。
PS.
L.L. Thurstone のPrimary Mental Abilities http://www.ec.kagawa-u.ac.jp/~hori/yomimono/Thurstone.html も参照してください。
メニューへ トップへ (105)へ
因子分析 この行列は正値行列ではありません。
正定値行列でない場合の一つ、半正定値行列(つまり固有値が正か0の場合)になる相関行列を作成する。
変数の数よりもサンプル数が少ない場合である。13変数あるデータから10サンプル取り出し相関行列を作る。
*--------------------------------------.
data list free/
外向性 活動性 共感性 進取性 持久性 規律性 虚構性 自己顕示 攻撃性 非協調性 劣等性 神経質 抑うつ性
.
begin data
16 12 6 10 16 16 4 12 6 2 6 14 4
2 2 10 2 14 12 0 8 10 10 14 18 18
9 8 18 8 18 10 17 5 3 5 10 9 8
13 11 13 12 9 15 5 14 12 7 9 13 13
0 2 10 20 4 4 6 10 16 0 6 16 8
12 2 12 10 6 10 2 7 6 10 18 12 16
2 2 6 3 10 9 10 5 0 6 17 1 6
18 14 6 15 12 8 5 11 13 9 12 15 16
18 6 20 12 2 6 0 6 8 1 6 18 15
5 11 17 8 11 14 2 12 9 3 10 14 10
end data.
factor var=all/analysis=all/
criteria=factors(3)/
print=default det
/extraction=pc
/rotation=norotate
.
*---------------------------------------------.
上のシンタックスをSPSSのシンタックス窓に貼り付けて走らせてみてください。
固有値は次のようになる。
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
固有値 | 3.9814 | 2.6745 | 2.4319 | 1.3723 | 1.0846 | 0.7467 | 0.4791 |
8 | 9 | 10 | 11 | 12 | 13 |
0.1545 | 0.0751 | 2.428E-16 | 9.553E-17 | 1.477E-17 | -2.5517508766e-016 |
第10〜第13固有値を0と見なすことができる。
/print det の指定により行列式が出力される。相関行列は圧縮されているが、相関行列のところに、
>a 行列式=.000
>b この行列式は正値行列ではありません。
と出力される。以下正常に主成分分析の結果が出力される。既定値の出力だけだと、正定値行列であることを知らないで処理が進む。
反復主因子解 pafと最尤法 ml は説明された分散の合計において
>a 抽出することができません。この抽出はスキップされます。
として結果はでない。
重みなし最小2乗法 uls は相関行列のところに
>c. この行列は条件付けが間違っているので、無効な結果が作成されます。
と出力されるが、結果はでる。ところで、条件付けてなんですか?
共通性のところに
>平方多重相関係数が見つかりません。各共通性の初期の推定値は、分析における変数と他の変数との間の最大絶対相関係数です。
という文句がでる。「平方多重相関係数」とはSMC(squared multiple correlation)のことである。これはSASでは「他の変数との重相関計数の自乗値」といっていてわかりやすい。SPSSではどうして独自訳を作るのだろう。ま、知らないためと思われる。行列式が0なので逆行列を求めることができなし。そのためSMCを求めることができないので当然のクレームだ。
--------------------------
SASの場合
反復なし主因子解 principal、 は結果を出力
最小自乗法 uls, 反復主因子解 prinit 結果はでない
>ERROR: Communality greater than 1.0.
最尤法 mlの場合、警告なしに結果がでない。
--------------------------
cefa の場合
最尤法,PACE Sample Correlation Matrix is not Positive Definite!
最小2乗法 文句はないが、初期解をださない。
--------------------------
statistica は
>変数の数がケース数より多くなっており、因子分析が行えません。
と処理を端から拒否してきた。
データを相関行列にすると分析できる。
ただし、反復分解法(MINRES)だけは
>因子の抽出に失敗しました。相関行列が悪条件の可能性があります。
のダイアログがでてくる。う〜ん。悪条件を乗り越えるのがSTATISTICA ではなかったのか。
というようにソフトによっていろいろな対応をしていることがわかる。いずれにしても悪条件であることを知っておくことは必要であろう。
メニューへ トップへ (104)へ
因子分析 続)欠損値のペアワイズの削除が行われたため、行列が正値行列ではありません。
あとで、SPSS ときど記(101)に付け足しましたが、このエラーメッセージは説明された分散の合計において出力されるものです。どうも相関行列が条件が特に悪い場合に出力されているようです。行列式が半正定値(つまり固有値が正か0の場合)にはこの出力はないようです。次にこの件を載せる予定。
前のレポートに使った相関行列の固有値の小さいほうの2つは
と明らかに負の固有値を持っている。通常の相関行列ならこのようなことは起こらない。条件が悪くても半正定値になるだろう。もとの相関行列がつぎはぎの相関行列であったためか、なにか誤入力があったかは定かではない。
さて、statistica はこれを求めることに言及した。CEFA は許されるrange にないと処理を拒否する(| Error in call to NLESR: Parameters not between bounds または Sample Correlation Matrix is not Positive Definiteのエラー)。sas はuls などを求めます。ただしml はなにが問題か言わずに因子分析の結果を出さずに終了します。
なお、このデータの行列式は0ではないはずなのに、SPSSの結果は行列式=0という結果を表示します。おかしい。
このデータは
山本和郎・西村恕彦・野村健二・飽戸弘・岡部容子 1960 S.D法による日本語の意味構造の研究 市場調査,82, 3-16.
に掲載されている相関行列です。
Sagara, M., Yamamoto, K., Nishimura, H., & Akuto, H. 1961 A study on the semantic structure of Japanese language by semantic differential methods. Japanese Psychological Research, 3, 146-156.
にセントロイド解とバリマックス回転解が載っています。
このデータの処理結果については
日本語のSD意味空間の検討 http://www.ec.kagawa-u.ac.jp/~hori/yomimono/sd.html
メニューへ トップへ (103)へ
因子分析 欠損値のペアワイズの削除が行われたため、行列が正値行列ではありません。
SPSSの因子分析の説明された分散の合計において
>欠損値のペアワイズの削除が行われたため、行列が正値行列ではありません。
というエラーがでることがある。実際に欠損値のペアワイズの削除が原因であることもあるが、そうでない原因であることもある。
not positive definite matrix =正定値行列ではありません。=固有値がすべて正にはなってません。
さらに、もし行列式が0である場合=行列が特異(singular)である=逆行列を求めることができません。
not positive definite matrixであり、行列式が0でない場合、逆行列を求めることはできますが、その逆行列は因子得点やSMC を求めるのには不適切な逆行列となります。
実際にはわずかでもプラスであればこの警告はでないので、マイナスの固有値がでたときの警告 半正定値行列ではないときの警告といっていいだろう。そのため、正定値であるかどうか、行列式の値を確認する必要がある。これは固有値に0があるかどうかでも確認できる。
正定値にならない場合については、Not Positive Definite Matrices--Causes and Cures(by Ed Rigdon)に詳しい。
因子分析は相関行列が正定値であることを前提としているので、これを満たさない場合はなんらかの問題が生じていることになる。
探索的因子分析における原因としては(上のサイトを参考にして)
(1)変数間において一次結合の組み合わせがある。(多重共線性)
(2)データをプログラムが読み損なっている。(複数のソフトで処理してみよう)
(3)タイプミス。(元論文のミスの場合もある。プラス・マイナス。数値にでかいのが入っているなど)
(4)欠損値のペアワイズの削除
(5)多分相関(polychoric correlations)・四分相関を使用している。
(6)定数の変数がある。
(7)サンプル数は変数の数より少ない。
が考えられる。
以上のような問題がないかチェックしてみること。(1)についてはすでに多重共線性チェックのマクロを作っている。今回、もともとのデータが相関行列の場合の多重共線性チェックマクロを作ってみた。
さて、正定値でないと因子パタンを求めることができないかというと必ずしもそうではない。が、SPSSの因子分析ではブロックしている。正しい態度であろう。
しかし、あえて計算するオプションがあってもいいのではないだろうか。主成分分析などでは、必ずしもサンプル数が変数数より多いというわけでもなさそうだ。ml には正定値の場合、計算が困難になることもあるようだが、paf やuls ではあまり起こらないだろう。もちろん、逆行列を求められない場合は、因子得点は求められない。逆行列を求めることができる場合は変な答えを出してしまう。そのため因子得点は無効となる。
Statistica では因子分析を行うことができる。(STATISTICA ユーザーマニュアル 応用統計編 FAC-3178, 1996)
行列の対角成分に小さな定数を加え、それを基準化することd、相関行列のすべての相関係数を人工的にやや低めます。この方法で、行列は逆行列が計算できるようになります。
ただ、警告してといっているが、警告なしに処理する。因子分析結果の「相関行列の行列式の常用対数値」が[--]となっていればこれをしたことになる。
STATISTICA はどの変数において多重共線性が生じているかチェックすることができる。「共通性」の多重R-2乗が1以上であると、その変数間において多重共線性が生じている。
STATISTICA にはセントロイド法(重心法)がある。この場合は、逆行列を使わないので、このような処置なしに初期解を求めることができる。ただ、STATISTICA がどうしているのかはよくわからない。
STATISTICA の因子分析はちょっと怪しいおもしろさがある。収束基準(最小変化量)の既定値が0.01と大雑把だ。SPSSはRconverge=0.0001, Econverge=0.001である。SPSSの場合、反復数=25 とちょっと小さい。指定しないでいいように100にして欲しい。そのほか、セントロイド法や階層因子分析を含むなどほかにない処理を入れている。
相関係数を入れるときはいつも悩む。操作が自然でない。久しぶりに使うとすっかり忘れている。ケース名のところ一番上のセルにおいて右クリックし、「ケース名」→オプション→クリップボード貼り付け
して、ケース名を貼り付ける。
変数名は変数名のセルをダブルクリック→全変数属性→名前のところに貼り付け
なんでこんな秘密の儀式をするのだ。
そういえばインポートの機能を使っていない。しかし、これはSTATISTICA 98である難点があるかもね。ちょっと実験したら、トラブルが発生する。
メニューへ トップへ (102)へ
堀 啓造ホームページへ