SPSS ときど記(131〜140)

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

(121)〜(130) ときど記(メニュー)へ  (141)〜(150)

  1. SPSS ときど記(140) 2003/06/19 homals等 数量化3類と順序尺度項目−馬蹄形問題
  2. SPSS ときど記(139) 2003/06/15 SPSS11.5.2.1 bug fix
  3. SPSS ときど記(138) 2003/06/03 グラフ 頻度をグラフ化する
  4. SPSS ときど記(137) 2003/05/26 散布図 回帰直線
  5. SPSS ときど記(136) 2003/05/16 SPSS11.5.2 bug fix
  6. SPSS ときど記(135) 2003/03/29 因子分析 階層因子分析マクロ&スクリプト
  7. SPSS ときど記(134) 2003/03/29 因子分析 プロマックス回転マクロ&スクリプト
  8. SPSS ときど記(133) 2003/03/24 因子分析 extension スクリプトのプロマックス回転
  9. SPSS ときど記(132) 2003/03/18 因子分析 拡張因子分析・高次因子分析 extension script
  10. SPSS ときど記(131) 2003/03/10 スクリプト SPSS 11.0,11.5 と数量化3類script

SPSS ときど記(140) 2003/06/19

homals等 数量化3類と順序尺度項目−馬蹄形問題

数量化3類やhomals,対応分析において生じる馬蹄形(horse shoe)問題について詳細な解説と対処法を記した。
 
数量化3類と順序尺度項目−馬蹄形問題
 catpca を使うのが一つの解決策です。

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

SPSS ときど記(139) 2003/06/15

SPSS11.5.2.1 bug fix

SPSS の11.5.1, 11.5.2 のバグフィックスバージョンがでた。
http://www.spss.com/tech/patches/SPSS-1152.htm

11.5.2だとexcel 形式のセーブでどえらいエラーが生じるとのことだったが,bug fix したようだ。spssx メーリングリストでもOKとのことだった。
メニューへ  トップへ (140)へ


SPSS ときど記(138) 2003/06/03

グラフ 頻度をグラフ化する

学生の成績の分布を知るために素得点の頻度のグラフを作りたくなった。
excel なら次のようにグラフ化する。
(excel の階級別度数集計 の仕方は
http://www.edupsy.sed.tohoku.ac.jp/cai/excel/kiso2.html 。 度数集計frequencyするところが重要。そして棒グラフ作成。)

SPSSでは
分析→記述統計→度数分布表→図表
とすると,棒グラフ or ヒストグラムを描くオプションがある。
ヒストグラムを描いてみよう。

だいたい希望通りですが,x座標の項目名が整数値で表示されない。

そこで,棒グラフにしてみよう。

今度は頻度0の得点はスキップされてしまう。これはヒストグラムよりもよくない。

グラフ→棒グラフ
を使って棒グラフを書いてみよう。

上の棒グラフと同じでだめである。
グラフ→インタラクティブ→ヒストグラム


一見うまくいっているようであるが,得点1ずつのグラフにはなっていない。これはなんじゃ。おざなりにみると「これでいいのだ」と思ってしまう。問題のグラフ化。なお,既定値のグラフをいろいろいじっている。さらに工夫をすれば思っているグラフを描けるのかもしれない。

グラフ→インタラクティブ→棒グラフ

一応成功だ。しかし,既定値では棒グラフの幅が広すぎるので,そこを変更した結果だ。

既定値だと次のグラフになる。結構変更を加えていることがわかるだろう。幅ぐらいなんとかしてほしいよね。
インタラクティブグラフの中でダブルクリック→メニューバーの左から3番目のアイコンクリック
図表マネージャー→要素の棒→編集→棒の幅 こいつを変更する(既定値にできるのか?)


結局

グラフ→インタラクティブ→棒グラフ
を用いて作成する。一度作図してから各種の修正を加える。
インタラクティブグラフの中でダブルクリック→メニューバーの左から3番目のアイコンクリック
図表マネージャー→要素の棒→編集→棒の幅
 こいつを変更する

そのほか図表マネージャーの中をいじりまくる。

実験してみたい人のためのデータ(bartest.sav)

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

SPSS ときど記(137) 2003/05/26

散布図 回帰直線

グラフの散布図の中で「回帰直線を引く」のに悩んだ。一つはインタラクティブグラフで,変数がなぜか名義になっていた。スケールに変更したが,何度もダメだしをされた。どうも一度きちんとデータを保存したほうがいいようだ。最初に名義尺度になっていないかチェックしたほうがいい。

次に通常の散布図の場合にもそのオプションがあるかどうか悩んだ。
ヘルプには「散布図のオプションの線の当てはめの設定」に説明がある。
[散布図のオプションの設定] で、既存の図表を修正できます。図表を新規に作成するには、[グラフ] メニューを使用します。

[当てはめ手法] グループから、当てはめ手法を選択します。線型回線、局所的重み付け回帰平滑法、2 次回線、3 次回線を選択できます。
とあるが,どこからどう操作するのか不明である。

一度グラフ(散布図)を書いてから,グラフをダブルクリック→SPSS図表のエディタのメニュー→図表→オプション→(散布図オプションの設定)→線の当てはめ→(全体)をチェック→当てはめのオプション→線型回帰

となる。省略せずに書いて欲しい。

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

SPSS ときど記(136) 2003/05/16

SPSS11.5.2 bug fix

SPSS の11.5.1 のバグフィックスバージョンがでた。
http://www.spss.com/tech/patches/SPSS-1152.htm

日本語版もこれでパッチできる。なぜかSPSSジャパンではアナウンスしていない。

EXCEL がらみのトラブルがいくつか解消されているらしい。11.5.1j で特に虎ぶった記憶がない。そのほかいくつかバグフィックスしている。

ただし,11.5.1のほうがまともだという書き込みもある。パッチをあてないほうがいいかもしれない。


ps. 早くもなくなってますね。パッチはあてないほうがいいということか。すでにあててしまったのだが。(2003/5/19)

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


SPSS ときど記(135) 2003/03/29

因子分析 階層因子分析マクロ&スクリプト

階層因子分析 macro & script を作った。拡張因子分析の高次因子分析ではなく、階層因子分析である。具体異例は階層因子分析 macro & scriptにある。各変数の高次因子への負荷がわかるのがいい。

SPSS ときど記(132)の参照先を参照してください。

因子数決め打ち型なので、事前に因子数を決定しておいてください。因子数の決め方については、parallel analysis (因子分析の因子決定法)因子数決定法の検討を参考にしてください。ソフトとしては、忍者ハットリ君および因子分析の因子数決定法 script を使ってください。

階層因子分析については日本心理学会大会2000ワークショップ心理学の基礎(6) 因子分析の基本問題にもあります。パワーポイントの中も見てください。

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


SPSS ときど記(134) 2003/03/29

因子分析 プロマックス回転マクロ&スクリプト

プロマックス回転 macro & script を作った。
SPSS ときど記(133)のシンタックスをマクロとスクリプトにしたものだ。
メニューへ  トップへ (135)へ

SPSS ときど記(133) 2003/03/24

因子分析 extension スクリプトのプロマックス回転

スクリプトの元のextension シンタックスを検討していて気づいたのだが,プロマックス解がSPSSの結果と一致しない。詳細にチェックしたところ,目標行列の作り方がちょっと違う。これを修正すると,SPSSの結果と一致することが分かった。階層因子分析でない点も気になる。そのうち入れ替えよう。

とりあえず,どのようになるのかは次のシンタックスに。データ決め打ち,因子数決め打ちのまったくの暫定版です。適当に修正してつかってください。本当はマクロ化するほうがいいのでしょうが,目標行列の作り方の部分をextensionスクリプトの該当部分と差し替えれば動くはずです。

データはO'Connen 氏のデータを使ってます。それがc:\spss\macro\trial.datにあることになってます。

参考構造(reference structure)については,狩野さん@大阪大学のホームページのパワーポイントを参照してください。
斜交解と因子寄与率

参考軸などを出力するのが,SPSSとは違う。

*--------------.
data list file='c:\spss\macro\trial.dat' free / v1 to v18.

set length=none printback = off width = 120 mxloops = 9000.
matrix.

get data / file=* / name=varnames /variables = v1 to v18.

compute cases = nrow(data).
compute nvars = ncol(data).

compute nfactors=3.
compute extract=1.
compute rotate=1.
compute ppower=3.
compute itercfa=25.
compite loadmat=1.
compute tolprn=0.00001.
compute core=nvars.

compute num2={' 1',' 2',' 3',' 4',' 5',' 6',' 7',' 8',' 9',
'10','11','12','13','14','15','16','17','18','19',
'20','21','22','23','24','25','26','27','28','29',
'30','31','32','33','34','35','36','37','38','39',
'40','41','42','43','44','45','46','47','48','49',
'50','51','52','53','54','55','56','57','58','59',
'60','61','62','63','64','65','66','67','68','69',
'70','71','72','73','74','75','76','77','78','79',
'80','81','82','83','84','85','86','87','88','89',
'90','91','92','93','94','95','96','97','98','99','100'
}.

* 相関行列.
* correlation matrix.
compute zscores = make(nrow(data), ncol(data), -999).
compute n = nrow(data).
compute nm1 = n - 1.
loop #a = 1 to ncol(data).
compute mean = csum(data(:,#a)) / n.
compute sd = sqrt ( cssq((data(:,#a)- mean)) / nm1 ).
compute zscores(:,#a) = (data(:,#a) - mean) / sd.
end loop.
compute rdata = (1 / (nrow(data)-1) ) * ( t(zscores) * zscores ) .

compute rcore = rdata(1:core,1:core) .
compute r = rcore.
compute evals1 = eval(r).

* Factor Extraction >>>>>>.
* 主因子解 extract=1; 最大反復数 itercfa; 相関行列 r; =>負荷量 lding.
* CFA / PAF -- from Bernstein p 189 -- smc = from Bernstein p 104.
do if ( extract = 1).
compute rcfa = r.
compute smc = 1 - (1 &/ diag(inv(rcfa)) ).
loop #a = 1 to itercfa.
call setdiag(rcfa,smc).
call eigen(rcfa,eigvect,eigval).
compute eigval = mdiag(eigval).
compute lding=eigvect(:,1:nfactors)*sqrt(eigval(1:nfactors,1:nfactors)).
compute communal = rssq(lding).
do if ( mmax(abs(communal-smc))< tolprn ).
break.
else.
compute smc=communal.
end if.
end loop.
end if.
print lding/rnames=varnames/title= '初期解'/format= f8.3.


* 主成分分析終了.
* バリマックス回転→プロマックス回転 rotate=1;.
* Promax rotation -- Marcus, 1993.
do if ( rotate = 1).
* varimax rotation -- Marcus, 1993, in Reyment & Joreskog,
Applied Factor Analysis in the Natural Sciences, CUP.
compute b=lding.
compute n = nrow(lding).
compute nf = ncol(lding).
compute hjsq=diag(lding*t(lding)) .
compute hj=sqrt(hjsq).
compute bh=lding &/ (hj*(make(1,nf,1))) .
compute Vtemp=n*rsum(csum(bh&**4))-rsum(csum(bh&**2)&**2) .
compute V0=Vtemp.
loop #it=1 to 10 .
loop #i =1 to nf-1 .
compute jl=#i+1 .
loop #j=jl to nf.
compute xj=lding(:,#i) &/ hj.
compute yj=lding(:,#j) &/ hj.
compute uj=xj &* xj-yj &* yj.
compute vj=2*xj &* yj.
compute A=csum(uj).
compute bigB=csum(vj).
compute C=t(uj) * uj - t(vj) * vj.
compute D=2 * t(uj) * vj.
compute num=D-2*A*bigB/n.
compute den=C-(A**2-bigB**2)/n.
compute tan4p=num/den.
compute tan4p = num / den .
compute artanp = ( artan(abs(tan4p)) ) / 4.
do if (num>0 and den>0).
compute phi = artanp.
else if (num<0 and den<0).
compute phi = -1 * (.7854 - artanp) .
else if (num<0 and den>0).
compute phi = -1 * artanp.
else if (num>0 and den<0).
compute phi = .7854 - artanp .
end if.
compute angle = phi * 180 / 3.1415926 .
do if ( abs(phi)>.00001 ).
compute bigXj=cos(phi)*xj+sin(phi)*yj.
compute bigYj=-sin(phi)*xj+cos(phi)*yj.
compute bj1=bigXj &* hj.
compute bj2=bigYj &* hj.
compute b(:,#i)=bj1.
compute b(:,#j)=bj2.
compute lding(:,#i)=b(:,#i).
compute lding(:,#j)=b(:,#j).
end if.
end loop.
end loop.
compute lding=b.
compute bh=lding &/ (hj*(make(1,nf,1))) .
*compute Vtemp=n*rsum(csum(bh&**4))-rsum(csum(bh&**2)&**2) .
compute Vtemp=n*rsum(csum(bh&**4))-rssq(cssq(bh)) .

compute V=Vtemp.
do if ( abs(V-V0)< tolprn ).
break.
else.
compute V0=V.
end if.
end loop.
print lding/rnames=varnames/title= 'バリマックス回転 因子負荷量'/format= f8.3.
* プロマックス回転 rotate=1; ppower 累乗.
compute B = lding.
*目標行列がおかしいようなので修正する、.
*共通性.
compute bstar=make(n,nf,0).
*compute ww=make(1,nf,0).
compute comm=rssq(B).
*print comm.
compute comm=sqrt(comm).
loop #i=1 to n.
compute bstar(#i,:)=B(#i,:)&/comm(#i).
end loop.
*print bstar.
compute w=cmax(abs(bstar)).
*print w.

loop #i =1 to n.
compute ww=Bstar(#i,:)&/w.
compute sgn=((ww>0)-(ww<0)).
compute bstar(#i,:)=(abs(ww)&**ppower)&*sgn.
end loop.
*compute Bstar=B&**ppower.
print Bstar/rnames=varnames/title= '目標行列'/format= f8.3.
compute Tr=inv(t(B) *B)*t(B)*Bstar.
print tr/title="プロクラステス変換行列".
compute Tr=Tr*sqrt(inv(mdiag(diag(t(Tr)*Tr)))).
compute Tpp=inv(Tr).
*print tr.
*print tpp.
compute Tpp=inv(sqrt(mdiag(diag(Tpp*t(Tpp)))))*Tpp.
*print tpp.
*参考構造.
compute Sr=B*Tr.
print Sr/rnames=varnames/cnames=num2/title='参考構造'/format= f8.3.
*因子間相関.
compute Phip=Tpp*t(Tpp).
print Phip/rnames=num2/cnames=num2/title='因子間相関'/format= f8.3.
*因子構造行列.
compute Sp=B*t(Tpp).
print Sp/rnames=varnames/cnames=num2/title='因子構造行列'/format= f8.3.
*因子パタン行列.
compute Pp=B*inv(Tpp).
print Pp/rnames=varnames/cnames=num2/title='因子パタン行列'/format= f8.3.
*参考パタン行列.
compute Pr=B*inv(t(Tr)).
print Pr/rnames=varnames/cnames=num2/title='参考パタン行列'/format= f8.3.
*参考軸間相関.
compute Phir= t(Tr)*Tr.
print Phir/rnames=num2/cnames=num2/title='参考軸間相関'/format= f8.3.
*高次因子分析のための相関行列.
compute rff = Phip.
do if (loadmat = 1).
compute lding = Sp.
else if (loadmat = 2).
compute lding = Pp.
end if.
* プロマックス回転終了.
end if.
end matrix.

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

SPSS ときど記(132) 2003/03/18

因子分析 拡張因子分析・高次因子分析 extension script

O'Connen の
extensito マクロ(実はシンタックス)をスクリプトにした。extension.SBS
 すでに一部を利用して、因子数決定法としてスクリプト化している。
 拡張因子分析は因子分析に使わなかった変数の因子負荷量を求めようというものである。あまり使うことはないだろう。
 高次因子分析は1次因子として斜交回転解をもとめ、その因子間相関から2次因子を求めるものである。同じような考えに、階層因子分析がある。これは知能テストなどで昔から考えられている、一般因子などを高次因子として考える。階層因子分析では2次因子も1次因子と同じく因子パタンが変数に対して与えられる。extensionマクロでは高次因子の変数との相関を求めることになる。おそらく、相関係数は平方根をとって、因子パタンと対応させることができるものであろう。
 階層因子分析ならば1次因子の負荷量も少なくなる。
 変数名や因子番号などをつけてなじみやすくしたほか、もとの拡張因子分析と少しだけ拡張している部分がある。2次因子の求め方を一部1次因子から独立させたことである。
モトのマクロよりは使いやすくなっていると思うので試してほしい。

SPSS ときど記(108) 2001/ 9/ 2 因子分析 Gorsuchの Extension macro
SPSS ときど記(90) 2001/ 4/ 4 因子分析 高次因子分析と高次因子のもとの変数の因子負荷量
SPSS ときど記(92) 2001/ 4/ 9 因子分析 階層因子分析
追加
SPSS ときど記(135) 2003/03/29 因子分析 階層因子分析マクロ&スクリプト
SPSS ときど記(133) 2003/03/24 因子分析 extension スクリプトのプロマックス回転

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

SPSS ときど記(131) 2003/03/10

スクリプト SPSS 11.0,11.5 と数量化3類script

spss が11.0 になってから、拙作
数量化3類スクリプト が途中でハングアップするようになっていた。行列言語、シンタックス部分はちゃんと動くので、スクリプトのせいであることは明らかである。そのため、SPSS 10 をはずせないでいた。特に誰からも指摘もないので、誰も使っていないのかもしれない。

時間を少しとって、問題発見にがんばってみた。SPSSのSax Basic Language の仕様が変わったということであることはすぐわかるが、object 等の面倒なところだと思って手を付けなかったのである。発見に時間はかかったが、次のような部分でエラーが起こっていることがわかった。
dim i as integer
k=Int(i/100)

が type mismatch のエラーを起こす。
Int(i/100) がいけない。そこで、
Int(CVar(i)/100)
としたところ、ちゃんと動くようになった。integer の指定などせず最初からvariant にしておけばいいのかもしれない。variant にするのはちょっと気持ちが悪いが、そうすべきなのかも。

ついでに、図の軸表示が間違っているところを修正した。ただ、軸名の付け方はSPSSのやり方のとおり、エクセルと同様になっている。気持ち悪い付け方だ。図の名前のところでX軸とY軸をわかるようにした。

error トラップをかけていたので、どこでエラーが起こっているか発見しにくかった。最終的にエラートラップにかかるところで、
on error goto 0
としてもそれ以前のエラーとラップの指定のところでトラップされている。これはおかしい。

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

堀 啓造ホームページへ