従来のプログラミング言語を使用して、既知の平均と分散を持つ正規分布からサンプリングする方法は?


36

統計学のコースを受講したことがないので、ここで適切な場所で質問することを望みます。

正規分布を記述する2つのデータ、平均および分散ます。コンピューターを使用して、この2つの統計を尊重するように、この分布からランダムにサンプリングします。σ 2μσ2

サンプルを出力する前に各サンプルにを追加するだけで、0付近で単純に正規化することで平均を処理できることは明らかです。しかし、を尊重するようにプログラムでサンプルを生成する方法がわかりません。σ 2μσ2

私のプログラムは、従来のプログラミング言語になります。統計パッケージにアクセスできません。


あなたの言語には乱数ジェネレーターがありますか?このジェネレーターは一様分布のみから生成されますか、それとも正規分布から生成することもできますか?
ttnphns

@ttnphns:ほとんどすべてのコンピューター言語には乱数ジェネレーターが付属しています。それらは、いくつかの有限領域で圧倒的に均一なジェネレータです。
Fixee

回答:


33

平均0および分散1の特定の分布からサンプリングできる場合、平均および分散を持つその分布のスケール位置変換から簡単にサンプリングできます。が平均0および分散1の分布のサンプルである場合、 は平均および分散サンプルです。したがって、平均追加する前に、標準偏差(分散の平方根)で変数をスケーリングするだけです。σ 2のx σ のx + μ μ σ 2 σ μμσ2x

σx+μ
μσ2σμ

平均0と分散1の正規分布から実際にシミュレーションを取得する方法は、別の話です。そのようなものを実装する方法を知るのは楽しくて面白いですが、統計パッケージまたはプログラミング言語を使用するかどうかにかかわらず、乱数生成に適した関数またはライブラリを取得して使用することをお勧めします。使用するライブラリに関するアドバイスが必要な場合は、使用しているプログラミング言語に関する特定の情報を追加できます。

編集:コメント、他のいくつかの回答、Fixeeがこの回答を受け入れたという事実に照らして、均一変数の変換を使用して通常の変数を生成する方法についてさらに詳しく説明します。

  • VitalStatistixのコメントで既に言及されている1つの方法は、2つの独立した一様ランダム変数を取り、2つの独立した通常のランダム変数を生成するBox-Mullerメソッドです。さらにいくつかのシミュレーションを犠牲にして、2つの超越関数sincosの計算を回避する同様の方法が、francogrexによる回答として投稿されました。
  • 完全に一般的な方法は、逆分布関数による均一なランダム変数の変換です。が一様に分布している場合、 は標準正規分布になります。の明示的な分析式はありませんが、正確な数値近似により計算できます。Rの現在の実装(最後にチェックした)は、この考えを使用しています。この方法は概念的には非常に単純ですが、正確な実装が必要です。これは、おそらく(他の)超越関数logsin、およびcosほど普及していないでしょう。[ 0 1 ] Φ - 1U Φ - 1 Φ - 1U[0,1]
    Φ1(U)
    Φ1Φ1
  • いくつかの答えは、中心極限定理を使用して正規分布を均一なランダム変数の平均として近似する可能性に言及しています。これは一般的に推奨されません。平均0と分散1のマッチングなどの提示された引数、および分布のサポートの考慮事項は説得力がありません。Christian P. RobertとGeorge Casellaによる「Rによるモンテカルロ法の紹介」の演習2.3では、このジェネレータは時代遅れと呼ばれ、近似は非常に貧弱と呼ばれています。
  • 他にも多くのアイデアがあります。「コンピュータプログラミングの技術」第3巻の第3章、特にセクション3.4。ドナルドE.クヌースによる2は、乱数生成に関する古典的な参考文献です。ブライアンリプリーは、ランダム変数のコンピューター生成:チュートリアルを執筆しました。これは役に立つかもしれません。RobertとCasellaが言及した本、またはおそらく他の本の第2章「モンテカルロ統計法」もお勧めです。

結局のところ、正しく実装された方法は、使用される均一な擬似乱数ジェネレーターよりも優れていません。個人的に、私は信頼できると思う特別な目的のライブラリに頼ることを好みます。私はほとんどの場合、Rに直接実装されているメソッド、またはC / C ++のAPIを介して実装されているメソッドに依存しています。明らかに、これは誰にとっても解決策ではありませんが、他のライブラリに精通していないため、代替案を推奨できません。


(+1)OPに対する適切な回答とアドバイス。
枢機

18
ここで不必要なコメントを付けているかどうかはわかりませんが、均一な乱数ジェネレーターにしかアクセスできない場合は、Box-Muller変換を使用して独立したN(0,1)乱数を生成できます。簡単に言えば、U_1とU_2がUniform(0,1)分布から独立した描画である場合、および は、独立したN(0,1)確率変数として分布しています。基本的なアイデア
2log(U1)cos(2πU2)
2log(U1)sin(2πU2)
-VitalStatistix

2
@Vital:不要なコメントではありません。いいもの。おそらく、Box-Muller変換は、誤って何か悪いことをする可能性を最小限に抑えて、非常に簡単にプログラムできます。最速ではありませんが、十分な競争力があります。とはいえ、確立されたコードライブラリを使用することは、おそらくより安全です。特に、間違いを犯す可能性が最も高いのは、一様なランダム変量入力の生成方法だからです。
枢機

@Vital:ありがとう、これが私が探していたものです。コメントを回答に変換したい場合は、喜んで賛成します。
Fixee

1
@VitalStatistix、それは素晴らしいコメントであり、これはOPが探していたものであったようです。それを答えに変えて、均一なランダム変数の変換を使用するという一般的な考えについて少し詳しく説明してみませんか。Cardinalが主に言及している理由でこれを行うのをためらいました。なぜなら、どの言語のデフォルトのユニフォームジェネレーターが良いジェネレーターであるかわからないからです。
-NRH

10

これは、マイケルルーの回答とFixeeのコメントに対するコメントですが、このサイトにコメントする評判がないため、回答として投稿されています。

[0,1]61

E[i=112Xi]=i=112E[Xi]=12×12=6
var[i=112Xi]=i=112var[Xi]=12×112=1.
i=112Xi610/12i=112Xi6[6,6]6

5

NRHによる答えに加えて、「標準正規分布」N(0,1)からランダムサンプルを生成する手段がまだない場合は、以下の方法が適切かつ簡単な方法です(統計情報がないため、パッケージの場合、以下の機能はほとんどの標準プログラミング言語で利用可能です。

1.およびによって
u = 2 r1 - 1、-1と1の範囲の2つの一様分布乱数としてuとvを生成します。v = 2 r2 - 1

2. w = u^2 + v^2w> 1の場合、計算して1に戻る

3. z= sqrt(-2ln(w)/w) サンプルコードでu * zおよびy = v * zを返すと、次のようになります。

u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
    z = sqrt((-2 * log(w)) / w);
    x = u * z;
    y = v * z;
    }

次に、MHRが上記で提案したものを使用して、からランダムに逸脱しN(mu, sigma^2)ます。


上記の回答を投稿したとき、@ vitalStatistixからBox-Muller変換アルゴリズムが提供されたことに気付きませんでした。私が上で与えたものは、私が思うに同じくらい良いです。
フランコレックス

2
Gaussian / Normal分布のpdfを直接使用するのではなく、(アルゴリズムの観点からではなく)一様分布から正規変量を生成する理由を説明してください。それとも完全に間違っていますか?
アルン

4
@Arun 1つの理由:均一な偏差を生成するRNGのみがある場合、Marsagliaの極座標法は便利です。
chl

1
@Arunそれが最も簡単な方法です。また、「受け入れ拒否」メソッドなどを使用して、pdfから直接生成することもできます。私のサイトに簡単なを投稿しました(ここのコメントボックスに十分なスペースがないため)。
-francogrex

4

正規分布は、類似した分布(互いに類似している、つまり同じ意味の)のランダムな値を多く加算すると現れます。10個以上の均一に分布したランダム値を合計すると、合計はほぼ正規分布になります。(さらに正常にしたい場合は10以上を追加しますが、ほとんどすべての目的には10で十分です。)

一様な乱数値が0〜1の間に一様に分布しているとします。合計は0〜10になります。合計から5を引き、結果の分布の平均は0になります。 (ほぼ)正規分布と結果に目的の標準偏差を掛けます。残念ながら、10個の一様なランダム偏差の合計の標準偏差が何であるかはわかりませんが、運が良ければ誰かがコメントで教えてくれるでしょう!

多くのシステムでの正規分布の仮定の有用性は、多くのランダムな影響の合計が正規分布につながるという性質に完全に由来するため、私はこれらの用語で正規分布について話すことを好みます。


ここでは、Central Limit Thmを使用しています(多数のiidランダム変数が合計されて通常のランダム変数になります)。遅すぎると思ったので、これは考慮しませんでしたが、10で十分だと言いますか?これは、ログとsin / cosとsqrtを計算するよりも優れています!
Fixee

また、[0,1]の均一rvの平均は0.5で、分散は1/12です。これらを合計すると、平均5と分散10/12 = 5/6になります。
フィクシー

1
教育学的観点から、この方法は、素晴らしく有用な議論とデモンストレーションを提供します。ただし、実際にこのアプローチを使用することを強くお勧めします。
枢機

1
logsincos

1
@Michael:「近似」分布はコンパクトなサポートを備えており、多くのアプリケーションで、変数がどの程度効率的に生成されるのかを気にするので、「正しい」分布を与えると宣言することは少しストレッチです。:)ポイントは、いくつかのはるかに優れたオプションが利用可能であることです。しかし、私はまだ教育的に有用な何かを提供すると思います。
枢機卿
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.