数値欠損値の補完

Last-modified: 2008-07-27 (日) 19:49:16

データに存在する欠損値の扱いは、分析において厄介なものです。
このような処理はDATAステップを利用して実現できますが、変数が不定であれば結構手間がかかります。
以下では、SAS/STATのSTDIZEプロシジャを使用して、数値欠損値を適当な数値で補完する方法をいくつか紹介します。ポイントは、REPONLYオプションの利用です。STDIZEプロシジャは何らかの標準化・規準化を行いますが、このオプションを指定すると欠損値の置き換えのみが行われます。

まずはじめは、変数に含まれる欠損値を0で置き換える方法です。
(特殊欠損値も含めて)3か所存在する欠損値が全て0で置き換えられます。

data test; /*サンプルデータ*/
  input a b;
datalines;
1 1
4 2
1 5
3 .
. 6
.e 4
;
run;

proc stdize data=test out=out1 missing=0 reponly;
  var a b;
run;

proc print data=out1;
run;

/*
OBS    a    b

 1     1    1
 2     4    2
 3     1    5
 4     3    0
 5     0    6
 6     0    4
*/

続いてMETHOD=MEANを指定して、各変数の非欠損値を用いて計算された平均で欠損値を置き換える方法です。もし中央値で置き換えたい場合は、METHOD=MEDIANと指定してください。

proc stdize data=test out=out2 method=mean reponly;
  var a b;
run;

proc print data=out2;
run;

/*
OBS      a      b

 1     1.00    1.0
 2     4.00    2.0
 3     1.00    5.0
 4     3.00    3.6
 5     2.25    6.0
 6     2.25    4.0
*/

では、任意の値で欠損値を補完するにはどうしたらよいでしょうか?
それにはMETHOD=IN(データセット名) という指定を利用できます。
データセットとしては、以下のような形状のものを用意します。なお2行目はダミーの行であり、1行目の
10, 100という値で各変数を置き換えます。

data impute;
  input _type_$ a b;
datalines;
location 10 100
scale 1 1
;
run;


proc stdize data=test out=out4 method=in(impute) reponly;
  var a b;
run;

proc print data=out4;
run;
/*
OBS     a      b

 1      1      1
 2      4      2
 3      1      5
 4      3    100
 5     10      6
 6     10      4
*/