zombie の殺し方

■ゾンビを殺す
たくさん open2(fork) したときに残っちゃう zombie たちを殺すには
$SIG{CHLD} = 'IGNORE';
と書けば良いようである.
http://perldoc.perl.org/functions/fork.html

■離散データのchi2を使った実現確率の推定
chi2検定を使いたいけど各bin入るデータの個数が5個より少ない場合困ったことが起こる.
そのbinに入る個数の分布関数は「(中心極限定理を使った) Gauss 分布」で表すことができないために(中心極限定理はn->inftyの極限をとるため)「Gauss 分布を仮定している chi2 分布関数から確率を見積る」という chi2 検定の仮定が破綻するからである.
というわけでこういうときはしょうがないので montecarlo で乱数から何度も分布を作ってみてその分布の chi2 のヒストグラムから実現確率を見積れば良い.
要するに数学的仮定をなしにしてすべて実験で確率を求めればよいという単純なことである.
実際は何度も realization やって,chi2 を計算しておいて,自分が計算した chi2 より大きい個数と realization の回数の比を使えば実現確率が見積れる.すげー単純.

ちなみに1回の試行で12個のデータを取り出し,それを6個のbinにいれるときに期待される分布関数と観測された分布関数で作られる chi2 の分布関数が下.
12個って固定してるから自由度は一個へって5.したがって自由度5のchi2分布関数が期待される.これは
> gsl-randist 1 83334 chisq 5 | gsl-histogram 0 25 25
で計算できる.gsl 便利
一方で12個しかないので中心極限定理が使えないから chi2 には従わないはずで,実際どんな分布関数になるかを計算したのが下の図.
(83334, 1e4, 1e3)は実際やった試行の回数(といっても1e4,1e3は head -10000 とかでとりだしただけ).
結果は概ね変わらなかったので安心した.

一つだけ宿題.
binの中に1個以下しか入らない場合,chi2 を計算する時の sigma の見積もりはやはり中心極限定理が使えないので montecarlo を使うべきである.(現在はsqrtをとってるだけなのでまずい.)これを考慮して計算する.
まぁ普通に Poisson 過程だと思ってけいさんすりゃいいか.めんどくさいし.