忍者ブログ

mnblog

二度も三度も同じことやってられないから。忘れちゃいけないから。

0x20151024 Stataのxiコマンドによるカテゴリ変数と連続変数の交差項の罠

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

0x20151024 Stataのxiコマンドによるカテゴリ変数と連続変数の交差項の罠

最初はdoファイルに書いたリグレッションの変数名のタイプミスだと思った。何度直しても見直してもダメなので、いい加減いらいらしてきた。そしてググってみたところ、原因がわかった。こんなのヘルプ見ても載ってないし、バグだろと思うレベルなのだが、いらいらしたので、備忘録。


まずはStataのxiコマンドをおさらい

使用環境はWindows 7 Ultimate 64bit版のうえで動く、Stata Special Edition 14.0ということで、たぶんeditionはそんなに重要じゃないんだと思うけど一応。

xiコマンドといえば、こちらの公式を参考にしていただきたいのだが、たとえば job という変数が

  • 1=仕事あり
  • 2=主婦(仕事なし)
  • 3=学生(仕事なし)
  • 4=その他(仕事なし)
  • 9=不明

のように、カテゴリを表す変数であるときに、これを回帰分析とかに使おうと思って

  • gen dummy_job1=(job==1)
  • gen dummy_job2=(job==2)
  • gen dummy_job3=(job==3)
  • gen dummy_job4=(job==4)
  • gen dummy_job9=(job==9)

のようなものをいちいち作らなくてもいいようにしてくれる。具体的には
xi: reg outcome age i.job
みたいに書くと、job==1のダミーとjob==2のダミーと...を勝手に作ってくれて、それぞれのダミーを説明変数として使ってregコマンドを実行してくれるというもの。

問題は、こいつを連続変数、たとえばageとcross-termとして使いたいというときに起きる。

罠1:交差項を書くときは順番が重要

ヘルプを見るとこう書いてある。
You can interact dummy variables with continuous variables; typing
xi: logistic outcome bp i.agegrp*weight i.race
この順番がミソで、必ず「i.(あい・どっと)」で始まるほうを書かなければならない。これを逆にすると
variable age*i.job not found
というあのいらいらするメッセージが出てくる。逆にするとこのエラーは解消したので、ああそういうことなのか、だったらヘルプにそう書いてくれ、と思った。つまり、上のageとjobの関係でいえば、
[誤] xi: reg outcome age i.job age*i.job
[正] xi: reg outcome age i.job i.job*age
ということになる。そんなんあのエラーメッセージからわかんないし。そもそも変数名にアスター使えないんじゃないの?なんでアスターが変数名の一部だと思ってんだよ?というあたり、かなりイラッとくる。文字列解析の専門家ちょっとひとりや二人くらいいるだろう、あんだけ高いソフトを世界中に売りまくってるんだから...というね。

罠2:カテゴリ変数二つの交差項に対して他の変数をさらに交差できない

カテゴリ変数二つの交差項というのは、たとえば上のageとjobの例を出すと、さらにもう一つ最終学歴ダミーeduがあるような状況。

  • edu=1→中学どまり
  • edu=2→高校どまり
  • edu=3→高専・短大・専門どまり
  • edu=4→4年制大学卒業どまり
  • edu=5→4年制大学卒業を超える最終学歴あり
  • edu=9→その他、不明

みたいなのがあったとして、これをageやjobと交差させたい!と思うような場合(あくまで例なので内生性とか余計なことは言わないように)。このとき、
xi: reg outcome age i.job i.edu i.job*age i.edu*age i.job*i.edu
と書くと、job==1かつedu==1のダミー、job==1かつedu==2のダミー、...job==9かつedu==9のダミー、みたく順列組合せでいろんな交差項をいれることができる。xiコマンド便利じゃん!とか思ったあなた。単にageはそれ単体で影響を与えるんじゃなく、ある特定の学歴の人がある特定の学歴を持っているとageの影響が変わる(=傾きに影響を与える)と想定した時、こんな風に書きたくなるんじゃないだろうか。
xi: reg outcome age i.job i.edu i.job*age i.edu*age i.job*i.edu i.job*i.edu*age
実際、産業カテゴリ変数(製造業、流通業、etc.)と人種カテゴリ変数(白人、黒人、ラテン系、アジア系、etc.)と経験年数を用いた賃金関数の推定とか結構あるし、こういう交差項は珍しいものでもなんでもない。解釈もまあまあ普通にできる。なのになのに!Stataでこれを実行すると次のようなお返事が。
variable edu*age not found
いやいや、「edu*age」なんていう名前の変数ないでしょ。途中にアスター入ってるし!と思うんだけど、おバカちゃんなので、こういうところつまづいちゃうみたい。

罠2は解決できていないので、やり方を調べないといけないし、知っている人いたらご教示いただけると嬉しいです。

PR

コメント

プロフィール

HN:
golbnm
性別:
非公開

P R