Stataメモ 文字列の切り分け
変数に複数のデータが含まれている場合に、それらを一つずつの変数に切り分けたいたい時に使うコマンド。
//parseで区切りたい文字を指定して、generateで区切ったデータを新しい変数に移す。 split [varname] , parse() generate()
例えば、こんな感じに住所という変数に都道府県名以下の住所データがあるとする。
. list
住所
1. 岩手県久慈市夏井町大崎
2. 愛知県高浜市小池町四丁目
3. 大阪府高槻市川西町二丁目
4. 埼玉県和光市下新倉五丁目
5. 石川県かほく市白尾ワ
都道府県とそれ以外の住所に分けたい場合は、次のようにする。
split 住所, p("県", "府", "市") gen(address) variables created as string: address1 address2 address3 list 住所 address1 address2 address3 1. 岩手県久慈市夏井町大崎 岩手 久慈 夏井町大崎 2. 愛知県高浜市小池町四丁目 愛知 高浜 小池町四丁目 3. 大阪府高槻市川西町二丁目 大阪 高槻 川西町二丁目 4. 埼玉県和光市下新倉五丁目 埼玉 和光 下新倉五丁目 5. 石川県かほく市白尾ワ 石川 かほく 白尾ワ
Stataメモ チートシート
知ってると便利なコマンド集
図表の線や文字の大きさを変える時、毎回ヘルプを見ながらやっていたのがこれ一枚で完結するのはありがたい。
・図表や統計分析
・日時について
Stataメモ dyndoc
分析結果を簡単に共有したい時に、スライドやワードにまとめるのが面倒という人むけのStataコマンド。
dyndocコマンドはテキストファイル(.mdなどのマークダウンファイルにも対応)を実行することでHTMLファイルに出力してくれる。
コマンドの前後を<<dd_do>>と<</dd_do>>で挟むことによってdyndocで読み込むことが可能になる。
- 参考サイト
https://www.stata.com/manuals/rptdynamictags.pdf
How to Create an HTML Webpage in Stata using Markdown
dyndoc example.txt, replace
このテキストをメモ帳にコピー&ペーストして、dydocコマンドを実行する。 ~~~ <<dd_do>> sysuse auto, clear des sum sum price if foreign == 0 scalar price1 = r(mean) sum price if foreign == 1 scalar price2 = r(mean) <</dd_do>> ~~~ 国産車の価格の平均値は$<<dd_display: price1>>で、輸入車の価格の平均値は$<<dd_display: price2>>です。 ~~~~ <<dd_do>> graph bar (mean) price (mean) weight, over(foreign) name(graph, replace) title("Price and Weight") graph export "example.png", as(png) name(graph) replace <</dd_do>> ~~~~ <<dd_graph: graphname(graph) saving(example.png) replace height(400)>>
出力されたHTMLを開くとこのようになる。
このテキストをメモ帳にコピー&ペーストして、dydocコマンドを実行する。
. sysuse auto, clear
(1978 automobile data)
. des
Contains data from C:\Program Files\Stata17\ado\base/a/auto.dta
Observations: 74 1978 automobile data
Variables: 12 13 Apr 2020 17:45
(_dta has notes)
-----------------------------------------------------------------------------------------------------------------------------------------------
Variable Storage Display Value
name type format label Variable label
-----------------------------------------------------------------------------------------------------------------------------------------------
make str18 %-18s Make and model
price int %8.0gc Price
mpg int %8.0g Mileage (mpg)
rep78 int %8.0g Repair record 1978
headroom float %6.1f Headroom (in.)
trunk int %8.0g Trunk space (cu. ft.)
weight int %8.0gc Weight (lbs.)
length int %8.0g Length (in.)
turn int %8.0g Turn circle (ft.)
displacement int %8.0g Displacement (cu. in.)
gear_ratio float %6.2f Gear ratio
foreign byte %8.0g origin Car origin
-----------------------------------------------------------------------------------------------------------------------------------------------
Sorted by: foreign
. sum
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
make | 0
price | 74 6165.257 2949.496 3291 15906
mpg | 74 21.2973 5.785503 12 41
rep78 | 69 3.405797 .9899323 1 5
headroom | 74 2.993243 .8459948 1.5 5
-------------+---------------------------------------------------------
trunk | 74 13.75676 4.277404 5 23
weight | 74 3019.459 777.1936 1760 4840
length | 74 187.9324 22.26634 142 233
turn | 74 39.64865 4.399354 31 51
displacement | 74 197.2973 91.83722 79 425
-------------+---------------------------------------------------------
gear_ratio | 74 3.014865 .4562871 2.19 3.89
foreign | 74 .2972973 .4601885 0 1
. sum price if foreign == 0
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 52 6072.423 3097.104 3291 15906
. scalar price1 = r(mean)
. sum price if foreign == 1
Variable | Obs Mean Std. dev. Min Max
-------------+---------------------------------------------------------
price | 22 6384.682 2621.915 3748 12990
. scalar price2 = r(mean)
国産車の価格の平均値は$6072.4231で、輸入車の価格の平均値は$6384.6818です。
. graph bar (mean) price (mean) weight, over(foreign) name(graph, replace) title("Price and Weight")
. graph export "example.png", as(png) name(graph) replace
file example.png saved as PNG format
続 PC環境の話
新PCを購入してから1ヶ月ほど経ったので、以前書いたこちらの話の続き。 hato2022.hatenablog.com
結局デスクトップPCはそのまま続投してもらってます(持ち運びするノートPCとモニターを毎回繋げ直すの煩わしいので)。
USB Dock使えば楽なんでしょうけどまだまだお高い…
新ノートPCのスペックはこんな感じ。
Think Pad X13 Gen3 AMD
性能面では全く不足無くStataをガンガン回せるし、ExcelやらWordやらをいくらでも開けるのでとても快適になった。
MacBook Air 11inchより少し大きくなった分、重量も増えた(約1.3kg)が気にならない程度。
バッテリーの持ちは半日程度だったら全く問題無さそう。
ただし、Windows11の問題でスリープモードと休止モードで異常に電力を消費することがあるらしく、作業を中断する時はシャットダウンした方が良さそう(2回くらいバッテリー切れてた)
あと、こちらはWindows11特有の問題なのか、Lenovo特有の問題なのか不明だがスリープモードの復帰ができないことが結構な頻度である。
これらの問題のせいで、Macみたいに画面閉じて作業中断→画面開いて作業再開みたいなことをできなくなったのが不便に感じる。
今後BIOSの更新やらで治ると思われるので、総じて満足できる買い物でした。
PC環境の話
PC環境を更新するため、現在の環境をメモしておきます。
ちなみに私がPCで重視する要素は、CPU(Core i3以上)、メモリー(32GB以上)の2点です(ノートPCならバッテリーも)。
SSDなんかは後からいくらでも付け足せますし、なんならGoogle DriveやDropbox等のクラウドに置いておけばいいですしね。
現在のPC環境
デスクトップPC(メイン)
- 研究室に置いてあるやつで、基本はここで分析してる。
- Windows10
- ASUS PRIME H370-A
- Core i3-9100
- Memory 32GB
- SSD 500GB
- HDD 2TB
- デュアルモニター 23inch & 22 inch
- お下がりのPCをパーツだけ換装してきたので、まだまだ使える。
Mac Book Air 11inch 2013(サブ)
- 教室とか学会とかでの持ち運び用だった。
- Memory 8GB
- SSD 256GB
- Excelやパワポ開くだけで数十秒待つようになったので、そろそろ厳しい。
- 購入した当初は持ち運びのため軽い11インチを選んだが、今は同じ重さでもっと大きい画面のものがあるみたい。技術の進歩すごい。
更新後のPC環境
デスクトップPC(サブ機へ降格)
- FQのダウンロード用とかになるかな?
Think Pad X13 Gen3 AMD(メイン機として使用)
PC環境を更新しようと思ったきっかけは、ノートPCがもう通常の使用に耐えられなくなってきたためです。
10年近く働いてくれたので、当然ですね。
始めは普通のノートPC(カスタムしてない店頭に置いてあるようなもの)を考えていたのですが、分析もできて作業のしやすさ等を考慮していくと、まぁカスタマイズ費用がデスクトップPC並になってきて…
そして、カスタマイズしていくと、現在のメイン機と同等かそれ以上のスペックのものがノートPCで組めてしまうんですよね。
それなら、現在のデスクトップPCをサブ機として降格し、新しいノートPCをメイン機に据えようという魂胆です。
ちょうどM2 Macが発売されて、そちらも候補だったのですが、やはりOfficeの互換性問題がどうしても不安だったので見送りました…
Stataメモ 不等式マージ
株価や財務データを扱う際、とにかく年月の問題がある。
例えば、株価データに直近の財務データをマージさせたい、みたいなことが多々ある。
普通のmergeコマンド は一致する値でしかマッチングできないので、直近のデータをマージしたい時はもどかしい。
そのようなマッチングをしたい時に、あれば便利だなと思っていたコマンドがあるらしい。
それがこれ、nearmrgコマンドである。
2022/11/13追記 現在、nearmrgを連続で実行するとマッチングがうまくいかないことがあります。 Stataを再起動した後に、再度実行するとこの現象は起きないようです。 連続して使う場合は注意した方が良いです。 st: Re: unstable results with repeating the nearmrg command
nearmrg [varlist] using "~~.dta", nearvar(varname) [ limit(real) genmatch(newvarname) lower type(mergetype) mergeoptions]
基本はこのような形で、実際のマージで使用すると以下のようになる。
//データセットAは月次株価データ //データセットBは財務データ //[firm]は企業コード //month変数は年月を表す数値データ(例:202201, 202202, ...) use "A.dta", clear nearmrg [firm] using "B.dta", nearvar(month) lower type(1:1)
これは、データセットAの企業コードに一致して、かつ、Aのmonthより小さな値/もしくは等しい値のうち最も近い値でマッチングしなさい、という意味になる。
lower matches to the closest value of nearvar in the using dataset that is less than or equal to nearvar in the master dataset. http://fmwww.bc.edu/RePEc/bocode/n/nearmrg.html
つまり、直近の財務データをマッチングしている。
これまで、株価に直近の決算月をマージして、決算月で財務データをマージして…、みたいな面倒な作業をこれ一つで片付けられるので効率アップできるかな。
ちなみに、"lower"の部分を"upper"に変えれば、大きな値のうち最も近い値でマッチングできる。
upper matches to the closest value that is greater than or equal to nearvar. http://fmwww.bc.edu/RePEc/bocode/n/nearmrg.html
nearmrgのヘルプ http://fmwww.bc.edu/RePEc/bocode/n/nearmrg.html
Stataメモ Excelファイルをdtaファイルに変換
Excel形式のファイルを一括でdta形式のファイルに変換する方法。
FinancialQuestから大量にダウンロードした時に便利。
cd [directory_name] //Excelファイルが入っているフォルダを選択 mkdir "dta" //dta保存用フォルダ作成 local xlslist: dir . files "*.xls" //フォルダ内のExcelファイル名を取得 foreach file of local xlslist { import excel `file', sheet("Sheet1") clear //ExcelのSheet1をStataにインポートする local name : subinstr local file ".xls" "" //取得したファイル名から[.xls]を削除 /* 1行目にデータが来るように行を調整 */ drop if _n==1 drop if _n==1 drop if _n==1 save dta/`name'.dta, replace //取り込んだExcelファイルをdtaに変換 } cd "dta" //dtaフォルダに移動 local dtalist : dir . files "*.dta" //dtaのファイル名を取得 append using `dtalist' //ひとつのファイルにまとめる save alldata.dta, replace //これでまとめられた