とりあえず Vectorize


R には多種多様な乱数関連の関数があります。 xxx 分布に対して, dxxx は密度関数, pxxx は分布関数, qxxx は quantile 関数といった感じです[A]。これらの関数がすべて提供されている場合は良いのですが,たまに一部が欠損していて,欲しくなる場合があります。大抵 Wikipedia で調べれば関数の形が載っているので実装は難しくありません。

例えば連続型分布で乱数生成関数が用意されている分布に対して分布関数を実装する場合,それが正しく実装されているかをチェックするには, ks.test を使えば良いでしょう[B]

ところが少し落とし穴があります。 R はベクトル計算を基本としており,ある関数は,ユーザーが定義した関数がベクトル化されていることを期待する場合があります。多くの場合は何も考えずに実装すれば良いのですが,例えば定数項に積分を含んでいるような場合に困ります。というのは integrate 関数がベクトル化されていないからです。

そこで登場するのが Vectorize 関数です。名前の通り,任意の関数をベクトル化してくれます。

pxxx <- Vectorize(nonvectorizedPxxx)

ベクトル化されているかどうかに起因するエラーはたまに起こって,しかも致命的で気付きづらいものが多い気がします。怪しい結果が帰ってきたらベクトル演算が原因かもしれません。そして Vectorize という関数があることを思い出してください。

脚注

  1. 関数とは少し違いますが rxxx は乱数生成を行います。 []
  2. 本来は乱数が所望の分布からサンプリングされているかを調べる検定なのですが,簡易的に実装の正しさを調べるには十分だと思います。もっとちゃんと検査したい場合は数値表をどこかから持ってくるのが良いと思います。 []