R には多種多様な乱数関連の関数があります。 xxx 分布に対して, dxxx
は密度関数, pxxx
は分布関数, qxxx
は quantile 関数といった感じです[A]。これらの関数がすべて提供されている場合は良いのですが,たまに一部が欠損していて,欲しくなる場合があります。大抵 Wikipedia で調べれば関数の形が載っているので実装は難しくありません。
例えば連続型分布で乱数生成関数が用意されている分布に対して分布関数を実装する場合,それが正しく実装されているかをチェックするには, ks.test
を使えば良いでしょう[B]。
ところが少し落とし穴があります。 R はベクトル計算を基本としており,ある関数は,ユーザーが定義した関数がベクトル化されていることを期待する場合があります。多くの場合は何も考えずに実装すれば良いのですが,例えば定数項に積分を含んでいるような場合に困ります。というのは integrate
関数がベクトル化されていないからです。
そこで登場するのが Vectorize
関数です。名前の通り,任意の関数をベクトル化してくれます。
pxxx <- Vectorize(nonvectorizedPxxx)
ベクトル化されているかどうかに起因するエラーはたまに起こって,しかも致命的で気付きづらいものが多い気がします。怪しい結果が帰ってきたらベクトル演算が原因かもしれません。そして Vectorize
という関数があることを思い出してください。