過去ログ

                                Page      96
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼はじめまして、normsinvについてなんですが...  atu 02/9/17(火) 5:58
   ┗Re:はじめまして、normsinvについてなんですが...  こうちゃん 02/9/17(火) 9:52
      ┗こうさんはじめまして、説明不足ですみませ...  atu 02/9/17(火) 13:29
         ┗Re:こうさんはじめまして、説明不足ですみませ...  こうちゃん 02/9/17(火) 15:32
            ┗いえいえ、  atu 02/9/17(火) 15:56
               ┗Re:いえいえ、  でれすけ 02/9/18(水) 11:26
                  ┗ありがとうございます。  atu 02/9/18(水) 16:56

 ───────────────────────────────────────
 ■題名 : はじめまして、normsinvについてなんですが...
 ■名前 : atu
 ■日付 : 02/9/17(火) 5:58
 -------------------------------------------------------------------------
   はじめまして、私はnormsinv(標準正規累積分布関数の逆関数の値を返す)関数について実際どのような関数か知りたくていろいろ探した結果こちらにたどり着きました。vbでプログラムしたいと思っているのですが、逆関数を求めるのにどうすればよいか分からず困っています。いろいろなページを見ても使い方などばかりで中身については触れていないものしか見つけられませんでした。どなたかお知恵を貸していただければ幸いです。
 ───────────────────────────────────────  ■題名 : Re:はじめまして、normsinvについてなんですが...  ■名前 : こうちゃん <nakajima19@hotmail.com>  ■日付 : 02/9/17(火) 9:52  -------------------------------------------------------------------------
   atu さん、こんにちは

>はじめまして、私はnormsinv(標準正規累積分布関数の逆関数の値を返す)関数について実際どのような関数か知りたくていろいろ探した結果こちらにたどり着きました。vbでプログラムしたいと思っているのですが、逆関数を求めるのにどうすればよいか分からず困っています。いろいろなページを見ても使い方などばかりで中身については触れていないものしか見つけられませんでした。どなたかお知恵を貸していただければ幸いです。

計算式に「=NORMSINV(確率)」とするだけだと思うのですが、なにがわからないのか、もう少し具体的にお願いします。
もし「標準正規累積分布関数の逆関数」の意味がしりたいということでしたら、ここはVBAの質問箱なので、お知りになりたいことはここの趣旨とは違っているようですが?

ところでEXCELのHELPはみてみましたか?
標準正規累積分布関数「NORMDIST」は理解しているのですか?
「NORMSDIST」「NORMDIST」「NORMINV」あたりをHELPで見てみてくださいね。

#ここに書いていいものかどうか悩みましたが、数学パズルの解答として、ちょっと面白いnormsinvの用例みつけましたので参照してみてください。

http://www.itac.gr.jp/pe/bbs/kaitou/

なお、問題は
---------------------------------------------------------
上記URLより抜粋
---------------------------------------------------------
ある学校で模擬テストを行なったところ、500人が受験した。
そのうちの上位50人の点数(全科目の合計点)は公表されたが、平均値や標準偏差は
公表されなかった。

<問題>
A君は、自分の得点は知っているが50位以内には入っていない。
A君の偏差値を推定する方法を示せ。

なお、意図的に白紙答案を出したり、一部の科目の受験をサボったりするような
不届きな学生はいないものとする
---------------------------------------------------------
だそうです。


回答でなくてごめんんなさい
 ───────────────────────────────────────  ■題名 : こうさんはじめまして、説明不足ですみませ...  ■名前 : atu  ■日付 : 02/9/17(火) 13:29  -------------------------------------------------------------------------
   私が知りたいのは、normsinvの使い方ではなくて
normsinv関数が確率を受けてどのような作業をして答えの数字を返しているのか
その構造を知りたいんです。
もしかするとここの質問箱には不適切な質問かもしれませんが、
もしご存知でしたらお知恵を貸してください。よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:こうさんはじめまして、説明不足ですみませ...  ■名前 : こうちゃん <nakajima19@hotmail.com>  ■日付 : 02/9/17(火) 15:32  -------------------------------------------------------------------------
   atu さん、こんにちは

>私が知りたいのは、normsinvの使い方ではなくて
>normsinv関数が確率を受けてどのような作業をして答えの数字を返しているのか
>その構造を知りたいんです。
>もしかするとここの質問箱には不適切な質問かもしれませんが、
>もしご存知でしたらお知恵を貸してください。よろしくお願いします。

HELPや参照ページはご覧になりましたか?

私も関数の構造(中身)や、アルゴリズムはわかりません^^;
また、統計論的な考え方も??です。(標準偏差すらあやしい>おれ(((^^;)

なので、残念ながらわたしではこれ以上のおやくにたてそうにありません。
他のかたの書き込みをおまちください。ごめんなさい。
 ───────────────────────────────────────  ■題名 : いえいえ、  ■名前 : atu  ■日付 : 02/9/17(火) 15:56  -------------------------------------------------------------------------
   親切に接していただいてありがとうございます。
逆関数を求めるプログラムって複雑なものになるととても大変なんですよね、
こうしてる間にも続けてるんですがどうもうまく行かなくて泣きそうです。
 ───────────────────────────────────────  ■題名 : Re:いえいえ、  ■名前 : でれすけ  ■日付 : 02/9/18(水) 11:26  -------------------------------------------------------------------------
   こんにちは。

正規分布の累積分布関数は、簡単な初等関数で表現することはできいです。

なので、繰り返し計算をして求めることになります。

ヘルプには、
>NORMINV 関数では、関数値の計算に反復計算の手法が利用されます。
>確率の値が指定されると、計算結果の精度が ±3x10-7 以内になる
>まで反復計算が行われます。100 回反復計算を繰り返しても計算結果
>が収束しない場合、エラー値 #N/A が返されます。
とあります。

Excelの内部でどのようなアルゴリズムで計算をしているかは分かりませんが、
これだけの情報を基に 極ごくてきとーにコードを起こしてやると
こんな感じになります。

雰囲気だけ感じ取ってください。

最初にxの初期値を与えて、その時の累積確率を求めて、
合わなかったらxを修正というのを繰り返していきます。

Function MyNormSinv(p0 As Double) As Variant

Dim p As Double, x As Double
Dim eps As Double, loop_count As Long
Const max_count = 100

eps = 3 * 10 ^ -7
loop_count = 0

x = 0
p = Application.WorksheetFunction.NormDist(x, 0, 1, True)
Do While Abs(p0 - p) > eps And loop_count < max_count
  x = x + (p0 - p) / Application.WorksheetFunction.NormDist(x, 0, 1, False)
  p = Application.WorksheetFunction.NormDist(x, 0, 1, True)
  loop_count = loop_count + 1
Loop

If loop_count >= max_count Then
  MyNormSinv = CVErr(xlErrNA)
Else
  MyNormSinv = x
End If

End Function
 ───────────────────────────────────────  ■題名 : ありがとうございます。  ■名前 : atu  ■日付 : 02/9/18(水) 16:56  -------------------------------------------------------------------------
   どうにかこうにか求めれそうな感じになってきています。
ただ最初に考えていたことよりは幼稚な考えになっているように思えるのですが
結果はほぼ正しいと思えるので一応満足しています。

質問に回答くださった方々本当にありがとうございました。
また何かの時にはよろしくお願いします。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 96