Development Micro-econometrics Study Group: Code Notes

日本語で経済学分析に有用なコードの備忘録を作成しています。We provide explanations of useful codes in Japanese for data cleaning, analysis, visualization like memorandum. Our software focuses on STATA, R, Python.

STATAでcsvを読み込む際のエラー

csvを読み込もうとしたときに、

long invalid varname
error in line 1 of file
r(198);

などと表示されて読み込めないことがあった。筆者の場合は、全てのファイルを閉じたうえで、

Update all

を実行することでなぜかエラーがなくなった。

STATAで列の順番を変える (order/move)

STATAのデータセットの列の順番を変えるには以下の2通りがある:

order

特定の列をデータセットの一番左側に移動させる。

order var1 var2 var3

とすることで、order の後ろで指定された列 (varlist, ここでは var1~var3) を、その指定した順番で、データセットの一番左の列に移動させる。
例えば、job income id province district という順で列が並んでいた場合、order id province district というコマンドを実行することで、id province district job income という列の順に変更される。

move

特定の列を別の列の横に移動させる。

move var1 var2

とすることで、move の次に指定された列 (var1) を2番目に指定された列 (var2) のすぐ左側に移動させる。 例えば、province id job income districtという順で列が並んでいた場合、move province district というコマンドを実行することで、id job income province district という列の順に変更される。


出所:Stata Guide: Reordering or Re-arranging Data

STATAで上から次のobservationが出てくるまで同じ値または文字列を入力する(fill fown)。

STATAでネ申を読み込んだとき、上から順に情報が入っていることで、階層が識別されていることがある。例えば以下の例である。

 A   B
千葉県
    浦安市
    市川市
    船橋市
長野県
    長野市
...

この時、データを扱う身としてはA列に次の県が出るまでの全てのobservationに対して前の(上の)情報をfill inしたい。その時、以下のコードを回せばよい。

 replace A= A[_n-1] if missing(A)

missingの限り、一個前のと同じ情報が書かれる。

 A   B
千葉県
千葉県 浦安市
千葉県 市川市
千葉県 船橋市
長野県
長野県 長野市
...

参考:

STATAで特定の文字列が含まれているかを識別する。

変数の中に特定の文字列が含まれているかを識別する方法。例えば、ある変数の列の中に、県と市が混ざっているような場合に、どれが県のobservationと対応しているかを知りたい場合などが考えられる。 つまり、

(列: A)
千葉県
浦安市
市川市
千葉市
市原市

長野県
長野市
...

のようなデータを持ってるときに、横に県ダミーを作成してみよう。コードは、

gen d_prefecture = (ustrpos(A, "県")>0)

等とすればよい。英語の場合はstrposを代替的に用いることも可能である。

STATAで変数名を取得する (ds) 。

STATAで変数名を取得するために ds というコマンドが使える。 特定の型の変数を取得して、その変数に対してある作業を行いたいという場合に利用可能である。

例えば、A, B, C という列で構成されるデータを扱っている時、

ds

A B C

と、列名を返す。 ds を実行すると、r(varlist) として返値の変数名が保存される。 そのため、例えば

foreach v of varlist `r(varlist)` {
    ...
}

といった形で、ds を通して取得した変数名をその後の作業で使うことができる。

オプションでは特定の型やフォーマット、変数ラベルに関する指定が可能。例えば、 ds, has(type numeric) とすると、numeric型の変数名だけを返す。numeric以外でもSTATAでの変数型を指定することで、その型の変数名を確認することができる。 逆に、ds, not(type numeric) では、numeric型以外の変数名を返す。 他にも ds, has(format *f) として、特定のformatの変数の名前を確認できるほか、ds, has(varl, "*some phrase*") とすると、変数ラベルに"some phrase"という二単語(フレーズ)が含まれる変数名が返される。

このように、オプションと r(varlist) を使うことで、特定の変数のみに対する作業を効率的に行うことができる。

STATAで特定の変数名をシステマティックに一気に変える。

STATAは変数名が長いとinvalid nameとなってしまう。しかし、全ての変数名をひとつづつ変えるのは手間だしミスしてしまうかもしれない。いいデータなら似たような単語に似たような変数名がついているので、そのパターンを用いて同時に省略することを考える。

例えば、変数が以下のようになっているとする。 population_Tokyo Population_Nagano Population_Chiba Population_Osaka ここで省略してpopulationpopのように書き換えよう。 東京だけ書き換える場合は、

rename population_Tokyo pop_Tokyo

とすればよいが、populationがつくものすべてを同時に指定しよう。

rename population_* pop_*

STATAで*はすべての意味だが、このように応用できる。

参考: https://www.stata.com/manuals/drenamegroup.pdf

STATAで全ての変数名をlocalとして指定する。

localを用いて変数の組を指定することでミスを防ぎ作業効率を上げることができる。ここでは全ての変数を指定することを考える。var1 - var100のように指定することも考えられるが、それでは変数の順番が変わったり、追加されたりしたときに都度都度修正する必要が出てきてしまう。また*で全ての変数を指定できるが、筆者たちはlocal環境で*が文字として認識されてしまうなど(?)、うまく機能しないことを経験した。

データセット内の全てをlocalとして指定するにはunabを使えばよい。

unab allvar: _all

ここでallvarは自分でつけたlocal変数の名前である。これまで同様に

dis `allvar'

とすればうまく指定されていることを確認できる。

参考:

local all variables - Statalist