Excelのnormdist関数をJavaScriptで使いたいのですが利用可能なライブラリやロジックを教えて頂けないでしょうか。
第4引数である関数形式はTRUE(=累積分布関数)を利用したく思います。
npmもチェックしつつあるのですが私自身あまり正規分布等詳しくなく、これだというものが探しきれておりません。
お詳しい方がいらっしゃいましたらご教示のほど宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
度々すいません、Excelのnormdistと同じように第四引数にtrueで累積分布関数が、falseで確率密度関数が出てくるJavaScript関数、normdistを作りました。何個かのデータで試したところfalseの時はExcelと同じ値になるのですが、trueだと小数第4〜6位あたりからどうしても合わなくなってしまいます。変数kやlpの値を上手いこと調整すれば同じ数字になるかもしれません。これ以上は自分の力では難しかったです
<script> function normdist(z, mean, sigma, bool) { if(bool == true) { const k = 0.0000001 const lp = 100000000; let num = 0; for(let i=0;i<k*lp;i+=k) { num += normdist(z, mean, sigma, false) * k; z += k; } let ans = 1 - num; return Math.round(ans * 1000000000) / 1000000000; } else { const l = 1 / Math.sqrt(2*Math.PI*(sigma*sigma)); const zz = -1 * (z - mean) * (z - mean); let ans = l * Math.exp(zz /(2 * (sigma * sigma))); return Math.round(ans * 1000000000) / 1000000000; } } </script>投稿2020/08/13 13:15
総合スコア11
0
すいません、normdist関数とnormsdist関数を誤解してました。以下normdist関数をJavaScriptで作った物です。Excelのnormdist関数で実際に出た数字も載せておきます。
<script> alert(normdist(0.452,1.65,8.4,0.00001)); //0.4432952916476568 /*Excelのnormdist(0.452,1.65,8.4,true)は、 0.443295527*/ alert(pd(0.452,1.65,8.4,0.00001)); //0.04701256674650777 /*Excelのnormdist(0.452,1.65,8.4,false)は、 0.047012567*/ function normdist(z, mean, sigma, k) { let num = 0; while(Math.abs(pd(z, mean, sigma) - pd(z+k, mean, sigma)) != 0) { num += pd(z, mean, sigma) * k z += k; } return 1 - num; } function pd(x, mean, sigma) { const l = 1 / Math.sqrt(2*Math.PI*(sigma*sigma)); const xx = -1 * (x - mean) * (x - mean); return l * Math.exp(xx /(2 * (sigma * sigma))); } </script>投稿2020/08/13 11:49
総合スコア11
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
はじめまして、Googleスプレッドシートのnormsdist関数と多少誤差がありますが、こんな感じで出せると思います。
normsdist関数の第二引数のkは、確率密度関数を積分する時の幅です。kの値を大きくすれば誤差は小さくなりますが、その分時間がかかります。
normsdist(z, k)が、累積分布関数、pd(x)が、確率密度関数です。
プログラムの最初の方に、kの値を変えたものを何個か載せて、Googleスプレッドシートで実際に出る値と比較できるようにしておきました。
<script> /*Googleスプレッドシートのnormsdist(0.986)は、0.8379334436*/ alert(normsdist(0.986, 0.1)); //0.8254638681914913 alert(normsdist(0.986, 0.001)); //0.8378107443644953 alert(normsdist(0.986, 0.00001)); //0.8379322167797219 alert(normsdist(0.986, 0.000001)); //0.8379333208854342 ちょっと遅い alert(normsdist(0.986, 0.0000001)); //時間がかかり過ぎる。現実的でない /*累積分布関数*/ function normsdist(z, k) { let num = 0; /*zから∞までの確率密度関数の総和を求める。確率密度関数は値を充分大きくとれば0になるので、いつかはループを脱出する。*/ while(Math.abs(pd(z) - pd(z+k)) != 0) { num += pd(z) * k; /*高さpd(z)、幅kの長方形の面積がnumに入る*/ z += k; } return 1 - num; } /*確率密度関数*/ function pd(x) { const l = 1 / Math.sqrt((2*Math.PI)); return l * Math.exp(-1 * (x * x) / 2); } </script>投稿2020/08/13 10:50
総合スコア11
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/19 21:28