[Q] エラー # 4095が出て「変換プログラムに、閉じていないLOOP、DO IF、または複合ファイル構造が存在します。」などとなり,以後再実行してもエラーが出続けてしまう。
[A] LOOP構文でEND LOOPで閉じられていない,あるいはDO IF構文がEND IF.で閉じられていないなどで発生する。
閉じる命令からのシンタックスを実行することで解消する。
例
DO IF (a<=2).
+compute b=1.
ELSE.
+compute b=0.
*END IF ←本来必要なEND IFが実行されてない.
execute.
このような誤った構文でエラーを出してしまった場合は
END IF.
execute.
だけの部分を選択実行するとエラー状態は解消して正常に動作するようになる。
しかし,複雑にネストした構文など誤った箇所が分からない場合はSPSSそのものをいったん終了し再起動するとエラー状態はリセットされる。
[Q] 行頭に+や-の記号をつけられる?
[A] シンタックスの行頭に+や-の記号をつけることがでる。実行には影響ない。ネスト(入れ子状態)した構文などで,入れ子関係を視認するのに便利?かも。
記号は必ず行の左端に記す。+-の前にスペースがあるとエラーになる。インデント(字下げ)は+-より後ろに設ける。
例
DO IF (i1<=2).
- compute HL1=1.
ELSE IF (i1>=4).
do if (i2>2).
+ compute HL2=1.
ELSE.
+ compute HL2=0.
END IF.
ELSE.
- compute HL1=0.
END IF.
execute.
[Q] 変数の小数点桁をシンタックスで制御したい
[A-1] デフォルトの設定を変更する
SET FORMAT シンタックスを利用する
例)SET FORMAT (F8.0). 全体の文字幅を8文字 整数にする
[A-2] 個別の変数の設定を変更する
FORMATS シンタックスを利用する
例)FORMATS V1(F8.1). 全体の文字幅を8文字 小数点以下第一位で丸める
※設定はいずれもFORTRAN形式。
F:数値(実数)型の意味
8:小数点「.」を含めた全体の文字幅
0:小数点以下の桁数
[Q] シンタックスを実行したときの出力表示を抑制したい
統計処理をせずデータ加工のためにシンタックスを実行しても出力画面が新たに作られてしまい,うるさいのをやめる方法。
[A] 編集−オプションを開き「ビューア」タグ画面を出す
「ログの中にコマンドを表示」のチェックを外す
ただし,この設定にすると,統計処理を行った場合も出力中に対応するシンタックスが記述されなくなる。
参考 ファイルを開いたり閉じたりしただけで出力画面が出るのをやめさせたい
[Q] 条件を満たす変数の数を数えたい
[A]
(1)countを用いる
count n=a1 to a5(5).
a1〜a5について5を持つ変数数がnに返される
欠損値のものを数える時は(SYSMIS)と記述する
count n=a1 to a5(LO thru 5).
a1〜a5について最小値から5までの範囲の数がnに返される(最大値を指定する時はHI)
(2)repeatを用いる
compute n=0. 初期値を必ず設定する
do repeat v=a1 to a5.
do if v<=5.
compute n=n+1.
end if.
end repeat.
a1〜a5について5以下の変数を数えてnに返す
※単に数を数えるだけならcountの方が簡単だが,同じ条件で他の変数も制御したい場合はrepeatの方が便利
[例]
nが5未満の変数の合計をbに求める
compute b=0.
compute n=0.
do repeat v=a1 to a5.
do if v<5.
compute n=n+1.
compute b=b+v.
end if.
end repeat.
さらに条件に合致する変数がある場合は合計を合致した変数数で除し,それ以外はシステム欠損値にする
do if n>0.
compute b=b/n.
else.
compute b=$sysmis.
end if.
[Q] Q統計量の求め方
[A] 次のようなシンタックスを用いる
(1) p%水準でのQの値
COMPUTE Q=IDF.SRANGE(1-p,水準数,df) .
[例] 5%水準,水準数3,自由度60のQ値
COMPUTE Q = IDF.SRANGE(.95,3,5) .
EXECUTE .
データエディタ上の変数Q列に4.602が返される
(2)Q値に対する有意水準
1-CDF.SRANGE(Q, 水準数, df)
[例] Q=4.50 水準数2 df=3の有意水準
COMPUTE P=1-CDF.SRANGE(4.50, 2, 3).
EXECUTE .
データエディタ上の変数P列に.05が返される
※データエディタ上に何らかのデータ(ダミーでよい)が存在する状態でないと実行できない。
[Q] COMPUTE s=a1+a2+a3.と s=SUM(a1 to a3).は何が違う?
[A] COMPUTE s=a1+a2+a3.ではa1,a2,a3のうち一つでも欠損値があればsは欠損値となる
COMPUTE s=SUM(a1 TO a3).では欠損値があっても,有効な数値について加算され s の値となる(すべて欠損値の場合のみ s は欠損値となる)
また足し算ではTOによる省略法は使えない
× COMPUTE s=a1 to a3.
[Q] 欠損値データを除いて計算したい
[A] 「データ−グループごとの分析」をすると,グループ化変数について「欠損値」のグループについても「計算」されてしまい,うっとおしいことがあります。
SELECT IF NOT SYSMIS(グループ化変数).
のようなシンタックスを書くことで,欠損値データを除外することができます。
(例)
「学年」が欠損値のデータをデータシートから除外する
SELECT IF NOT SYSMIS(学年).
SORT CASES BY 学年 .
SPLIT FILE
SEPARATE BY 学年 .
※データシートから欠損値データそのものが消去されますので,計算後にうっかり「保存」をしてしまわぬよう注意が必要です。
[Q] ある変数をシステム欠損値にするには?
[A] COMPUTE V=$SYSMIS
[応用例1] aが0だった場合bを欠損値に置き換える
if (a=0) b=$sysmis.
[応用例2] 複数の変数について一度に処理する場合の例
(a1...a10が0の場合b1...b10を欠損値に置き換える)
do repeat aa=a1 to a10/bb=b1 to b10.
if aa=0 bb=$sysmis.
end repeat.
[Q]ある変数について欠損値を持つケースを除外するには
[A] 例)v1,v2,v3のいずれかに欠損値をもつケースを除外する
FILTER OFF.
USE ALL.
SELECT IF(NMISS(v1,v2,v3) = 0).
EXECUTE .
※データシートから欠損値データそのものが消去されますので,計算後にうっかり「保存」をしてしまわぬよう注意が必要です。
[Q](ケース番号のような)逐次増加する値を持つ変数を作成したい
[A] ケースの順に1,2,3...と増加するvという変数を作成する
COMPUTE v = $casenum .
データシートの変数末尾(右端)に新規変数が生成される
メニューでは[変換]-[計算]-[変数の計算]を開き
「目標変数」欄に新規変数名(v) 「数式」欄に$CASENUMを入れて[OK]
[Q]変数をある値で埋めたい
[A]例)vの値を全ケース1にする
RECODE
v (ELSE=1).
メニューでは[データ]-[値の再割り当て]-[同一変数へ]を開き
「今までの値と新しい値」画面で
「今までの値」欄=その他全ての値,「新しい値」欄=埋めたい値(例では1)
[追加][続行][OK]
[Q]ある変数値の順位を求め新たな変数にしたい
[A]例)性別(sex)ごとの変数vについての順位を求めたい
RANK VARIABLES=v (A) BY sex /RANK /PRINT=YES /TIES=MEAN .
vという変数にsexごとの順位が格納される
※(A)は昇順,(D)は降順による順位
TIES=は同順位の計算方法(MEAN:平均,LOW:最低値,HIGH:最大値,CONDENSE:同じ値に対する同順位)
PRINT=NOとすると計算後に「出力」画面が開かない
グループ(性別)ごとではなく,全体の順位を求めたい時は,BY sexの部分を省く
メニューでは[変換]-[ケースのランク付け]
特定グループごと(性別ごとなど)の順位を行う場合は「グループ」変数に指定する
[Q]横に並んだ別々の変数を,別ケースの同一変数にしたい
[A]例)同一ケース内のR1 to R10, I1 to I10を別のケースのV1 to V10と見なすよう並び替える
(ケース数が2倍になる)
NO | R1 | R2 | ........ | R10 | I1 | I2 | ........ | I10 |
1 | 10 | 11 | ... | 19 |
50 | 51 | ... | 59 |
2 | 20 | 21 | ... | 29 |
60 | 61 | ... | 69 |
: | : | : | ... | : |
: | : | ... | : |
4 | 40 | 41 | ... | 49 |
90 | 91 | ... | 99 |
↓
NO | V1 | V2 | ........ | V10 |
1 | 10 | 11 | ... | 19 |
2 | 20 | 21 | ... | 29 |
: | : | : | ... | : |
4 | 40 | 41 | ... | 49 |
1 | 50 | 51 | ... | 59 |
2 | 60 | 61 | ... | 69 |
: | : | : | ... | : |
4 | 90 | 91 | ... | 99 |
* R1〜R10をV1〜V10に変更しI1〜I10は保存先からは削除して1.savに保存.
get file="元データ.sav".
save outfile="1.sav"
/rename (R1 to R10=V1 to V10)
/drop=I1 to I10
/keep=NO,V1 to V10.
(↑あとで同一ケースごとにデータをまとめたい場合,NOをkeepに入れておく必要がある)
* 同じくI1〜I10をV1〜V10に変更しI1〜I10は保存先からは削除し2.savに保存.
get file="元データ.sav"
save outfile="2.sav"
/rename (I1 to I10=V1 to V10)
/drop=R1 to R10
/keep=NO,V1 to V10.
* 1.savと2.savを結合する.
ADD FILES /FILE="1.sav"
/FILE='2.sav'.
EXECUTE.
さらにケースごとにデータをまとめたいときは
SORT CASES BY NO (A) .
EXECUTE.
* ただし1行目の"(A)"はNO(ケース番号)の昇順に並べ替える指定.降順に並べたいときは"(D)"とする
とすればよい(↓のような並びになる)
NO | V1 | V2 | ........ | V10 |
1 | 10 | 11 | ... | 19 |
1 | 50 | 51 | ... | 59 |
2 | 20 | 21 | ... | 29 |
2 | 60 | 61 | ... | 69 |
: | : | : | ... | : |
4 | 40 | 41 | ... | 49 |
4 | 90 | 91 | ... | 99 |
[Q]変数名を変えたい
[A]RENAME VARIABLES (旧変数名=新変数名). コマンドを用いる
例1
RENAME VARIABLES (A=B).
Aという変数がBという名前に変更される
例2
RENAME VARIABLES (A1 TO A10=B1 TO B10).
A1〜A10がB1〜B10にまとめて変更される
[Q]一定値の変数を挿入したい
[A]
- すべて"1"の変数Aを作成する場合
compute A=1.
- すべて欠損値からなる変数Aを作成する場合
compute A=$SYSMIS.
戻る|
トップへ