stataコマンド~欠損値処理にめっちゃ便利なmisschkコマンド~
おつかれあたん
stataユーザー作成のコマンドで特に便利と思うコマンドとしてmisschkというのがあります.欠損値は社会調査データにおいては切っても切り離せないコマンドで,分析それ自体よりも処理するための時間がかかるものです.
stataの場合,if文で処理するのが最も一般的であとはdropやkeepを使う方法などがありますが,misschkというコマンドを覚えておけば欠損処理がとても快適に行えます.
以下で使い方と便利なポイントを紹介します.
今回用いる架空例は下記のようにします.
ID | y | x1 | x2 | x3 |
1 | 1 | 2 | 1 | 2 |
2 | . | . | 1 | 2 |
3 | 2 | . | 2 | 2 |
4 | 1 | . | . | 1 |
5 | 1 | 1 | 2 | . |
6 | 2 | 2 | 2 | 1 |
7 | 1 | 2 | 2 | 2 |
今回はyを従属変数,x1,x2,x3を独立変数として回帰分析や記述統計量,クロス表などを
作成したいとします.y~x3にはそれぞれ欠損値が存在します.ID番号が1,6,7の人は欠損値が一つもないため特別の指定をしない限り常に分析に含まれることになりますが,その他のIDは使用する変数や条件によっては分析に含まれないことになります.
以下で具体的な分析をみていきます.
まず,yを従属変数,x1,x2,x3を独立変数とするOLS重回帰分析を行います.
reg y x1 x2 x3
となります.このコマンドに代表される通常の回帰分析における分析対象は,「投入する変数がすべて欠損でない」ものに限定されます.つまり,IDが1,6,7の3人しか分析対象に含まれません.
上記のregの実行すれば,stataが勝手に欠損がある人を除外してくれるので大きな問題はありません.
しかし通常,分析に先立ち記述統計量を示すことが一般的です.
その場合sumというコマンドを実行するわけですが,仮に以下のようなコマンドを実行したとします.
sum y x1 x2 x3
すると,下記が出力されます
Variable | Obs | Mean | Std. Dev. | Min | Max |
y | 6 | 1.33 | 0.52 | 1 | 2 |
x1 | 4 | 1.75 | 0.50 | 1 | 2 |
x2 | 6 | 1.67 | 0.52 | 1 | 2 |
x3 | 6 | 1.67 | 0.52 | 1 | 2 |
ここで問題となるのが,回帰分析におけるサンプルサイズと記述統計量で算出している各変数のサンプルサイズが異なる点です.通常sumを実行した場合には各変数ごとに欠損がない人を探しだしてきて記述統計量を算出します.たとえばx1についてはID1,5,6,7の4人が分析対象です.またy,x2,x3はサンプルサイズが同じであるため,一見同じ対象者であるようですが,データをみると,yはID2の人が欠損,x2はID4の人,x3はID5の人が欠損であるので,対象者が異なるわけです.
ここで,回帰分析に合わせて,ID1,6,7の3人だけを分析対象にしたい場合には,以下のようなコマンドを実行する人が多いと思います.
sum y x1 x2 x3 if y~=. & x1~=. & x2~=. & x3~=.
すると下記が出力されます.
Variable | Obs | Mean | Std. Dev. | Min | Max |
y | 3 | 1.3 | 0.58 | 1 | 2 |
x1 | 3 | 2 | 0 | 2 | 2 |
x2 | 3 | 1.67 | 0.58 | 1 | 2 |
x3 | 3 | 1.67 | 0.578 | 1 | 2 |
このコマンドはy,x1,x2,x3がすべて欠損でない人だけを対象として記述統計量を算出してね,というコマンドであるので,まさに回帰分析の対象者と同じになります.その証拠にサンプルサイズがすべて3で統一されています.
また,回帰分析に先立ち2変数の関連をクロス表で見るということがしばしあります.
記述統計量の算出の時と同じように,サンプルサイズを統一したい場合には下記のようなif文を追加する必要があります.
tab x1 y if y~=. & x1~=. & x2~=. & x3~=.
tab x2 y if y~=. & x1~=. & x2~=. & x3~=.
tab x3 y if y~=. & x1~=. & x2~=. & x3~=.
すなわちすべて同じif文を設定してコマンドを実行することになります.
-----------
データ分析にある程度慣れた人ならここまでの話はある程度常識でありながら,いちいちif文を設定するのがとても面倒に感じているのではないかと思います.コピペするにしても,変数が条件が増えるほどコマンドが長くなってみづらいということもあります.
そこでmisschkコマンドが活躍します.以下実行例です.
まず,
search misschk
と入力してmisschkのプログラムをダウンロードします.
コマンドは以下のように入力します.
misschk y x1 x2 x3,gen(mis)
コマンドの意味は出力を見ながら説明します.
上記を実行すると下記のような出力が表示されます.
# | Variable | # | Missing | % | Missing |
1 | y | 1 | 14.3 | ||
2 | x1 | 3 | 42.9 | ||
3 | x2 | 1 | 14.3 | ||
4 | x3 | 1 | 14.3 |
最初の出力はmisschkのコマンドの後に並べた4つの変数それぞれが欠損の数と割合を示しています.たとえばx1だと欠損が3つあり,全体のうち42.9%が欠損であるということを一覧表で示してくれます.この表を出力してくれるだけでもこのコマンドのメリットがあるかと思います.
次が欠損のパターンの出力です.
Missing for | |||
which | |||
variables? | Freq. | Percent | Cum. |
12__ | 1 | 14.29 | 14.29 |
_23_ | 1 | 14.29 | 28.57 |
_2__ | 1 | 14.29 | 42.86 |
___4 | 1 | 14.29 | 57.14 |
____ | 3 | 42.86 | 100 |
Total | 7 | 100 |
ここで,12__とは投入した変数4つのうち,最初の二つつまりyとx1が欠損の人が何人いるかを示してくれて,ここでは1人で全体のうち14.29%であることが分かります.
最後の____が,4つの変数がすべて欠損でない人の情報で,それは3人いて全体の42.86%であるという情報を示してくれます.この欠損のパターンを一覧で見れるコマンドはstataのデフォルトコマンドにはないためかなり重宝されます.しかも,この欠損パターンについては新変数としてデータセットに作成されます.
Missing for | |||
how many | |||
variables? | Freq. | Percent | Cum. |
0 | 3 | 42.86 | 42.86 |
1 | 2 | 28.57 | 71.43 |
2 | 2 | 28.57 | 100 |
Total | 7 | 100 |
最後出力が欠損の数で分類した度数分布表です.たとえば4つの変数のうち欠損が0に人が3人,欠損が1つの人が2人,という情報を示してくれます.
これらの表のうち,2つ目の欠損パターンと欠損の数の度数分布表から今回分析対象となるのが3人であることが分かります.
この表は回帰分析に限らず,欠損パターンの分析,たとえばyに回答しない人は他にどんな変数に回答しないのか,というパターンを示してくれるためかなり便利です.
そして,もっとも便利なのが,
misschk y x1 x2 x3,gen(mis)
のサブコマンドで指定した(mis)の部分で,データセットをみてみると,次のようになっています.
ID | y | x1 | x2 | x3 | mispattern | misnumber |
1 | 1 | 2 | 1 | 2 | ____ | 0 |
2 | 1 | 2 | 12__ | 2 | ||
3 | 2 | 2 | 2 | _2__ | 1 | |
4 | 1 | 1 | _23_ | 2 | ||
5 | 1 | 1 | 2 | ___4 | 1 | |
6 | 2 | 2 | 2 | 1 | ____ | 0 |
7 | 1 | 2 | 2 | 2 | ____ | 0 |
ここで,mispatternというのは,先ほど説明したように,このサンプルがどういった欠損のパターンであるかを文字列として示されたものです.
そして,misnumberというのが,投入した4つの変数のうちいくつ欠損があるかを示した変数で数値として作成されています.
変数名は()で示した文字にnumberが足されます.たとえばgen(misA)と指定すれば
misAnumberのようになります.
この変数が作成される所がとても便利な所で,
先ほどまで,
sum y x1 x2 x3 if y~=. & x1~=. & x2~=. & x3~=.
tab x1 y if y~=. & x1~=. & x2~=. & x3~=.
tab x2 y if y~=. & x1~=. & x2~=. & x3~=.
tab x3 y if y~=. & x1~=. & x2~=. & x3~=.
と長いコマンドを指定していたと思いますが,
これをすべて,
sum y x1 x2 x3 if misnumber==0
tab x1 y if misnumber==0
tab x2 y if misnumber==0
tab x3 y if misnumber==0
と置き換えて分析することができます.
見た目もすっきりする上にmisschkのコマンドで様々な欠損パターンを作成を確認できて,その新変数を作成できるために重宝する場面は多いコマンドです.