★ ヒストグラムと対数正規近似 ★

8624. ヒストグラムと対数正規近似 わたなべ 2005/12/09 (金) 14:12
└8626. Re: ヒストグラムと対数正規近似 青木繁伸 2005/12/09 (金) 14:35
 └8633. Re^2: ヒストグラムと対数正規近似 わたなべ 2005/12/10 (土) 13:29
  └8634. Re^3: ヒストグラムと対数正規近似 青木繁伸 2005/12/10 (土) 16:58
   └8635. Re^4: ヒストグラムと対数正規近似 青木繁伸 2005/12/10 (土) 17:21
    └8662. Re^5: ヒストグラムと対数正規近似 わたなべ 2005/12/12 (月) 18:53
     └8663. Re^6: ヒストグラムと対数正規近似 青木繁伸 2005/12/12 (月) 19:36
      └8664. Re^7: ヒストグラムと対数正規近似 わたなべ 2005/12/12 (月) 19:59
       ├8669. Re^8: ヒストグラムと対数正規近似 青木繁伸 2005/12/12 (月) 22:14
       │└8678. Re^9: ヒストグラムと対数正規近似 青木繁伸 2005/12/12 (月) 23:09
       └8666. Re^8: ヒストグラムと対数正規近似 cricket 2005/12/12 (月) 21:58
        └8667. Re^9: ヒストグラムと対数正規近似 cricket 2005/12/12 (月) 22:06
         └8679. Re^10: ヒストグラムと対数正規近似 わたなべ 2005/12/12 (月) 23:17
          └8692. Re^11: ヒストグラムと対数正規近似 マスオ 2005/12/14 (水) 01:45
           └8693. Re^12: ヒストグラムと対数正規近似 マスオ 2005/12/14 (水) 01:49


8624. ヒストグラムと対数正規近似 わたなべ  2005/12/09 (金) 14:12
実測値をもとにヒストグラムを描きました.このグラフが対数正規分布していると思われるのですが,対数正規近似はどのように描くのでしょうか?ヒストグラムと重ねて,描きたいのですが・・・・

     [このページのトップへ]


8626. Re: ヒストグラムと対数正規近似 青木繁伸  2005/12/09 (金) 14:35
R だと,以下のように簡単になりますね。

> data <- rlnorm(10000) # テストデータ
> hist(data,freq=FALSE) # ヒストグラム
> x <- seq(0,25, length=100) # x 座標
> y <- dlnorm(x) # y 座標,密度関数 f(x)
> lines(x, y) # 密度関数 y=f(x) の曲線

実際には, x の範囲を決めることと,データから meanlog, sdlog を推定して dlnorm の引数を指定する

     [このページのトップへ]


8633. Re^2: ヒストグラムと対数正規近似 わたなべ  2005/12/10 (土) 13:29
返信ありがとうございます.
申し訳ありません.Rについては無知でありまして,できたらエクセルで書きたいのですが.(一応Rについての勉強もいたしましたが,使いこなすには時間がかかりそうなので・・・)
そもそも単純な質問に戻ってしまうのですが,たとえば実測値(x変数)が少数の場合,対数をとると(lnx)がマイナスになってしまい,ヒストグラムに重ねて表示することはできないようにおもえるのですが.

     [このページのトップへ]


8634. Re^3: ヒストグラムと対数正規近似 青木繁伸  2005/12/10 (土) 16:58
やってみればわかります。
ちゃんとできますよ。
あなたは,何か勘違いしているのかもわかりませんが。
しかも,R だととっても簡単。

     [このページのトップへ]


8635. Re^4: ヒストグラムと対数正規近似 青木繁伸  2005/12/10 (土) 17:21
小数データを含む場合でも問題なし


以下の例を
> data <- round(rlnorm(100)/10,3)
> data
[1] 0.061 0.048 0.161 0.020 0.221 0.338 0.076 0.039 0.204 0.200 0.013 0.052 0.101 0.023
[15] 0.010 0.051 0.024 0.094 0.054 0.013 0.167 0.043 0.091 0.108 0.185 0.570 0.019 0.989
[29] 0.238 0.066 0.105 0.267 0.353 0.482 0.140 0.025 0.148 0.036 0.726 0.100 0.246 0.047
[43] 0.041 0.110 1.047 0.049 0.163 0.068 0.199 0.079 0.128 0.105 0.035 0.194 0.046 0.104
[57] 0.071 0.033 0.365 0.137 0.064 0.042 0.132 0.086 0.109 0.166 0.069 0.049 0.070 0.076
[71] 0.386 0.270 0.386 0.096 0.098 0.648 0.286 0.043 0.041 0.026 0.127 0.470 0.333 0.226
[85] 0.025 0.063 0.115 0.083 0.096 0.053 0.099 0.504 0.080 0.090 0.128 0.569 0.607 0.218
[99] 0.061 0.535
> hist(data,breaks=0:28/20,freq=FALSE,ylim=c(0,7))
> x <- seq(0,1.4,length=100)
> y <- dlnorm(x,meanlog=mean(log(data)),sdlog=sd(log(data)))
> lines(x,y,col="red")

これによって描かれた図は
http://aoki2.si.gunma-u.ac.jp/lecture/mb-arc/lognormal.pdf

     [このページのトップへ]


8662. Re^5: ヒストグラムと対数正規近似 わたなべ  2005/12/12 (月) 18:53
返信が遅れてしまい申し訳ありません.ありがとうございました.
重ね重ね質問なのですが,ソース中で推定を行った,対数正規の母数meanlogとsdlogの数値を表示させることはできないのでしょうか?

     [このページのトップへ]


8663. Re^6: ヒストグラムと対数正規近似 青木繁伸  2005/12/12 (月) 19:36
> mean(log(data))
> sd(log(data))

で,表示できます。

     [このページのトップへ]


8664. Re^7: ヒストグラムと対数正規近似 わたなべ  2005/12/12 (月) 19:59
ありがとうございます.Rを用いて,ヒストグラムの対数正規分布近似の表示はうまくいきました.
Rと平行して,エクセルでの描画にも挑戦していたのですが,やはりうまくいきません.何か根本的なやり方が間違っているのでしょうか・・・
エクセルでは対数正規分布の確率を求めるのにnormdist関数を用いています.またその関数の中身ですが,normdist(ln(x),meanlog,sdlog,0)となっております.

     [このページのトップへ]


8669. Re^8: ヒストグラムと対数正規近似 青木繁伸  2005/12/12 (月) 22:14
> エクセルでは対数正規分布の確率を求めるのにnormdist関数を用いています.またその関数の中身ですが,normdist(ln(x),meanlog,sdlog,0)となっております.

normdist は,正規分布の確率密度を計算するものですよ。
横軸が対数変換後の数値でよいのならいいですけど。
そうでないならまたexpしてもとの次元に戻さないといけませんしね。
lognormdistを使っているつもりじゃないのですか?loginvなんてのもありますけど。意味不明。
Excelでは,正規分布の密度関数曲線一つを描くのも不自由きわまりないです。

慣れ親しんでいるとはいっても,わざわざ不自由な環境にしがみつく必要はないでしょう。Excel は拡張性もないですしね。捨てても惜しくない(捨て去るべき)環境だと思います。

     [このページのトップへ]


8678. Re^9: ヒストグラムと対数正規近似 青木繁伸  2005/12/12 (月) 23:09
> > エクセルでは対数正規分布の確率を求めるのにnormdist関数を用いています.またその関数の中身ですが,normdist(ln(x),meanlog,sdlog,0)となっております.

横軸を,元の数値の次元で描くと仮定します。
そのためにはまず,元のデータについて,log を取ったものを別のセルに計算します。
ついで,その変換されたデータについてaverage,stdevp を計算します(average(log(データ範囲))みたいに計算できないんですね。。。)
これをそれぞれ,meanlog, meansd と称することにします。
次いで,元のデータの最小値から最大値までを適当な区切りで等差数列を別のデータ範囲に作ります。
次いで,その数値に対応する対数正規密度関数値を計算します。
=NORMDIST(log(xの値),meanlog,meansd,0))
それから,,ああ,疲れてくる,,
x範囲と対応する密度関数範囲を対象にして,散布図を描きます(マーカーを描かずマーカーを線でつなぎます)。
ああ,やっと,密度関数の曲線が描けました,,
まだ,これからこの図に,ヒストグラムを重ねないといけません。。。。グウグウ居眠り。

     [このページのトップへ]


8666. Re^8: ヒストグラムと対数正規近似 cricket  2005/12/12 (月) 21:58
> Rと平行して,エクセルでの描画にも挑戦していたのですが,やはりうまくいきません.何か根本的なやり方が間違っているのでしょうか・・・

分析ツールのヒストグラムを使っているのでしょうか?
(1)まず,食わせる数値データを適当なセル範囲に入れます。2行以上にわたってもかまいません。
(2)次に区間を指定するベクトルを別のセル範囲に入れます。例 10, 20, 30, 40
(3)あとは,ヒストグラムのパネルから,「入力範囲」の欄に(1)のセル範囲を,「データ区間」の欄に(2)の範囲を入力します。「グラフ作成」にチェックをしておきます。

 これでいかがでしょう。ずいぶん面倒ですね。「入力範囲」や「データ区間」という用語も不適切です。Rのほうがだいぶ使いやすいと思いますよ。

     [このページのトップへ]


8667. Re^9: ヒストグラムと対数正規近似 cricket  2005/12/12 (月) 22:06
失礼。内容が違いましたね。
対数正規の曲線を上に載せる方法ですね。
 エクセルでは任意の曲線を書くことができない(と思う)ので,シート上の別の欄に対応する対数正規分布の値をあらかじめ出しておき,ヒスグラムに折れ線を重ねる形になると思います。
 ギザギザになってしまうのはしかたないです。マーカーを消して,スムージングをするくらいですね。

     [このページのトップへ]


8679. Re^10: ヒストグラムと対数正規近似 わたなべ  2005/12/12 (月) 23:17
皆様ありがとうございます.ヒストグラムは分析ツールを用いて描いたものがRで描いたものと同じになったのですが・・・対数正規分布曲線の方が誤っていると思われます.
青木さま,詳細な手順をどうもありがとうございます.やはり,エクセルでは手間がかかる上に,なかなか思うようにいかないですね.捨て去る勇気を検討したいと思います.ありがとうございました.

     [このページのトップへ]


8692. Re^11: ヒストグラムと対数正規近似 マスオ  2005/12/14 (水) 01:45
お疲れ様です.

>> 関数の中身ですが,normdist(ln(x),meanlog,sdlog,0)となっております.

密度関数を xで割るのを忘れていませんか?
dlnorm(x,meanlog,sdlog) == dnorm(log(x),meanlog,sdlog)/x

> (average(log(データ範囲))みたいに計算できないんですね。。。)

配列数式(Ctrl+Shift+Enterキー入力,MACだとキーが違うかも)でできますよね.

参考例を作ってみました.
操作を書くのが面倒なのでVBAで.

次のコメントにあるスクリプトをコピーして,
Excelの新規ブックを開き,
Alt+F11キー(「ツール」「マクロ」「Visual Basic Editor」)で開くVBEで,
「挿入」「標準モジュール」で開いたところへ貼り付け,
F5キー(「実行」「Sub/ユーザーフォームの実行」)で,シートができます.
(または F8キーでステップ実行するとやっていることがわかる?)

そのシートを適当なブックに移動し,スクリプトを貼り付けたブックはいらないので捨ててください.

A列とB列はデモ用データ(B6,B7をパラメータとした200個の対数正規乱数)ですので消してから使ってください.

実際のデータは A1から欠損なしで一列で入れる.
D1はヒストグラムの左端の値,D2は区間幅を入れる.

meanln,sdlnと G列の密度関数*scaleの式を変えると,様々な分布曲線がかける(はず).
例:
D6 =AVERAGE(A:A)
G11 =GAMMADIST(F11,$D$6/2,2,0)*$D$9
を下へフィルでカイ2乗分布とか.

続く→

     [このページのトップへ]


8693. Re^12: ヒストグラムと対数正規近似 マスオ  2005/12/14 (水) 01:49

Sub CreateHistSheet()
Worksheets.Add
[B6] = 1: [B7] = 0.5
[A1] = "=LOGINV(RAND(),$B$6,$B$7)"
[A1].AutoFill [A1:A200]
[C1] = "min": [D1] = 0
[C2] = "step": [D2] = 1
[C5] = "n": [D5] = "=COUNT(A:A)"
[C6] = "meanln"
[D6].FormulaArray = "=AVERAGE(LN(R1C1:INDEX(C1,R5C4)))+R1C1:R2C1*0"
'↑最初の項はデータ数可変のためちょっとややこしい.最後の項はエラーよけのおまじない
[C7] = "sdln"
[D7].FormulaArray = "=STDEV(LN(R1C1:INDEX(C1,R5C4)))"
[C8] = "step2": [D8] = "=D2/5"
[C9] = "scale": [D9] = "=D5*D2"
[C11] = "=$D$1+(ROW()-ROW($C$11))*$D$2"
[D11] = "=ROUND(C10,2) & "" - "" & ROUND(C11,2)"
[C11:D11].AutoFill [C11:D21]
[E11:E22].FormulaArray = "=FREQUENCY(C1,R11C3:R21C3)"
[F11] = "=$C$11+(ROW()-ROW($F$11))*$D$8"
[G11] = "=NORMDIST(LN(F11),$D$6,$D$7,0)/F11*$D$9"
[F11:G11].AutoFill [F11:G61]
Set a = ActiveSheet
Charts.Add
With ActiveChart
.ChartType = xlColumnClustered
.SetSourceData a.[D12:E21], xlColumns
.SeriesCollection.NewSeries
With .SeriesCollection(2)
.Values = a.[G11:G61]
.ChartType = xlXYScatterLines
.Border.Weight = xlMedium
.MarkerStyle = xlNone
End With
.HasAxis(xlCategory, xlSecondary) = True
With .Axes(xlCategory, xlSecondary)
.Border.LineStyle = xlNone
.MajorTickMark = xlNone
.MinorTickMark = xlNone
.TickLabelPosition = xlNone
.MinimumScale = 1
.MaximumScale = 51
End With
.ChartGroups(1).GapWidth = 0
.Location xlLocationAsObject, a.Name
End With
End Sub

     [このページのトップへ]


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