No.00731 対数正規分布に従う乱数  【ハナ】 2006/07/26(Wed) 19:22

はじめまして。対数正規分布に従う乱数を発生させたいのですが,悩んでいます。
正規乱数を得る際には,(0,1] の一様乱数をボックス=ミューラー法で変換して得たN(0, 1)の正規乱数に,σをかけ,さらにμを加えることで正規分布N(μ, σ2)の正規乱数を発生させるという方法がありますが,これと同様に,一様乱数を用いて,任意の平均μ,分散σ2の対数正規分布に従う乱数を得たいと考え ています。
アドバイス,宜しくお願いします。

No.00733 Re: 対数正規分布に従う乱数  【青木繁伸】 2006/07/26(Wed) 21:35

R を使いましょう。

苦労は別のもっと苦労のしがいのあるところでしましょう。

No.00734 Re: 対数正規分布に従う乱数  【青木繁伸】 2006/07/26(Wed) 21:51

対数正規分布のlogをとれば正規分布になるのですから
正規分布のexpをとれば対数正規分布になります

> 任意の平均μ,分散σ2の対数正規分布

というのは,対数正規分布としての平均,分散ということでしょうか?
だとしたら前述のようにして対数正規分布に変換した後データを一度,平均値0,分散1に標準化して,その後σ倍してμを加えればよい。
対数正規分布にする前の正規分布のμ,σ2を意味しているのなら,そのような正規分布を作ってexpを取るだけですね。

R の乱数は素晴らしいですよ。

No.00735 Re: 対数正規分布に従う乱数  【ハナ】 2006/07/27(Thu) 12:50

ありがとうございます。
>> 任意の平均μ,分散σ2の対数正規分布
>というのは,対数正規分布としての平均,分散ということでしょうか?

説明不足で申し訳ありません。
対数正規分布にする前の正規分布のμ,σ2を意味しています。
標準正規乱数をZとすると,平均μ分散σ2で正規分布する乱数はσZ+μと表すことができると思います。

>対数正規分布にする前の正規分布のμ,σ2を意味しているのなら,そのような正規分布を作ってexpを取るだけですね。

というのは,単純にexp(σZ+μ) ということでよいのでしょうか?

No.00736 Re: 対数正規分布に従う乱数  【青木繁伸】 2006/07/27(Thu) 14:30

> 単純にexp(σZ+μ) ということでよいのでしょうか?

最初の二行に書いたことですね

ヒストグラムを描いてみればわかるでしょう。

なお,ln vs. exp の関連で書きましたが

log(x, a) vs. a^x と考えれば,a は任意です(言うまでもないけど)

No.00740 Re: 対数正規分布に従う乱数  【ハナ】 2006/07/27(Thu) 16:17

回答ありがとうございます。
>ヒストグラムを描いてみればわかるでしょう。

実は,先ほど質問させていただいたのは,正規乱数のexpをとったもののヒストグラムを描いたところ,対数正規分布の形にはなっていたのですが,横軸の値が大きくなりすぎてしまうという問題に直面したからです。非常に初歩的な質問をしてしまっているかもしれませんが・・・
元の対数正規分布にする前の正規分布のμ,σ2を反映したものにするにはどうすればよいのでしょうか?
宜しくお願いします。

No.00741 Re: 対数正規分布に従う乱数  【青木繁伸】 2006/07/27(Thu) 18:51

対数正規分布の平均値・標準偏差と,それを発生するときの正規分布の平均値・標準偏差を同じにしたいと言うことですか?

それも今までのコメントに書いてあるように,いったん作った対数正規分布の標準化をして,標準偏差倍して平均値を加えればいいのでしょ?
> n <- 10000 # 乱数の個数
> m <- 10 # 平均値
> s <- 2 # 標準偏差
# scale は,平均値0,標準偏差1に変換する関数
# rnorm は,正規乱数を発生させる関数(デフォルトでは標準正規乱数)
> x <- scale(rnorm(n))*s+m # 普通は正規化せずに rnorm(n, mean=m, sd=s)
> cat("平均値=",mean(x),"標準偏差=", sd(x))
平均値= 10 標準偏差= 2 # 指定したとおりの平均値と標準偏差になる
> lx <- scale(exp(x))*s+m # 対数正規分布に変換して,なおかつ平均値と分散を指定
> cat("平均値=",mean(lx),"標準偏差=", sd(lx))
平均値= 10 標準偏差= 2 # ちゃんとなっている
> par(mfrow=c(2,1))
> hist(x) # ヒストグラムを描いておく
> hist(lx)

fig


No.00742 Re: 対数正規分布に従う乱数  【青木繁伸】 2006/07/27(Thu) 22:32

ああ。
でも,こうしてしまうともう,それは対数正規分布じゃなくなりますね。
対数をとっても正規分布にならないや。

そもそも線形変換した後,0以下の値が生じてしまうことだってあるわけで,そんなの対数さえとれませんがな。

No.00747 Re: 対数正規分布に従う乱数  【ハナ】 2006/07/28(Fri) 00:53

非常に詳しく説明していただき,ありがとうございました。
>それも今までのコメントに書いてあるように,いったん作った対数正規分布の標準化をして,標準偏差倍して平均値を加えればいいのでしょ?

おっしゃられている通りでした。少し混乱してしまっていたようです。
ありがとうございました。

No.00765 Re: 対数正規分布に従う乱数  【マスオ】 2006/07/28(Fri) 23:55

対数正規分布の平均と分散とμとσとの関係式

http://aoki2.si.gunma-u.ac.jp/lecture/Bunpu/log-normal.html

からμとσを導けばよいのでは?

例えば Rでは,対数正規分布の平均を ml,標準偏差を slとして,正規分布の平均 mと標準偏差 sは,

ml <- 2
sl <- 0.5
v <- log((sl/ml)^2+1)
m <- log(ml)-v/2
s <- sqrt(v)
xl <- exp(rnorm(100000, mean=m, sd=s))
hist(xl, freq=FALSE)
curve(dlnorm(x, mean=m, sd=s), col=2, add=TRUE)
c(mean=mean(xl), sd=sd(xl))
# mean sd
# 2.0006301 0.5001277
>

でよいのかな?

fig


No.00766 Re: 対数正規分布に従う乱数  【青木繁伸】 2006/07/29(Sat) 00:13

おみごと!!
いつも,ありがとうございます>マスオさん

● 「統計学関連なんでもあり」の過去ログ--- 039 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る