井出草平の研究ノート

RStudio上のRを使う感覚でStataが利用できるパッケージ Statamarkdown[R][Stata]

RStudio上のRを使う感覚でStataが利用できるパッケージである。

www.ssc.wisc.edu

はてなブログではチャンクオプションが表示できないため、原版と見比べながら学習してほしい。


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パッケージをロードすることにより、予備的なコードチャンクで行うことができる。

library(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の例