lionusの日記(旧はてなダイアリー)

「lionusの日記」http://d.hatena.ne.jp/lionus/としてかつてはてなダイアリーにあった記事を移転したものです。

欠損値があるデータは悩ましいのです。

SPSS統計パッケージ (1)

SPSS統計パッケージ (1)

SPSS統計パッケージ(2) 解析編

SPSS統計パッケージ(2) 解析編

確か,上記の本を参照してSPSSのコマンドシンタックスを書き,卒論の頃は統計処理をしていた記憶があります。
先日の日記では,「卒論と修論ではSASを利用」と書いたのと一致しませんが,実は卒論作成当初はSPSSを使っていました。しかし,データ処理の途中でSPSSではやりたい処理(ファイルの結合)が出来ないと,独学でSASに鞍替えした記憶があります。でも,改めてぐぐってみたら,もしかして当時のSPSSのコマンドシンタックスでも出来たのではないか?と思ったりもしています。

  • ADD FILES:ケースの追加(データセットを縦に結合する)→もしかしたら,結合したいファイル同士で変数が非対称(例えば,ファイルAには含まれていないが,Bには含まれている)だとエラーが出たのかもしれない。

似たようなコマンドシンタックスとして,次のようなものもあります。

  • MATCH FILES:変数の追加(データセットを横に結合する)→使い道としては,同一対象に事前/事後など複数回調査をして,その各調査のデータを(個人を特定するID等をキーにして)ひとつにまとめて処理をしたい場合など。

ただ,当時は上記の本をなめるようにして読み,端末上で試行錯誤を繰り返した結果,SPSSじゃダメだけどSASなら出来たと判断してSAS使いになったので,何か今では思い出せない条件に引っ掛かっていたのだと思います。
さて,先日相談を受けた内容ですが,

  1. 特定の条件にあてはまる場合に特定の変数にプラス点を与える
  2. それらの得点を合計して,「××尺度」とする

という,条件別処理と合計の計算が必要なものでした。
まずは,

所属集団(変数c1)
orgとjorgが同数であれば0を与える
org>jorgであれば1を与える

のように,処理方針を日本語で書いた上で,SPSS(バージョン16.0)のヘルプからCommand Syntax Reference(英語)を参照し,使えそうなコマンドシンタックスを使い以下のように書いてみました。

do if (org=jorg).
compute c1=0.
else if (org>jorg).
compute c1=1.
end if.

VBAとかプログラミングを知っている人なら,もしかするとあれ?と思うかもしれません。
do ifの前に,何故「compute c1=0.」のように,変数c1にゼロを代入しておかないのかと。
それには理由がありまして,扱うデータの変数orgとjorgには,欠損値が含まれるからなのです。欠損値があるケースに対して,c1が計算されては困るので,orgとjorgのどちらかあるいは両方が欠損している場合,処理されないようにわざと,do ifの前に「compute c1=0.」を入れなかったのです。
上記のように記述すれば,SPSSは指示した条件にあてはまるケースのみ処理するので,欠損値がある場合,処理されずc1は空白=システム欠損値になります。
他には,

職場の同僚との関係(変数c2)
jatworkが5か6で,かつ,mtofjobが1か2であれば1を与え,そうでない場合は0を与える

こんな条件もあり,以下のように記述してみました。

do if (jatwork>=5) and (mtofjob<=2).
compute c2=1.
else if (jatwork>=5) and (mtofjob=3).
compute c2=0.
else if (jatwork<5) and (mtofjob>0).
compute c2=0.
end if.

これについては,もうひとつ書き方の候補はあります。前述の日本語で書いた条件を「直訳」すればこちらの方が適切なような感もあるでしょう。

do if (jatwork>=5) and (mtofjob<=2).
compute c2=1.
else.
compute c2=0.
end if.

でも,これは不適切なのです。
ひとつ前に示したように,2つの変数のとりうる値による組み合わせをカバーするように「愚直」に書かずに,「else」でバッサリ処理してしまうと,変数jatworkとmtofjobのどちらかあるいは片方に欠損値が含まれる場合でも,変数c2に「ゼロ」という値が代入されてしまうからです。
合計の計算をする際にも欠損値対策は必要でして,

compute integ=sum(c1 to c4)

と書いちゃうと,変数c1,c2,c3,c4のいずれかに欠損値が含まれていても,SPSSは合計値を計算してくれるのですね。4つの変数全ての値が揃ってくれていないと合計値は(研究上)指標としての意味を成さないので,それでは困るわけです。
で,他には

compute integ=sum(c1,c2,c3,c4)

こんな書き方もあるので,最初はこれでやってみたのですが,処理結果を見てやめました。
この場合でも欠損値ありのケースを処理しちゃっていました。16.0より前のバージョンを使っていた頃は,カンマで区切って逐一変数を指定していたら,欠損値ありのケースはSUM計算しなかったような記憶があったのですが・・・錯覚だったのでせうか。
仕方がないので,全然エレガントでないのですが

compute integ=c1+c2+c3+c4.

こういう風に書きました。
そしたら,c1〜c4の4つの変数のうち1つでも欠損値がある場合,処理をせず変数integがシステム欠損値となってくれるようになりました。
めでたし,めでたし。