Stataでモンテカルロシミュレーション
(円周率のシミュレーション)

  • 一般的にモンテカルロシミュレーションとは、乱数を用いてある確率分布に従う多数の事象を発生させ、その結果がどのような分布になるかを検証する方法です。
  • この方法を応用したものが、ベイズ統計で事後分布を求めるためにマルコフチェーンモンテカルロ法(MCMC)として使用されています。
  • ここでは、モンテカルロシミュレーションがどのようなものかを体感していただくために、Stataを用いて半径が1の円の面積(=円周率3.14)のシミュレーションを行う例を紹介します。

1 doファイルのダウンロード

今回使用するコマンドをまとめたdoファイル2点(calcpi.doとsim_pi.do)です。zipファイルをダウンロード後に展開(解凍)してください。
doファイルは、Stataのメニューの「ファイル > 開く」で開いて使用します。

doファイル

zip

ZIP形式(1KB)

2 calcpi.do

正方形内に無作為に打った点が四分円内に入る割合を計算しましょう。

2.1 事前準備(点数の設定、観測数の設定、乱数の種の設定)

mc01

はじめにclearコマンドでデータセットをクリアします。次にlocalコマンドでマクロ変数myobsに100を代入し、setコマンドでobsmyobsを設定します。この操作によりデータセットの観測数(行数)が100行に設定されます。さらに、seedとして1を設定します。この後の無作為な数字を生成する際に使用されますが、この値を設定することで再現性を確保できます。以上で無作為に点を打つ準備が整いました。

2.2 一様分布から乱数を生成(“無作為な点”のX座標、Y座標として利用)

mc02

genコマンドで変数x, y, rを生成します。変数x, yには、runiform関数により0以上1以下の値が無作為に抽出され、代入されます。この値をXY座標上の点とみなし、正方形の範囲内に無作為に点を打ったと想定します。変数rにはxyの二乗和の平方根を代入します。この値が1以下である点(x, y)は四分円の内側にある点とみなすことができます。

2.3 四分円の内側の点のみ描画(四分円の外側の点は描画しない)

mc03

twowayコマンドでグラフを作成します。プロットタイプとしてscatterを指定し散布図を作成します。Y座標を変数y、X座標を変数xとし、条件「rが1以下」により四分円の内側にある点のみを描画します。オプションysize(5) xsize(5)で5×5インチのグラフを出力します。

続いてsuコマンドで条件「rが1以下」を満たすrの統計量を出力します。全体で100の点を打ちましたが、四分円の内側にある点は85であることが読み取れます。

mc04
mc05

2.4 四分円の内側の点数の割合の4倍を出力

mc06

suコマンドを実行すると内部変数が作成されr(N) に観測数が格納されるので、マクロ変数aに代入します。四分円の内側の点の割合を4倍した値を計算し、displayコマンドで出力します。計算結果として3.4と出力されますが、この値は半径が1の円の面積すなわち円周率になることが期待されます。

上記の結果は観測数を100としているため一桁目のみ合っているという結果でしたが、観測数を指定しているmyobsの値を1,000や10,000などのより大きな数字に変更して再度実行することで円周率に近づいていくことを確認してみましょう。

3 sim_pi.do

calcpi.doで行った作業を複数回行い、ヒストグラムを描いてみましょう。

3.1 事前準備(各種の設定、ポストファイルの設定)

mc07

先ほどのcalcpi.doの事前準備と同様にデータセットをクリアしローカルマクロ変数を設定して観測数を指定します。

genコマンドで変数x, y, rを生成しますが、乱数は後の操作で入力するので、ここでは0を入力しておきます。

sim_pi.doでは、calcpi.doで行った操作を複数回実行しますが、その結果を格納するためのデータセットが必要になります。しかし、Stataでは基本的に1つのデータセットを扱うため、結果を格納するためのスペースを用意する必要があります。このスペースを準備するためのコマンドがtempfile,tempname,postfileです。tempfileコマンドで一時ファイルにzfileという名前を割り当てます。次にtempnameコマンドで行列にmemholdという名前を割り当てます。最後にpostfileコマンドでzfileに結果を記録しておくための変数pisを生成します。

3.2 calcpi.doの内容を繰り返し実行

mc08

18行目から23行目まではcalcpi.doと同様の操作を行っています。24行目のpostコマンドで事前に準備した結果格納用のスペースに計算結果piを追加します。forvaluesコマンドで一連の操作を複数回行います。ここでは1,000回繰り返し実行しています。

postcloseコマンドでmemholdに新たに結果が追加されることがないことを宣言し、useコマンドでデータセットをクリアして結果を格納したzfileを読み込みます。

3.3 統計量の算出とヒストグラムの生成

mc09

変数pisに1,000回分の実行結果が格納されているので、suコマンドで統計量を出力し、histコマンドでヒストグラムを描画します。平均値は3.13676となっており、円周率3.14近辺を頂点とする釣鐘型の分布になっていることが確認できます。

mc10
mc11

4 まとめ

  • Stataを用いて円周率をシミュレーションする方法を紹介しました。モンテカルロシミュレーションはこのように、試行回数を増やしていくと真の分布に近づきます。
  • 観測数や繰り返しの回数を変更して再度実行し、変数pisの平均値が円周率に近い値となるか、ヒストグラムの形状がどのように変化するかなど、doファイルを編集してぜひお試しください。

参照文献

涌井 良幸, 涌井 貞美(2016). 身につく ベイズ統計学 (ファーストブックSTEP).
技術評論社
臼杵 政治(2020). モンテカルロ・シミュレーションをどう用いるか.
ニッセイ基礎研究所
https://www.nli-research.co.jp/report/detail/id=64114?site=nli

5 関連情報originpro

グラフ作成・データ分析ソフトウェアOriginProにもモンテカルロシミュレーションを行う機能が用意されています。

無料アプリ
Monte Carlo Simulation


OriginProユーザなら誰でも無料で利用できる追加アプリ
変換式と入力変数の分布パラメータを指定して、簡単にシミュレーションを実行

Origin Cでモンテカルロ
シミュレーション

  • 円周率
  • 2つの分布の混合モデルからのサンプリング

Stata is a registered trademark of StataCorp LLC, College Station, TX, USA, and the Stata logo is used with the permission of StataCorp.

page_top_icon