Stataのメモ置き場

Stataのメモなど

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メモ 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

  • Windows11 pro

  • Ryzen 7 PRO 6850U

  • Memory 32GB

  • SSD 2TB

性能面では全く不足無く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 DriveDropbox等のクラウドに置いておけばいいですしね。

現在の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(メイン機として使用)

  • 分析環境をこちらに移行してメイン機として使う予定
  • Windows11 pro
  • Ryzen 7 PRO 6850U
  • Memory 32GB
  • SSD 256GB(後で2TBに換装)

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 //これでまとめられた