SPSS ときど記(91〜100)

SPSSを使っていてトラぶったところや変な出力や裏技表技の便利な使い方を中心に書き留めてみる。何回話題があるかわからですが,時々書きます。(Keizo Hori
最終更新日: (2001/4/7から)

(81)〜(90) ときど記(メニュー)へ  (101)〜(110)

  1. SPSS ときど記(100) 2001/ 6/ 2 因子分析 Browne らのCEFA
  2. SPSS ときど記(99) 2001/ 5/31 SAS UNIXのSASをWindowsのteraterm で使う
  3. SPSS ときど記(98) 2001/ 5/27 スクリプト 新規データ文書を開くが機能しない
  4. SPSS ときど記(97) 2001/ 5/21 スクリプト 変数選択+既定値 script
  5. SPSS ときど記(96) 2001/ 5/13 スクリプト 四分相関行列を求めるscript
  6. SPSS ときど記(95) 2001/ 4/30 マクロ macroと統計計算のサイト
  7. SPSS ときど記(94) 2001/ 4/18 マクロ macro等spss統計のサイト
  8. SPSS ときど記(93) 2001/ 4/16 重回帰分析 必要サンプル数
  9. SPSS ときど記(92) 2001/ 4/ 9 因子分析 階層因子分析
  10. SPSS ときど記(91) 2001/ 4/ 7 因子分析 varimax解の因子パタンからpromax解を求める行列言語

SPSS ときど記(100) 2001/ 6/ 2

因子分析 Browne らのCEFA

Browne et al のCEFA(Comprehensive Exploratory Factor Analysis)という探索的因子分析のソフトがある。無料である。現在、探索因子分析処理のもっとも包括的かつ最新レベルのものといっていいだろう。CEFA がは
Browne のホームページにあります。

ただ、新しいのと包括的なためわかりにくいし、なじみにくい。マニュアルもあるのだが、よくわからないところがある。

Browne, M.W. (2001). An Overview of Analytic Rotation in Exploratory Factor Analysis. Multivariate Behavioral Research,Volume 36(1), 111-151

は、オプションの意味が比較的わかりやすい形で記述されている。また、探索的因子分析の発達がわかる。Gorsuch(1983)には記述されていないことが多く書かれている。

CEFAToolのオプションがわかりにくい。

データファイルに付け加えておくべき項目がある。これは、CEFATool 7 Write Data File Header によって書き出し、データを付け加える。

SPSSの直接oblimin(0=quartimin)と同じ分析をするには次のように指定する。
1: Set File Options
をクリックし、データファイルを指定する。

2: Factor Analysis Options
 Number of factors extracted に抽出因子数を入れる
 Data Distribution : 多変量正規 multivariate normal しかない
 Dispersion Matrix : Correlation Matrix
 Discrepancy Function: MWL (最尤法)またはOLS(最小2乗法)
ほかは既定値でいいだろう。

3: Set Rotation Options
 Rotation Info
  Oblique :斜交解(直接)
 Funciton Info
  CF-Quatimax (これが直接oblimin (0)に対応)
  Kaiser weights (spss はこのoption のみ有効のように見えるが、出力を比較するとno kaiser もきちんと働いている)

4: Set Standard Errors Options
  これはいじらないでよい。実際に利用するなら、Delta theorem のほうがいいかもしれないが、よくわからない。

この指定を終えた後
5: Write CEFA Script File
をクリックし、書き出す。拡張子は.cmd

そして、
6: Run CEFA
で今書き出したスクリプトファイルを指定し、さらに出力ファイルを指定する。

処理が実行されたのち、
8: Open With Notepad
によって書き出しファイルを指定し、出力を読む。

直交回転のVarimax 解は
3: Set Rotation Options
 Rotation Info
 Orthogonal :
 Funciton Info
  CF-Varimax
  Kaiser weights
となる。
あとはいろいろ試してみよう。Browne(2001)では基準化のしかたを Kaiser weights ではなく, Cureton-Mulaik のほうがいいときの例を挙げている。

適合度指標もでるのでモデルの良さも判定しやすい。また因子パタンの標準誤差が出力されるので、0でない因子パタンがわかる。

メニューへ  トップへ (101)へ

SPSS ときど記(99) 2001/ 5/31

UNIXのSASをWindowsのteraterm で使う

統計処理をしていると、SASではどうなるのか知りたいことがある。APAでも複数のソフトで処理することを勧告している。

しばらく私のパソコンの事情によってSASを使えない環境になっていた。香川大学情報処理センターのSASも日本語文字化けをしていて、使えるとはいえない状況であった。センターのほうの方にSASを使えるようにしてくれとせっついていたら、最近きちんと使えるようになった。香川大学ではSASはかなりバージョンが古い。まだ6.12である。SASでさえ見放しているUNIXマシンなんだろうか。

さて、
teraterm という奇特なソフトを使うと、グラフ出力も見ることができる。
香川大学ではgauss(133.92.12.17) を使えるように登録しておく必要がある。

teraterm の terminal を設定。
terminal size は80*24よりも大きい方がいい。120*24 くらいか。まあ80でもいい。

Termnal ID: VT100
kanji code はともにEUC
Auto switch(vt<->tek)をチェック
------------------------------
teraterm を起動し、gauss にアクセスする。

set TERM tek4010 指定。vt100でもやれそうだ。
図を書いたとき
デバイス名を指定して下さい. :
に対して
tek4010
と答える。
Please press return after each bell to continue.
にenter
既定値のサイズのtek 画面を開いて描画する。tek画面のサイズを指定したいときは、
control->open tek
によってあらかじめtek画面を開いておいて、サイズを変更しておく。
------------------------------
mule にパスが通っていないのでパスを通しておいた方が便利
/home/local/bin

xwindows の時は、フォントサーバ
tcp/132.92.12.17:7000
を4番目にセットしておく。
------------------------------
以上しばらく使っていないうちにすっかり忘れてしまっていた。

とりあえずSASが使える状態になった。

ああ。sas の実行ファイルのあるところにパスが通っていること。gaussに登録するとパスは通っている。

sas なんたら.sas
というようにSASのファイルを指定し、起動するとSASが実行される。結果は「なんたら.lst」に保存される。このあたり、いろいろ起動時オプションで指定できるので、好みの仕様のバッチファイルを作っておけばいい。

VT100モードのSASの基本操作というサイトがある。これだと,vt100モードで起動すれば、メニューが使えますね。

sas -fsdevice ascii.vt100nav

で起動する。あ〜。インターネットってホント便利。Googleでsas teraterm を検索してひっかかったサイトを順に読むとわかる。この情報は、パソコン端末を使った図形表示(東北大学)だ。これで、上のサイトの説明を読めば使える。昔,teraterm で使っていた。

メニューへ  トップへ (100)へ

SPSS ときど記(98) 2001/ 5/27

スクリプト 新規データ文書を開くが機能しない

spssのスクリプトの例に「新規データ文書が開く」というものがある。ヘルプで「NewDataDoc メソッド」から「例」をクリックする。

---------------------
' 変数を宣言し、SPSS を開始する

Dim objSpssApp as ISpssApp
Dim objDataDoc as ISpssDataDoc
Set objSpssApp = CreateObject("SPSS.Application")
' 新規データ文書を開く

Set objDataDoc = objSpssApp.NewDataDoc
' ドキュメント ウィンドウ (データ エディタ) を表示する

objDataDoc.Visible = True
---------------------
私の環境ではDim objSpssApp as ISpssApp がうまくいかないので、
宣言 (DIM) 文によってエラーが生じる場合には、オブジェクト変数を特定のクラス (ISpssOutputDoc や PivotTable など) ではなく、Object で宣言します。
という指示に従い、Dim objSpssApp as Object とする。これがこのスクリプトを走らせると「このプログラムは不正な処理を行ったので強制終了されます。」というエラーダイアログが表示される。

結局新規のときは、シンタックスで作成することになった。


メニューへ  トップへ (99)へ

SPSS ときど記(97) 2001/ 5/21

script 変数選択+既定値 script

変数選択のスクリプトはSPSSに付属している。Scripts\Sax Basic Dialog Editor\のフォルダーにある、VarListDemo2.sbs,および VarListDemo3.sbs である。

しかし、これは使いにくい。変数をクリックしてからadd をクリック。シフト+クリックの連続指定ができない。というわけで、すべて指定のall, 指定変数後の10変数を移動する10>>を付け加えた。これは以前のバージョンからしている。

出力はドラフトのほうがすべての出力を面倒なく見ることができるので、ドラフトのオプションもつけている。これは後で、手動でもできることがわかったのだが、メニューについているほうが便利であろう。

そして、既定値を残す,ini ファイルを作り、iniファイルがあるときには前に使用した変数がすべて現在のデータ窓の変数に存在していれ時に前に指定した変数の使用を既定値とする。既定値の変数リストに追加したり、削除したりできる。数量化3類のモデルではそのほかの既定値も残すようにしている。

今回はもっとも簡単な変数のみ既定値とする。

《使用法》 
変数.SBS
Sub Main の最初にある次のところを各自の望む値に変える。
ここでは「記述統計」を実行する例である。
stitle, inifile は個人の好みの名前でよい。macroexec = のところはその処理名、もしくはマクロ名を入れる。
ここでは記述統計なので「descriptive 」でよい。
-------------------------------
stitle="記述統計" 'ここに処理タイトルを入れる。
inifile="descrip.ini" 'ここに変数名保存のファイル名を入れる。 *.ini 形式がよい
macroexec="descriptive " 'macriexec が単純なら前で指定するだけでいい
--------------------------------
記述統計ならばこれだけで動くようになっている。

Sub execcommand に実行部を入れる。ここではそのままでよい。
一行ずつ解説すると、
Call macrocompile()
これは macro 命令がある場合、呼び出す。ほかのスクリプトはこれを使っている。
Dim strCommand As String
basic のための文字変数の指定。
strCommand = macroexec &vbCrLf 'macriexec が単純なら前で指定するだけでいい
この部分は、実行命令の部分。macroexec には前に指定した命令が入っている。
Dim i As Integer
For i=0 To numvar
strCommand = strCommand + strvarsselected(i) &vbCrLf
Next i

この部分で変数をはき出している。
strCommand = strCommand + "." &vbCrLf
最後にピリオドを入れる。
objSpssApp.ExecuteCommands strCommand , False
SPSSに実行させる。

複雑なオプションがあるときはピリオドの行の前にいろいろ入れることになる。

Sub macrocompile()
'Dim strCommand As String
'マクロ定義部挿入部分 ↓ *******************************************************.

'マクロ定義部挿入部分 ↑ *******************************************************.
'objSpssApp.ExecuteCommands strCommand , False
End Sub

マクロがある場合はこの部分に入れる。マクロをスクリプト仕様にするプログラムはfbasic で作ってある。
Sub macroexec になっていたのを、Sub macrocompile() に修正したので、以前にダウンロードした方は新たに落としてください。

メニューへ  トップへ (98)へ

SPSS ときど記(96) 2001/ 5/13

script 四分相関行列を求めるscript

四分相関行列を求めるスクリプトを作った。力業を随所に見せている。

このスクリプトをつくっていて、行列言語、スクリプトにおいてそれぞれ1つおかしいところを見つけた。これも後日レポートだ。

さらに私の作っているスクリプト部品のなかに2カ所チョンボが見つかった。これも後日レポート。

Enzmann氏のマクロを使っている。Enzmann氏は四分相関行列を求めるPascal プログラムも作っているのになぜ行列を求めるところまで進めなかったのだろうか。多変数間の四分相関係数を求めるところまでは簡単だ。しかし、それにラベルをつけるのが困難である。行列言語・マクロのレベルではちょと無理だ。

そこでスクリプトになる。しかし、そのスクリプトも以外に使いにくい。そこで、スクリプトでもできそうなところもシンタックスでくむ。今回は最後の行列データにするところがそれだ。相当長くなった。根気よくおいかければなにかわかるだろう。
メニューへ  トップへ (97)へ

SPSS ときど記(95) 2001/ 4/30

マクロ macroと統計計算のサイト

Statistical Software - Dirk Enzmann's gimmicks にはSPSSのマクロといくつかの実行ファイルがある。

以前に紹介した四分相関と似ている(元は同じfortran)のマクロがある。より正確な計算ができるpascal と実行ファイルもある。 そのほか相関行列をテキストファイルに書き出すマクロなどがある。
メニューへ  トップへ (96)へ

SPSS ときど記(94) 2001/ 4/18

マクロ macro 等spss統計のサイト

spssのマクロやスクリプトなどがある強力なサイトが登場した.今までわたしのところが世界一と思っていたのだが,負けているかもしれない.

Raynald's SPSS Tools

syntax のところのメニューに
1.Batch Files
2.Bootstrap
3.Charts and Tables
4.Dates and Time
5.Export Import
6.Labels and Variable Names
7.Matrix
8.Parse Data
9.Random Sampling
10.Ranking, Largest values, Sorting, Grouping
11.Read Write or Create data
12.Regression
13.Remove Characters, Duplicates or Variables
14.Restructure File
15.Self Adjusting Syntax
16.Tests of Inequality
17.Unclassified
18.Working With Many Files
19.Working With Missing Values
とならぶのだからなかなか強力である.

まだきちんとチェックしていないが,Bootstrapはマクロである.その他はシンタックス例となっているものもある.

macroのところにある,Some macros には,マクロの使い方やspssマクロのおかしいとこを具体的に示している.
1.Add Casewise Regression Parameters To The File.SPS
2.Define Path By Macro.SPS
3.Find LAG(var1,var2).SPS
4.Imbedded Macros.SPS
5.Include 2 outputs In Syntax.SPS
6.Include Output In Syntax.SPS
7.Listing In A loop.SPS
8.Odd Feature Of Macro Parser.SPS
9.Operations With Macro Variables.SPS
10.Process Variable Subsets Of File.SPS
11.Use Pairs Of Variables Given In Macro Call.SPS

scripts も具体例が挙がっていて使える.

いろいろ参考になるであろう.ここでもbootstrapなど紹介してみたい.

メニューへ  トップへ (95)へ

SPSS ときど記(93) 2001/ 4/16

重回帰分析 必要サンプル数

重回帰分析の必要サンプル数を求める方法には、大雑把な方法ときっちりと相関行列または、偏相関行列を指定する方法がある。

Maxwell(2000) によると厳密な方法はきっちりと相関行列または偏相関行列または,その変数の除いた重相関係数といれた場合の重相関係数を指定しなければならないので,煩瑣であり,そのような詳しく前提としないことがおおい.

大雑把な方法として,
(a)Cohen(1988)の効果量と対応させた方法がある.
(1)small :N=392+p
(2)medium:N=52+p
(3)large :N=22+p
N は必要サンプル数 p は説明変数の数

(b)rule of thumb
N:p=10:1

これら2つの方法とも過少推定である.

Maxwell(2000) は予備的考察として,
(a)説明変数間の相関がすべて同じで,説明変数と目的変数の相関がすべて同じ場合の必要サンプル数(検定力=0.80)
(b)(a)の仮定をさらに強め,説明変数間も説明変数と目的変数の相関がすべて同じとみなせる場合.
について考察している.
(a)のとき
N=7.85[1+(p-1)ρXX-pρXY2][1+(p-2)ρXX]/(ρXY2(1-ρXX)) +p-1
(b)のとき
N=7.85(1+pρ)[1+(p-2)ρ]/ρ2 +p-1

このあと本格的に (c)一説明変数だけが,他の説明変数と異なるとき(もちろんその変数と)について考察する.
このときのすべての説明変数を使ったときのR2(p445,(20))とその一説明変数を除いたときのR2(22)の式を示し,これを厳密なときに与えられている式(p436,(5))に代入し,必要サンプル数を求める.

      λ(1-R2)
(5) N=--------------------- +p-1.
     ρY(Xj・X(-j))2

power=0.80のときλ=7.85
     ρX1Y2[1+(p-2)ρXX]+(p-1)ρXY2-2(p-1)ρX1YρXYρX1X
(20)R2=---------------------------------------------------- (=R2 (5)式)
      1-ρXX+(p-1)(ρXXX1X2)

      (p-1)ρXY2
(22)R2=------------------------ (=ρY(Xj・X(-j))2 (5)式)
      1+(p-2)ρXX

説明変数の数 p,
問題の説明変数と他の説明変数の相関係数 ρX1X
他の説明変数の相関係数 ρXX
問題の説明変数と目的変数の相関係数 ρX1Y
他の説明変数と目的変数の相関係数 ρXY
を設定すれば,必要サンプル数を求めることができる.
spssならばcompute を使って簡単に計算できる.

問題は,
(1)このように相関係数が一様と仮定すること.これについては exchangeable correlation structure の節で今までの研究をいろいろ扱っている.
(2)sensivity to input parameter values において実際にチェックした結果を示している.

最後にすべての相関係数が中程度の場合の検定力0.80の説明変数と必要サンプル数の表がある.
説明変数の数サンプル数
2141
3218
4311
5419
6543
7682
8838
91009
101196

大雑把な推定よりもはるかに多くのサンプルが必要なことがわかる.また,この論文では必要なサンプル数を取らないために,同程度のパラメータを5つあった場合でも少ないパラメータが有意になるというゆがんだ結果になることをモンテカルロ法で示している.
《引用文献》
Maxwell,S.E.(2000). Sample size and multiple regression analysis. Psychological Methods, 5, 434-458.
メニューへ  トップへ (94)へ

SPSS ときど記(92) 2001/ 4/ 9

因子分析 階層因子分析

2000年11月の
日本心理学会ワークショップにおいて,階層因子分析を奨めた。statistica の因子分析がサポートしている方法である。

Gorsuch(1983, p248-p254)によると簡単にできる。SPSS ときど記(90) 2001/ 4/ 4 因子分析 高次因子分析と高次因子のもとの変数の因子負荷量
(3)(1)の(回転後の)因子パタン行列×(2)の(回転後の)因子パタン行列を求めると,高次因子のもとの変数の因子負荷量(因子パタン行列)を求めることができる。
にちょっと工夫すればいいだけだ。

(3)の(2)の(回転後の)因子パタン行列の部分を(2)(回転後の)因子パタン行列と高次因子の独自性行列の平方根にすればいい。

p251をそのままつかえば,独自性は
0.51000
U=00.5800
000.390
0000.45

よって,後ろから掛ける行列Aは
0.700.72000
A=0.6500.7600
0.78000.630
0.740000.67

となる。独自性の平方根を掛けることにより,1次因子の大きさを調整する。

計算はexcel などを用いて行ってください。


《引用文献》
Gorsuch, R. L. (1983). Factor analysis (2nd ed.). Hillsdale, NJ: Lawrence Erlbaum.
メニューへ  トップへ (93)へ

SPSS ときど記(91) 2001/ 4/ 7

因子分析 varimax解の因子パタンからpromax解を求める行列言語

promax解の計算を確かめるために,varimax解の因子パタンからpromax解を求める行列言語をプログラムした。SPSSでは,varimax解の因子パタンを入力して,再度分析ができるので,不要なプログラムである。しかし,何をやっているのかを知るためには行列言語で確かめるのがいい。しかも,SPSSの行列言語はこのレベルの処理には便利にできている。

参考にしたのは,田中・垂水(1995)である。この本はアルゴリズムを簡潔に記述していて理解しやすい。なお,一部はこの本のプログラム(別売)を参考にした。

入力データは3つのタイプに対応する。残念ながら,SPSSの通常のvarimax 回転解の出力を転置したものである。

対応する3つの型。いずれも現在のデータとしてデータエディタ窓にvarimax回転の因子パタンがあることを前提にしている。
(1)SPSS標準のfactor 入力(
データエディタ窓syntax)。
(2)(1)のrowtype_ , factor_ 変数のないもの。
(3)SPSSのvarimax 回転解の変数名およびパタン行列をそのまま,データエディタにコピーし,
データ(D)→行と列の入れ換え
によって,転置したもの。この場合,最初の変数は CASE_LBL となる。なお,データエディタでは変数名が小文字に見えても,内部では大文字になっている。

(1)のデータのシンタックスの例。
Data LIST FREE
/rowtype_ (a8) FACTOR_ (f2.0) v1 to v5.
begin data.
FACTOR 1 -.01728 -.10393 .47062 .06448 .08411
FACTOR 2 .30012 .15316 .07350 .14678 .20778
end data.

(2)のデータのシンタックスの例。
Data LIST FREE
/v1 to v5.
begin data.
-.01728 -.10393 .47062 .06448 .08411
.30012 .15316 .07350 .14678 .20778
end data.

(3)のデータのシンタックス例
Data LIST FREE
/CASE_LB (a8) v1 to v5.
begin data.
var00001 -.01728 -.10393 .47062 .06448 .08411
var00002 .30012 .15316 .07350 .14678 .20778
end data.


上の(1)(2)(3)のデータのいずれかを反転させコピーし(そのまま使えます)シンタックス窓に貼り付けて,走らせてみてください。
その後次の行列言語を反転させコピーしシンタックス窓に貼り付けて,走らせてみてください。

最初の compute #k=3. の3が累乗の係数です。2,3,4と適当に変えてもいいでしょう。

「*実際の変換行列 tp」は次の式でも可
compute tp=tr*sqrt(mdiag(diag(inv(tr)*inv(t(tr))))). /*因子パタン行列用*/
compute tp=t(inv(tp)). /*因子構造行列用 もとの式はこちら用に作ってある*/

《参考文献》
田中豊・垂水共之(1995).『Windows版統計解析ハンドブック 多変量解析』共立出版

*------------------------------------------.
matrix.
compute #k=3.
compute num2={'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15'}.
get x/file=*/names=vname.
compute #nfac=nrow(x).
compute #nvar=ncol(x).
* print vname(1,1)/format="a8".
do if (vname(1,1)="ROWTYPE_") .
compute #nvar=#nvar-2.
compute a=x(:,1:#nvar+2).
compute vname=vname(1:#nvar+2).
else if (vname(1,1)="CASE_LBL").
compute a=x(:,2:#nvar).
compute vname=vname(2:#nvar).
compute #nvar=#nvar-1.
else.
compute a=x.
end if.

print {#nvar,#nfac,#k}/title=
"varimax 回転の因子パタンからpromax(k)の斜交解を求める"
/clabels="変数数" "因子数" "k".


*行の2乗和が1になるようにする.
compute b=t(a).
print b/title="元の因子パタン(varimax回転 )"/rnames=vname/cnames=num2/format="f5.3".
compute b2=sqrt(rssq(b)). /*各行の2乗和を求め平方根をとる*/
compute b3=b2.
loop #i=2 to #nfac.
compute b2={b2,b3}.
end loop.
compute b=b&/b2.

*列方向に見て最大値が1になるようにする.
compute b2=cmax(b).
compute b3=b2.
loop #i=2 to #nvar.
compute b2={b2;b3}.
end loop.
compute b=b&/b2.

*各要素を3乗し,符号をもとのままにする 目標行列作成 .
compute s1=b ge 0.
compute s2=(b lt 0)*(-1).
compute s1=s1+s2.
* print s1.
compute b=(abs(b)&**#k)&*s1.
print b/title="目標行列 "/rnames=vname/cnames=num2.

*プロクラテス変換行列 Tr.
comput tr=inv(a*t(a))*a*b.
print tr/ title="プロクラテス変換行列 tr"/rnames=num2/cnames=num2.

*実際の変換行列 tp .
compute tp=inv(t(tr)).
compute b2=sqrt(cssq(tp)).
compute b3=b2.
loop #i=2 to #nfac.
compute b2={b2;b3}.
end loop.
compute tp=tp&/b2.
print tp/title="実際の変換行列 tp "/rnames=num2/cnames=num2.

*因子パタン行列 Pp.
compute Pp=t(a)*inv(t(tp)).
print Pp/title="因子パタン行列 (promax)"/rnames=vname/cnames=num2/format="f5.3".

*因子構造行列 Sp.
compute sp=t(a)*tp.
print sp/title="因子構造行列 sp"/rnames=vname/cnames=num2/format="f5.3".

*因子間相関行列 cp.
compute cm=t(tp)*tp.
print cm/title="因子間相関行列 cm"/rnames=num2/cnames=num2/format="f5.3".
end matrix.
*-------終わり--------.
メニューへ  トップへ (92)へ

堀 啓造ホームページへ