SPSS ときど記(41〜50)

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

(31)〜(40) ときど記(メニュー)へ  (51)〜(60)

  1. SPSS ときど記(50) 2000/ 6/24 スクリプト ListBox 押されているキーを捕捉できない
  2. SPSS ときど記(49) 2000/ 6/20 SET mxmemory と workspace
  3. SPSS ときど記(48) 2000/ 6/19 IGRAPH 縦軸タイトルの出力がドラフトビューアとビューアで異なる
  4. SPSS ときど記(47) 2000/ 6/18 出力 同じセッションでビューアとドラフトビューアを切り替える
  5. SPSS ときど記(46) 2000/ 6/17 スクリプト データを直接参照できない(解決編)
  6. SPSS ときど記(45) 2000/ 6/16 スクリプト ダイアログでのダブルクリックの解釈
  7. SPSS ときど記(44) 2000/ 6/15 分散分析 被験者間要因で前提を満たさないときの処理法
  8. SPSS ときど記(43) 2000/ 6/15 スクリプト ダイアログ(textbox, CheckBox 等)からの値の取得
  9. SPSS ときど記(42) 2000/ 6/14 10.0.5 IGRAPHとデータ
  10. SPSS ときど記(41) 2000/ 6/12 10.0.5 マイナーバージョンアップ

SPSS ときど記(50) 2000/ 6/24

スクリプト ListBox 押されているキーを捕捉できない

スクリプトのダイアログのListBox においえて押されているキーを捕捉できない。
SPSS ときど記(45)ではダブルクリックだけの問題のように書いたが,実はクリック以外の入力は同様の反応をする。

ListBox が変数の指定に使われるのでいくつかきちんと捕捉してほしいキーがある。shift+mouse, control+mouse, Page Up, Page down, 矢印キーである。そのなかでも最初のshift+mouse は変数を範囲指定するために必要である。しかし,shift や cntrl は無視されているようである。いずれにしても,どのキーが押されているのかわからないので,それによって処理を変えることができない。唯一,クリックとその他の区別ができるだけである。

45およびここで指摘した困難のなかで,数量化3類スクリプトは,かなり頑張っているといえる。

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

SPSS ときど記(49) 2000/ 6/20

SET mxmemory と workspace

matrix 言語を走らせて,次のメモリで,大きな行列を使用する
MXMEMORY (maximum cumulative memory) = 14,300K bytes
256K bytes are currently allocated.

WORKSPACE (special workspace memory limit) = 1,000K bytes.

と次のようなエラーが起こることがある。

Number of locations requested = 123520; Number of locations available = 12699
>Error encountered in source line # 2831

>Error # 12477
>MATRIXの作業領域が使い果たされています。追加のメモリを割り当ててから再
>度実行するか、RELEASE宣言を使って未使用の行列を解放してください。割り
>当てるすべての対象をリストするには、DISPLAY宣言を使ってください。ある
>いは、SET WORKSPACEコマンドで作業領域を増やしてください。 , or change the
>Special Working Memory Limit in the Options Dialog Box.
>This command not executed.

MXMEMORY (maximum cumulative memory) = 14,300K bytes
1,327K bytes are currently allocated.

WORKSPACE (special workspace memory limit) = 3,000K bytes.

このようなエラーを起こすと,メモリーを大幅に消費するようである。

1,327K bytes はこのSPSSセッション中常に使ってしまう。また,同じworkspace 不足のエラーを起こすとまた追加されてしまう。という意味ではこのタイプのエラーを繰り返したときはセッションを中止して,再度SPSSを立ち上げたほうがいい。

英語の警告に従って,オプションのダイアログを開ける(編集→オプション)。そしてヘルプを見る。

[専用ワークスペースのメモリ制限]
(略)
「ワークスペースの割り当てを変更しなければなりません」というメッセージが表示された場合、専用メモリ ワークスペースの制限を大きくします。新しい値を決めるには、メモリ不足メッセージの前に出力ウィンドウに表示される情報を使用します。ワークスペースの割り当てを増やすと特定状況下では性能を低下させるので、手続きの終了後、制限を以前の容量 (デフォルトは 512K) に戻してください。(太字筆者)
どういう風に参考にしたらいいかよくわからないですね。どういう単位で出力されているのでしょう。

mxmemory よりは下であることは間違いない。この例では,mxmemory は14,300K byteなので,だいたい14Mbyte ですね。上の例ではworkspace は 3000Kbyte ,約3Mbyte で走る。SPSSのシステムが消費している容量を考えても十分に余裕がある。そういう意味ではけちけちせずに大幅に増やしてみるのも一つの手だ。

それにしても非常に小さいシンタックス,20サンプル,7変数のデータをbegin data end data から読み込んで,value labels, var labels を付けるだけのものでもwork space が足りないと文句を言ってくる。しかもlabel はちゃんとついている。どうなってるの。

mxmemory は自由に設定もできるようなのですが,実際にはどのように決めているのでしょうね。Windows の仮想メモリと関係はあるのだろうか?

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

SPSS ときど記(48) 2000/ 6/19

IGRAPH 縦軸タイトルの出力がドラフトビューアとビューアで異なる

SPSS for Windows 10.0.5J です。

一部省略してます。次のように,2次元の散布図を描き,軸のタイトルに漢字と数字が入っている場合,縦軸タイトルは縦書きで表示されます。ドラフトビューアの場合,全角アラビア数字も縦書きで表記されますが,ビューアは半角横向き(つまり寝ている)で表記されます。これでは,そのままプレゼンテーションできないですね。ちなみに3次元プロットの場合,ドラフトビューアでも半角で寝ています。このレベルは仕様というよりバグですね。なんで全角であるということを尊重しないのだ。

IGRAPH
/VIEWNAME='3類係数 1x2 散布図'
/X1 = VAR(h3s1) TYPE = SCALE title='第1軸'
/Y = VAR(h3s2) TYPE = SCALE title='第2軸'
/TITLE = '数量化3類'
/SCATTER COINCIDENT = NONE.
exec.


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

SPSS ときど記(47) 2000/ 6/18

出力 同じセッションでビューアとドラフトビューアを切り替える

SPSSは一度立ち上げると同じビューアかドラフトビューアに出力が固定されてしまう。切り替えるには,
ファイル→新規作成→(出力またはドラフト出力)

ところが前の出力に戻ることができない。

スクリプトでは,自由にビューア(出力)とドラフトビューア(出力)を切り替えることができる。

そこで,ビューアとドラフトビューアを切り替える
スクリプトを作った。ただし,戻るのは最後に使った,ドラフトビューアまたはビューアである。起動していなければ起動する

一般にはビューア(出力)でよいが,対数線形モデルのようにテキスト出力が多い場合にはドラフトビューアでみたい。また,行列言語でくんだ出力(例えば拙作数量化3類)もドラフトビューアのほうがいい。シンタックスや行列言語などのデバッグ中もドラフトビューアのほうが便利である。一般に,テキストだけならドラフトビューア,図はビューアがいい。ピボットテーブルはどちらともいいにくいが,ドラフトビューアでは数字が右寄せにならないなどの問題がある。

ところで,スクリプトのoleの問題が一つ。ドラフトビューアとビューアを並列して使っていて,例えばビューアを削除した場合,削除したビューアが存在し,そこに出力するようになっていることがあり,きちんとビューアを起動できない。そこで,3回起動するという工夫をしている。

SPSSのビューア(出力)のテキスト出力はなぜあんなに操作しにくくしているのだろうか?なかのテキストと出力の窓をせめて,SPSSビューアの窓の大きさに合わせればかなりよくなる。なぜそうしないのだろうか。しないのなら,いっそ,全ての出力を展開して,ビューアのスクロールにまかせればいいのだが。あまりにも操作しにくい。

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

SPSS ときど記(46) 2000/ 6/17

スクリプト データを直接参照できない(解決編)

SPSS ときど記(27)において,
スクリプトからデータ文書にあるデータを直接参照できないようです。
と書いたが,直接参照できることが分かった。

ヘルプからすると,次の(1)のようにすればいいはずなのだが,必ずしもうまくいかない。理由はデータエディタのスクロール中にデータがで表示されることが,同じように処理中におこり,を拾ってしまうためだ。

そのエラーをトラップして再度同じデータを読むのがよい戦略のようだ。

書き込みはsendkey を使わずに,clipboard 経由でpaste する。sendkey を使うと,日本語変換が作動している場合,思った操作をしてくれない。同じ変数に入力するには,配列変数を使うのではなく,下の例のように &vbCrLf を込みにして,クリップボードに入れる。

'----------------------------------------
Sub getandputdata()
Dim objDocuments As ISpssDocuments
Dim objDataDoc As ISpssDataDoc
Dim lngNumCases As Long

Set objDocuments = objSpssApp.Documents
Set objDataDoc = objDocuments.GetDataDoc (0)

' ファイルに含まれているケースの数を取得する
lngNumCases = objDataDoc.GetNumberOfCases

If lngNumCases=0 Then
MsgBox "データがありません。終了します。"
End
End If

'新変数を作るにはやはり,シンタックス
Dim strCommand As String
strCommand = "string plabel (a11)." &vbCrLf
strCommand = strCommand + "exec." &vbCrLf
objSpssApp.ExecuteCommands strCommand , True
'シンタックスを実行する。 True は終了までまつ。同期させるということ。

'(1)本来なら,次のvariant を使えば簡単にデータをget できるはず。
'Dim SpssTextData As Variant
'SpssTextdata = objDataDoc.GetTextData ("varcat", "varcat", 1, lngNumCases)
'しかしちょっとケース数が多いとエラーがでてしまう。使用環境によってはこれでいいだろう。
'(2)そこで一つずつデータを読む

'(3)エラーとラップの仕掛け:
'データスクロールが遅いので,? を受け取ることがある。
'そのときエラーとしてトラップし,(14)で時間を1秒おき, (4)のところに戻り,再度読み込む。

On Error GoTo errortrap

Dim i As Integer, j As Integer, k As Integer
Dim xd As Variant,slabel As String
For i=1 To lngNumCases
'(4)(8)でエラーがでたときここから再度読み込む
restart:
'(5)(2)の一つずつ読むの実行部
xd=objDataDoc.GetTextData ("varcat", "varcat", i, i)
'(6)シンタックスのときのSPSSのお薦めのポーズの入れ方だが,効果無し
While objSpssApp.IsBusy
'pause
Wend
'(7)一定の時間をおく方法も試みたがエラートラップのほうが有効であった。
'If (Int(i/30))*30=i Then Wait 1
'ここからはラベルを作るための作業で無視していい
'(8)ここでエラーが生じる。xdはvariant だが,数値型で入るデータ。(もし文字型だったらどうなる)
j=Val(Right$(CStr(xd(0,0)),2))
k=Int(xd(0,0)/100)
'(9)データ書き込みをslabelにためている。
'slabel=slabel+cstr(xd(0,0)) &vbCrLf でよい
slabel=slabel+strVarsSelected(k-1)+"_"+CStr(j) &vbCrLf
Next i

'(10)書き込みの最初の位置を決めている。gettextdata は読み込みのための命令だが,これでも動いている
xd = objDataDoc.GetTextData ("plabel", "plabel", 1, 1)

'(11)クリップボードに書き込む
Clipboard$ slabel
'(12)クリップボードへの書き込みは意外と時間がかかることがあるので,安全のためwait 1秒
Wait 1
'(13)クリップボードからデータエディタに書き込み。 &vbCrLf で一つずつリターンが入っているので,順々に書き込んでいく。こっちは高速。
objDataDoc.Paste

Exit Sub
'(14)エラートラップはexit sub のあとに。
errortrap:
Wait 1
Resume restart:
End Sub


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

SPSS ときど記(45) 2000/ 6/16

スクリプト ダイアログでのダブルクリックの解釈

スクリプトのダイアログはダブルクリックを解釈するようである。ボタン関係はダブルクリックしても影響がない。ところが,作成中のスクリプトのListBox では,ダブルクリックをすると,処理が始まってしまう。

いくつかチェックを入れたところ,
(1)ダブルクリックをOKボタンを押したと解釈している。
(2)そこで,OKボタンを普通のPushBottunにOKを付けたものにした。
(3)すると,cancel ボタンと解釈する。そこで,これも普通のPushBottunに cancel とつけた。
(4)すると,普通のボタンの動作をする。どうも,Begin Dialog UserDialog の一番近くにあるPushBottun の動作をする。

(5)そこで,ダブルクリックを殺すため,一番上になにも動作しないPushBotton をつけた。これを enable "no", false(no はfield 名/DlgItem) のようにすれば,そのボタンを押しても反応しないし,ダブルクリックによる動作もしない。



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

SPSS ときど記(44) 2000/ 6/15

分散分析 被験者間要因で前提を満たさないときの処理法

Coombs et al.(1996) は, t検定, F検定, HottelingのT検定,MANOVAと前提を満たさないときの代替案のシミュレーション研究をまとめたものだ。

いろいろ条件があって単純ではないのだが,

前提を満たさないとき(著者のまとめでは)
(1)t検定→Wilcox H
(2)F検定→Wilcox Z
(3)T検定→the Kim, the James second-order, the Johansen(WJ)のどれか
(4)MANOVA→the Coombs-Algina U*, the James second-order, or the Johansen のどれか

(1)のときは,Welch もいいのだけど,統計パッケージによって計算が違うことが問題。Wicox の方法は trimmed means を使っている分だけ歪みに強い。

この論文の中で Wilcox(1996)に言及があったので,確かめてみた。minitabのマクロが付録のFD についている特殊な本というぐらいにしか見てなかったのだが,Coombs らが言及している(1)(2)関係の手法はかなりカバーしている。しかもminitab マクロつき。

ということで,Wilcox の本はなかなかの本です。ただ,minitab は少し触った程度でほとんど知らないので,このマクロからSPSSの行列言語に直すことができるか疑問。

Algina はいくつかをSASのiml で組んでいるようだ。

例によってSPSSではこういうのについていくのはしんどい。分散分析はやっぱりSASか。

《引用文献》

Coombs, W.T., Algina, J., and Oltman, D. (1996). Univariate and Multivariate omunibus hypothesis tests selected to control type I error rates when population variances are not necessarily equal. Review of Educational Research, 66, 137-179.

Wilcox, R.R. (1996). Statistics for the social sciences. Academic Press.

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

SPSS ときど記(43) 2000/ 6/15

スクリプト ダイアログ(textbox, CheckBox 等)からの値の取得

スクリプトのヘルプは昔の大型計算機のマニュアルを思い出すほど,わかりにくい。サンプルを見ながら,いろいろ実験してみるしかない。

ダイアログにCheckbox を付けたのだが,値の設定の仕方は例からもわかったのだが,どういうふうに値を参照したらいいかわからない。
例えば,
Begin Dialog UserDialog .....
.......
CheckBox 510,28,130,14,"係数のプロット(1-3)",.zucoef
......
End Dialog

というように zucoef の CheckBox を設定しているとする。
チェックしている場合は

Dim dlg As UserDialog
dlg.zuscore = 0

チェックしていない場合は
dlg.zuscore = 1

というように,既定値を設定できる。

では,値を参照するときには,

DlgValue("zucoef")
を使う。

例えば, If DlgValue("zucoef")=0 Then

という形で使う。

数値のときは,このように DlgValue("field 名")を使う。
文字のときは,DlgText("field名")を使う。
field 名のところをヘルプはDlgItem($) といっている。ヘルプではfield の説明は検索できますが,DlgItem の説明は検索できません。

ヘルプからすると,値の設定は DlgValue でできるようですね。

DlgValue "Direction",0

という例がある。

DistPlot.sbsが値の参照のいい例になっている。このスクリプトは,ダイアログをハードに使いこなしている。こんなことするの?

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

SPSS ときど記(42) 2000/ 6/14

10.0.5 IGRAPHとデータ

SPSS 9J ではうまく動いていたのに10.0.5 ではうまく動かなくなったものにIGRAPH がある。

次のプログラムを動かしてみよう。graph ならうまくいくが,igraph だとおかしい。場合によってちょっと違うが,同じグラフを描く。9.0Jならちゃんと違うデータを使ったデータを描く。

SPSS社は連続にせず,一回ごとに区切ってigraph を起動すればちゃんと描くという。今回,別のシンタックスで分かったのだが,igraph が図を描く前に次次とシンタックスを処理していて,igraph が描くときには,別のデータが(データエディタ)にある。つまり,(少なくともデータを処理する)シンタックスとigraph の同期がとれていないのである。

10.0.5において同期させるには,スクリプトを使うしかない。

objSpssApp.ExecuteCommands strCommand , True
というのだ。True で同期させる。false で同期させない。

10.0.5 の igraph 全てに不信感を持っていたのだが,そうではないようだ。

********************************************.
* This section creates the sample data file.
********************************************.

SET SEED=87654321.
INPUT PROGRAM.
LOOP #I = 1 TO 30.
COMPUTE q= TRUNC(UNIFORM(1)*8)+1.
COMPUTE a= TRUNC(UNIFORM(1)*5).
COMPUTE group=TRUNC(UNIFORM(1)*3).
END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
EXECUTE.
FREQ VAR=q a group.
cross table=q by a by group.

SAVE OUTFILE='temp.sav'.

********************.
DEFINE !graph (group=!TOKENS(1)
/mytitle=!CMDEND)
GET
FILE='temp.sav'.
SELECT IF (group=!group).
EXECUTE.
IGRAPH /VIEWNAME='Bar Chart' /X1 = VAR(q) TYPE = categorical /Y = $count
/TITLE=!mytitle /BAR KEY=ON
/COORDINATE = VERTICAL /X1LENGTH=3.0 /YLENGTH=3.0 /X2LENGTH=3.0
/CHARTLOOK='NONE' .
execute.
!ENDDEFINE.

!graph group=0 mytitle='Group 1'.
!graph group=1 mytitle='Group 2'.
!graph group=2 mytitle='Group 3'.
*********************.

《追記:2000/7/27》
10.0.7では直ってます。

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

SPSS ときど記(41) 2000/ 6/12

10.0.5 マイナーバージョンアップ

先日,SPSSジャパン社からSPSSのマイナーバージョンアップの連絡があった。
catpca において指摘したメニューのバグが直るそうだ。igraph のバグも報告したがこの点については,特に連絡はない。もっともigpraph のバグはすでにバグリストの中に入っていたそうだ。

6月下旬か7月初旬を予定しているそうだ。ファックスできたが,なぜSPSS社はe-mail によるバグの通知などしないのだろう。また,e-mail による相談も受け付けない。adobe 社もe-mail による相談を受け付けない。fax だとこちらも不便だし,入力しなおさなければいけないものもある。このときど記を始めたのも e-mail だとバグの通知も受け付けないという態度に嫌気がさして始めたものだ。

あわてて,ここで指摘していることをいくつか連絡してみた。一つは簡単なことなので,このバージョンアップに間に合うことを祈る。

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

堀 啓造ホームページへ