質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

2137閲覧

ExcelのNORMDIST関数と同機能をJavaScriptで使用したい

toppunobice0

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/08/01 08:32

Excelのnormdist関数をJavaScriptで使いたいのですが利用可能なライブラリやロジックを教えて頂けないでしょうか。

第4引数である関数形式はTRUE(=累積分布関数)を利用したく思います。
npmもチェックしつつあるのですが私自身あまり正規分布等詳しくなく、これだというものが探しきれておりません。

お詳しい方がいらっしゃいましたらご教示のほど宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

JD5YG2KewC3MeHy

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toppunobice0

2020/08/19 21:28

ありがとうございます。だいぶ回答が頂けてなかったので見逃しておりましたすみません。 自分でも実装を行いましたため回答と突き合わせてみます。 ありがとうございました
guest

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

JD5YG2KewC3MeHy

総合スコア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

JD5YG2KewC3MeHy

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問