2018年5月4日金曜日

2匹でやめておきたい時

何気なく今まであやふやにして誤魔化していたことを少し確かめてみました。どのような実験であれ誤差を出さないといけません。英語では uncertainty, standard deviation (sigma), error bar, root mean square deviation (RMSD) などと表します(細かな違いがあるとは思いますが)。ここでは(平均値)+- (1標準偏差)を表すことにします。「プラス・マイナス」にご注意ください。しばしばエラーバーの長さは?と尋ねられ、プラスもマイナスも含めた全体のバーの長さのことなのか?それとも正か負か片方だけの長さのことなのか?で迷います。前者は後者の2倍の長さになります。しかし、以下では後者の方(片方だけの長さの絶対値)を指すことにします。

もし実験を 100 回も 10,000 万回も繰り返すことができれば、それらの値を統計処理して、(平均値)+- (1標準偏差)を出すことができます。これが実験の上ではもっとも正確な誤差でしょう。しかし、一回の測定に云百万円もかかるとすると、せいぜい2回程度(1回?)しかできないことになります。この2回の実験で得られた値を使ってエラーバーを書いてもよいのかどうか?という点が長らくの疑問でした。

ここから下に書く内容は、次のことと多いに関係しています。標準偏差を出す時の手順です。まず、データ a が 10 個あるとすると、その 10 個の平均値 v を出します。そして、それぞれのデータ a から v を引きます。さらにそれぞれの差 (a-v) を2乗します。それらの値 (a-v)^2 を足して n=10 で割ります。これを分散と呼びますが、最後にこの分散のルート(平方根)をとれば標準偏差になります。(標準偏差)= Sqrt(分散)sqrt とは root のことで、しばしば数学のプログラムで使われています。

この処理はちょうど RMSD と同じです。RMSD は後ろから読んでいきます。D は differnece ですので差です。つまり、平均値 v からの差をとります (a-v)。Square は2乗です (a-v)^2。Mean は平均です。R は root です。よって「RMSD = 標準偏差」になりそうな気がします。

ところが、標準偏差の式をいろいろと調べてみると、(a-v)^2 を全て足すところまでは良いのですが、その後 n で割るのではなく (n-1) で割っている式も時々出てきます。昔から不思議だったのですが、この (n-1) はいったい何?

実は Wikipedia に答がちゃんと書かれていました。無限回数の実験をこなした時(いわば理想的な状況)での標準偏差と、事情により数回の実験しかできなかった時(現実的な状況)での標準偏差のことでした。そして、

無限回数での分散 : 限定回数での分散 = n : n-1

となるのだそうです。標準偏差を2乗すると分散になりますので、上記の公式をルート(平方根)すると標準偏差の式にそのまま変身します(しかし、そうとも言い切れないので下記を参照してください)。

ここで現実的な状況を考えてみましょう。分散を計算する時に n で割り算したとします。つまり (R)MSD の計算と同じです。すると、それはあくまでその限定された回数における分散であって、仮に無限回数実験をしたと仮定した時の分散値よりも小さくなってしまうということです。それでは、少ない回数であたかも無限回数実験したかのように計算するにはどうすればよいのか?n で割るのでなく (n-1) で割るということになります。すると、ちょっと大きめの値が出てくると思います。これで良いのだそうです。なぜ (n-1) で割ってちょっと大きめにするかは、調べてみるといろいろ載っていましたが、ここでは複雑ですので記さないことにします。

よって数匹の鼠 n=3 でしか実験しなかった状況で (R)MSD をまじめに計算すると(3で割ると)、もし1億匹の鼠 n=100,000,000 で実験したと仮定した場合の (R)MSD よりも小さめの値が出てしまうということです(n-1=2 で割るとよい)論文にそのようなエラーバーを出すとこれはデータを都合の良い方に解釈したことになり、データ捏造になるのでしょうか?

ややこしい問題は使っているソフトにもあります。もし、そのソフトの標準偏差のツールが、すでにあえて n ではなくて (n-1) を使っていたとすると、その標準偏差は無限回数への拡張を想定していたことになります。一方、RMSD のように n で割っていたとすると、それはその制限回数内のみでの標準偏差を表していることになり、ちょっと小さい値なので得をします。実験を数多く繰り返して n を大きくすると、n と (n-1) の違いが小さくなってきますので、両者の RMSD はどんどん似てきます。

n と n-1 が問題になってくるのは n の値が小さい時です。可哀想な話ですが、もし鼠 100 匹で実験したとすれば、無限回数と制限回数での標準偏差はたったの 0.5% しか違いません。もし、n=10 ですと 5% ぐらいです。幸いうちではバクテリアしか使いませんので、制限されているといえどもすでに数え切れない位の大きな n と言えます。

さて、問題は2回しか実験しなかった場合です。ソフトによってはエラーバーの大きさが 1.4 倍(sqrt(2))違ってきますので、ちょっと問題です。

2つのデータ a, b があり、それの RMSD を計算しました。v = (a+b)/2 ですので、(a-v)^2 と (b-v)^2 を計算し、これを足して2で割ります。最後に平方根をとります。Mathematica で

Simplify[Sqrt[Mean[{(a - Mean[{a, b}])^2 , (b - Mean[{a, b}])^2}]]]

と打つと、これが abs(a-b)/2 と同じ値であることが分かります。abs とは絶対値のことです。

一方、2個のデータから無限回数を想定して統計をとるとすると、標準偏差は abs(a-b)/sqrt(2) となり、先ほどの2個だけで閉じた標準偏差よりも 1.4 倍だけ大きな値になります。この値をしぶしぶ文献に載せるべきでしょうか?

Simplify[Sqrt[Plus[(a - Mean[{a, b}])^2, (b - Mean[{a, b}])^2]/(2 - 1)]]

では Excel ではどうなっているのだろう?と気になり、調べてみるとちゃんと2個の関数が別々に定義されていました。具体的には 5.3 と 9.2 という2個の数値を使いました。STDEVP 関数は n を使っているので 1.95 となりました。一方 STDEV は n-1 を使っているので 2.76 となりました。両者は 1.4 倍違います。ここでは 1.95 を使いたいところですが、ちゃんとプラスマイナス 2.76 の長さのエラーバー(合計長さは 2.76*2)を記載しました。P は parent の P です。限定された少ない標本を選び出してきて、その少ない数があたかも母集団そのものである(他にデータは何もない)と考えるとよいのだそうです。

本当にこれで良いのかどうかを確かめるべく、シミュレーション実験してみました。乱数が正規分布になるようにしました。例えば(平均値3, 標準偏差2)になるような乱数を 10,000 個発生させました。つまり、10,000 万回実験したことになります。次に任意の2個を抜き取ってきます。これが実際には2回しか実験できなかったことを意味します。そして、この2個の数値を処理した時に果たして(平均値3, 標準偏差2)になるかどうかです。

まず平均値3については、まったく問題なく再現できました。もちろんたまたま選び出した2点の平均値は3からずれています。そかし、それを多数回おこない、それらの平均をとると3に極めて近づきました。しかし、標準偏差2についてはちょっと上記で理解したこととは異なってしまいました。

実際に任意の2点の差の絶対値をたくさん求めてみた結果、その平均値は 2.27 になりました。つまり、ルート2で割る必要がないぐらいです。それではと中央値 median をとってみると 1.93 でした。これもルート2で割るまでもありません。それでは2点の標準偏差はどうなるのかと思い計算してみました。Mathematica の StandardDeviation 関数のですので無限回数を想定しての標準偏差(n-1=1 を使っている)です。その平均値は 1.60 でした。ますます変な値になることは分かっていながら RMSD を計算してみました。n=2 を使う方式です。これは 1.13 と、やはり予想どおり小さな値(1/1.4)になってしまいました。

これはおかしいなと思い、また Wikipedia をしっかりと見てみると答が載っていました。

分散の場合
 無限回数での分散 : 限定回数での分散 = n : n-1
標準偏差の場合
 無限回数での標準偏差 : 限定回数での標準偏差 = sqrt(n) : sqrt(n-1.5)

これはややこしい。単純に平方根をとればよいと思っていたのに、無限回数を想定した分散と標準偏差とでは計算の仕方が違うのだそうです。前者は n-1 で割り、後者は n-1.5 で割ると理想値に近づくのだそうです。n=2 のとき (n-1.5) = 1/2 になります。そのようにして2個の標準偏差を計算すると、ちょうど差の絶対値と同じ値になります。

Simplify[Sqrt[Plus[(a - Mean[{a, b}])^2, (b - Mean[{a, b}])^2]/(1/2)]] は Abs(a-b) と同じです。

以上から言えることは、2点間の差の絶対値をそのまま1標準偏差 s にするとまずまず良いのではないかということです。平均値を v とすると、無限回数測定したと仮定した場合の統計は v +- s となります。n=2 以外の場合、STDEVP 関数で計算した値には sqrt(n/(n-1.5)) をかけ、STDEV 関数で計算した値には sqrt((n-1)/(n-1.5)) をかけて補正すればよいのでしょうか?ややこしいです。

0 件のコメント: