RStudio上のRを使う感覚でStataが利用できるパッケージである。
はてなブログではチャンクオプションが表示できないため、原版と見比べながら学習してほしい。
Statamarkdown
by Doug Hemken 2022-03-02
1 StataとR Markdown
1.1 はじめに
これは、Stataに基づくドキュメントを作成するためにR Markdownを使用して動的なドキュメントを書くための入門書である。このプロセスでは、Rstudio(または単にR)を使用して、Stataのコードに依存するドキュメントを作成する。
1.2 背景
Markdownは、いくつかのテキストシンボルを使って、それほど複雑でないドキュメントをフォーマットするための言語である。これは読みやすく、書きやすいように設計されている。もしあなたが電子メールを読み書きするならば、おそらくこれらのフォーマット規則の多くにすでに精通していることでしょう。Markdownに関するより詳細な情報はJohn GruberのMarkdownの記事を参照のこと。
https://daringfireball.net/projects/markdown/
動的なMarkdownはStataやRを含む多くのプログラミング言語で実装されている。Stataにはstmdという動的なMarkdownパッケージがあり、Stataのdyndocコマンドと同様にユーザが書いたmarkstatパッケージにも依存している。それぞれに長所と短所があります。
ここで説明するシステムは、すでにR Markdownを使って他の言語でドキュメントを書いていて、これをStataにも使いたいと考えている人のために用意されたものである。
R Markdownは動的なマークダウンシステムで、いくつかのプログラミング言語のうちの1つであるコードのブロックを含めることができるようにMarkdownを拡張している。コードは評価され、コードとその結果の両方がMarkdownドキュメントに含まれる。R Markdownの詳細については、RStudioのR Markdownウェブページを参照
RStudioはknitrというRパッケージ(これはRから直接呼び出すこともできます)を使用しており、Stataを評価する機能を備えています。
knitrのドキュメントはRのヘルプ、Yihui XieのWebページ、または書籍R Markdownに記載されている。The Definitive Guide "にある。
https://yihui.org/knitr/ https://bookdown.org/yihui/rmarkdown/
最後に、私はStatamarkdownと呼ばれるパッケージのヘルパー関数を使用している。これらはStataに基づく動的なドキュメントを書くのに必要ではないが、作業を容易にしてくれる。
1.3 Statamarkdownのインストール
Statamarkdownはgithub.comからインストールすることができる。(インストールオプションについては、2項「Statamarkdownのインストール」を参照)。
library(devtools) # devtoolsのインストールも必要かもしれない install_github("hemken/Statamarkdown")
注意:RStudioは実行可能なRコードチャンクでMarkdownを書くには素晴らしい環境だが、Stataコードの問題を広範囲にデバッグするには不親切な環境である。Stataのコードが複雑な場合は、まずStataで詳細を解決し、それをRStudioに取り込んでドキュメントを作成すべきである。
1.4 Stataエンジンのセットアップ
Stataのコードを実行するために、knitrはStataの実行ファイルがどこにあるか知る必要がある。これは、Statamarkdownパッケージをロードすることにより、予備的なコードチャンクで行うことができる。
(knitrの専門用語では、コードのブロックは "コードチャンク")
もし、パッケージがあなたのStataのコピーを見つけられなかった場合(メッセージが表示される)、自分で指定しなければならないかもしれない。詳しくは第3章Stata Engine Pathを参照。
このセットアップチャンクの後、Stataによって処理される後続のコードは、以下のように指定することができる。
‘‘‘{stata}
-- {Stata} -- Stataのコードはここにある。
‘‘‘
1.5 コードブロックのリンク
Stataのコードの各ブロック(チャンク)は、個別のバッチジョブとして実行される。これはコードのチャンクからチャンクへ移動する際に,以前の作業はすべて失われることを意味する。コードチャンクからコードチャンクへデータを保持するためには、コードの(一部を)収集し、後続の各チャンクの始めに静かに処理することが必要である。
4.1節「Stataコードブロックのリンク」で説明したように、また以下に示すように、knitrにコードを収集させることができる。
1.6 ヒントと例
1.6.1 分離したコードと出力されたコード
Stataでは、.logファイルに出力される内容を細かく制御することはできにい。コードと出力を別々に表示する(Rスタイル)か、出力にコードを含める(Stataスタイル)かは、自分で決めることができる。 第5章Stataの出力とcleanlogを参照。
1.6.2 グラフの取り込み
グラフを含めるには、Stataでのグラフエクスポートと、R Markdownでの画像リンクが必要である。knitrのチャンクオプションechoは、指定したコードの行だけを表示することができ、下図のようにグラフエクスポートコマンドを非表示にすることができる。
6.3 記述統計量
簡単な例。
sysuse auto summarize
knitrのチャンクオプション{stata, collectcode=TRUE}
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
1.6.4 度数分布表
チャンクオプション echo=FALSE, cleanlog=FALSE を使用すると、より典型的な Stata ドキュメントスタイルになる。
sysuse auto tab1 foreign rep78
knitrのチャンクオプション{stata, echo=FALSE, cleanlog=FALSE}
結果
. sysuse a(1978 Automobile Data)
. tab1 foreign rep78
-> tabulation of foreign
Car type | Freq. Percent Cum.
------------+-----------------------------------
Domestic | 52 70.27 70.27
Foreign | 22 29.73 100.00
------------+-----------------------------------
Total | 74 100.00
-> tabulation of rep78
Repair |
Record 1978 | Freq. Percent Cum.
------------+-----------------------------------
1 | 2 2.90 2.90
2 | 8 11.59 14.49
3 | 30 43.48 57.97
4 | 18 26.09 84.06
5 | 11 15.94 100.00
------------+-----------------------------------
Total | 69 100.00
1.6.5 T-テスト
もう一つの非常に簡単な例。
sysuse auto ttest mpg, by(foreign)
knitrのチャンクオプション{stata, echo=FALSE, cleanlog=FALSE}
結果。
. ttest mpg, by(foreign)
Two-sample t test with equal variances
------------------------------------------------------------------------------
Group | Obs Mean Std. Err. Std. Dev. [95% Conf. Interval]
---------+--------------------------------------------------------------------
Domestic | 52 19.82692 .657777 4.743297 18.50638 21.14747
Foreign | 22 24.77273 1.40951 6.611187 21.84149 27.70396
---------+--------------------------------------------------------------------
combined | 74 21.2973 .6725511 5.785503 19.9569 22.63769
---------+--------------------------------------------------------------------
diff | -4.945804 1.362162 -7.661225 -2.230384
------------------------------------------------------------------------------
diff = mean(Domestic) - mean(Foreign) t = -3.6308
Ho: diff = 0 degrees of freedom = 72
Ha: diff < 0 Ha: diff != 0 Ha: diff > 0
Pr(T < t) = 0.0003 Pr(|T| > |t|) = 0.0005 Pr(T > t) = 0.9997
1.6.6 グラフ
この例では、ログを表示しないように knitr chunk のオプション results="hide" を使い、ユーザーが見る必要がある Stata graph box コマンドのみを表示するように echo=1 を使っている。
sysuse auto graph box mpg, over(foreign) graph export "boxplot.svg", replace
knitrのチャンクオプション{stata, echo=1, results="hide"}
boxplotの例